Я пытаюсь написать очень простое гравитационное моделирование массы, вращающейся вокруг источника.Я использовал scipy.integrate.odeint для интегрирования дифференциальных уравнений.
Проблема в том, что я получаю следующее сообщение об ошибке:
ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.
warnings.warn(warning_msg, ODEintWarning)
А также, что-то явно идет не так -уравнения не интегрируются правильно, а движение неверно.Ниже приведен график движения для начальных условий, которые должны давать круговое движение вокруг начала координат:
Это код:
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
G=1
m=1
def f_grav(y, t):
x1, x2, v1, v2 = y
m = t
dydt = [v1, v2, -x1*G*m/(x1**2+x2**2)**(3/2), -x2*G*m/(x1**2+x2**2)**(3/2)]
return dydt
t = np.linspace(0, 100, 1001)
init = [0, 1, 1, 0]
ans = odeint(f_grav, init, t)
print(ans)
x = []
y = []
for i in range (100):
x.append(ans[i][0])
y.append(ans[i][1])
plt.plot(x, y)
plt.show()
Обратите внимание, что я использовал эту функцию раньше, и написание почти идентичного кода для дифференциального уравнения SHM дает правильные результаты.Изменение чисел в t
не помогает.Кто-нибудь знает, почему это так плохо?