Я пытаюсь найти положение тела, вращающегося вокруг гораздо более массивного тела, используя идеализацию, согласно которой более массивное тело не двигается. Я пытаюсь найти положение в декартовых координатах, используя Рунге-Кутта 4-го порядка в python.
Вот мой код:
dt = .1
t = np.arange(0,10,dt)
vx = np.zeros(len(t))
vy = np.zeros(len(t))
x = np.zeros(len(t))
y = np.zeros(len(t))
vx[0] = 10 #initial x velocity
vy[0] = 10 #initial y velocity
x[0] = 10 #initial x position
y[0] = 0 #initial y position
M = 20
def fx(x,y,t): #x acceleration
return -G*M*x/((x**2+y**2)**(3/2))
def fy(x,y,t): #y acceleration
return -G*M*y/((x**2+y**2)**(3/2))
def rkx(x,y,t,dt): #runge-kutta for x
kx1 = dt * fx(x,y,t)
mx1 = dt * x
kx2 = dt * fx(x + .5*kx1, y + .5*kx1, t + .5*dt)
mx2 = dt * (x + kx1/2)
kx3 = dt * fx(x + .5*kx2, y + .5*kx2, t + .5*dt)
mx3 = dt * (x + kx2/2)
kx4 = dt * fx(x + kx3, y + x3, t + dt)
mx4 = dt * (x + kx3)
return (kx1 + 2*kx2 + 2*kx3 + kx4)/6
return (mx1 + 2*mx2 + 2*mx3 + mx4)/6
def rky(x,y,t,dt): #runge-kutta for y
ky1 = dt * fy(x,y,t)
my1 = dt * y
ky2 = dt * fy(x + .5*ky1, y + .5*ky1, t + .5*dt)
my2 = dt * (y + ky1/2)
ky3 = dt * fy(x + .5*ky2, y + .5*ky2, t + .5*dt)
my3 = dt * (y + ky2/2)
ky4 = dt * fy(x + ky3, y + ky3, t + dt)
my4 = dt * (y + ky3)
return (ky1 + 2*ky2 + 2*ky3 + ky4)/6
return (my1 + 2*my2 + 2*my3 + my4)/6
for n in range(1,len(t)): #solve using RK4 functions
vx[n] = vx[n-1] + fx(x[n-1],y[n-1],t[n-1])*dt
vy[n] = vy[n-1] + fy(x[n-1],y[n-1],t[n-1])*dt
x[n] = x[n-1] + vx[n-1]*dt
y[n] = y[n-1] + vy[n-1]*dt
Первоначально, независимо от того, каким образом я настраивал код, я получал ошибку в моем цикле for: либо «объект типа 'float' не имеет len ()» (я не понимал, на что может ссылаться python с плавающей точкой), или «установка элемента массива с последовательностью» (я тоже не понял, о какой последовательности идет речь). Мне удалось избавиться от ошибок, но мои результаты ошибочны. Я получаю массивы vx и vy из 10, массив x целых чисел от 10 до 109 и массив y целых чисел от 0 до 99.
Я подозреваю, что есть проблемы с fx (x, y, t) и fy (x, y, t) или с тем, как я закодировал функции runge-kutta для работы с fx и fy, потому что я использовал тот же самый runge -kutta код для других функций, и он отлично работает.
Я очень ценю любую помощь в выяснении, почему мой код не работает. Спасибо.
list
илиtuple
. Например, предположим, что вы хотите вернутьa
иb
из своей функцииmyfunc(*args, **kwargs)
, вы можете сделатьreturn (a, b)
. Затем, когда вы вызываетеmyfunc
, вы можете сделатьvalue1, value2 = myfunc(*args, **kwargs)
. Вы можете применить это к функциям `** rkx ** и rky - person eapetcho   schedule 06.12.2018