Python 将重力建模为二阶常微分方程是否正确?

Python 将重力建模为二阶常微分方程是否正确?,python,physics,ode,Python,Physics,Ode,这是我在这里的第一个问题,如果格式设置被关闭,我深表歉意 我想用Python将牛顿的万有引力定律建模为一个二阶微分方程,但生成的图没有意义。供参考,以及[结果如下][2]。这是我的密码 import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt # dy/dt def model(r, t): g = 6.67408 * (10 ** -11) m = 5.972 * 10 **

这是我在这里的第一个问题,如果格式设置被关闭,我深表歉意

我想用Python将牛顿的万有引力定律建模为一个二阶微分方程,但生成的图没有意义。供参考,以及[结果如下][2]。这是我的密码

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt


# dy/dt

def model(r, t):
g = 6.67408 * (10 ** -11)
m = 5.972 * 10 ** 24
M = 1.989 * 10 ** 30
return -m * r[1] + ((-g * M * m) / r ** 2)


r0 = [(1.495979 * 10 ** 16), 299195800]

t = np.linspace(-(2 * 10 ** 17), (2 * 10 ** 17))
r = odeint(model, r0, t)

plt.plot(t, r)
plt.xlabel('time')
plt.ylabel('r(t)')
plt.show()
我用它作为代码的基础
我几乎没有使用Python作为ODE解算器的经验。我做错了什么?谢谢大家!

要集成二阶常微分方程,需要将其视为两个一阶常微分方程。在你发布的链接中,所有的例子都是二等的,它们都是这样做的

 m d^2 r/ dt^2 = - g M m / r^2
r = u[0]
dr / dt = u[1]

(1) d/dt(u[0]) = u[1]
m * d/dt(u[1]) = -g M m / u[0]^2 =>
(2) d/dt(u[1]) = -g M / u[0]^2

在python中,这看起来像

将numpy导入为np
从scipy.integrate导入odeint
将matplotlib.pyplot作为plt导入
def型号(u,t):
g=6.67408*(10**-11)
M=1.989*10**30
返回值(u[1],(-g*M)/(u[0]**2))
r0=[(1.495979*10**16),299195800]
t=np.linspace(0,5*(10**15),500000)
r_t=odeint(模型,r0,t)
r_t=r_t[:,0]
plt.绘图(t,r\t)
plt.xlabel(“时间”)
plt.ylabel('r(t)'
plt.show()
我还对你的时间表做了一些更改。我得到的图表看起来是这样的

这对我来说很有意义。你有一个质量从一个大质量中逃逸出来,但是在一个难以置信的起始距离和速度下,所以r(t)在时间上应该是线性的。 然后我把299195800的速度降到0,结果是


oopsie doopsie,结果没有公布……基本上,图表看起来并不正确,
r**2
@nobbynobs我这样做了,但没有任何改变。此外,此错误还会出现“ODEintWarning:此调用完成的工作量过多(可能是错误的Dfun类型)。请使用full_output=1运行以获取定量信息。warning.warning(warning_msg,ODEintWarning)”您丢失了一些链接,方程式和绘图不再存在。您需要再次检查符号。这可能会让人困惑,但在重力中,公式中既有半径也有位置,你在这里用错误的方式混合了它们。线性项从何而来?另外,检查力和加速度的差异。非常感谢你,这太棒了!!!还有,酷用户名:P