为什么是1 /r21/r2力定律给出螺旋轨迹?

计算科学 Python 计算物理学
2021-12-07 20:34:04

我已经编写了一个程序来解决牛顿第二运动定律在二维极坐标中给定的力定律。众所周知,如果力定律的形式为k/r2,我们得到圆锥截面作为解决方案(https://en.wikipedia.org/wiki/Kepler_problem)。

但是当我运行程序时,我得到一个螺旋轨迹(它不是圆锥曲线之一)。

分量方向,牛顿第二定律的中心力F(r)=k/r2(和单位质量)是-

d2rdt2=k/r2
d2θdt2=0
其中第一个方程是径向部分,第二个方程是角部分(由于角动量守恒,中心力问题消失)。

程序中要使用的方程是一组 4 个耦合的一阶 ODE,从上述二阶 ODE 导出。(因为 odeint 不能直接处理二阶 ODE)。我在程序中使用的方程是——

dr/dt=vr
dvr/dt=k/r2
dθ/dt=vθ
dvθ/dt=0
k=1为简单起见。

我尝试了许多可能的初始条件,并尝试运行不同的值k确保。为什么会这样?这是因为初始条件的选择还是一些错误的实现或一些数值问题?还是他们的物理问题?

下面是我的最小代码

def vec(w, t):
    r, vr, theta, vtheta = w
    return [vr, r**(-2.0), vtheta, 0]

def newton(vec, initial, t):
    wsol = odeint(vec, initial, t)
    return [wsol[:, 0], wsol[:, 2]]

T = np.linspace(0, 50, 1000)    
initial = [2, 10, radians(0),2] #The order is radius, radial velocity, angle, angular velocity
R = newton(vec, initial, T)[0]
Theta = newton(vec, initial, T)[1]
plt.polar(Theta, R, "r", lw="1")
plt.show()
1个回答

极坐标中正确的动力学方程应该是

vr˙=ω2rα/r2ω˙=2vrω/rθ˙=ωr˙=vr

这是固定的Python代码:

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


def vec(w,t):
    r,vr,theta,omega=w
    return [vr, r*omega**2 - 1e0/r**2, omega, -2*vr*omega/r]

def newton(vec,initial,t):
    wsol=odeint(vec,initial,t)
    return [wsol[:,0],wsol[:,1],wsol[:,2],wsol[:,3]]

t=np.linspace(0,4,1121)
#The order is radius,radial velocity,angle,angular velocity.
initial=[0.5, -1e0, radians(0), 1e0] 

r=newton(vec,initial,t)[0]
vr=newton(vec,initial,t)[1]
theta=newton(vec,initial,t)[2]
omega=newton(vec,initial,t)[3]

plt.polar(theta,r, "r", lw="1")
plt.show()

这是输出:

在此处输入图像描述