Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何设置初始条件以获得运动方程的解?_Python_Numpy_Scipy_Ode_Odeint - Fatal编程技术网

Python 如何设置初始条件以获得运动方程的解?

Python 如何设置初始条件以获得运动方程的解?,python,numpy,scipy,ode,odeint,Python,Numpy,Scipy,Ode,Odeint,我想看看静电作用下运动方程的解。下面的脚本有什么错误?这是初始条件下的问题吗?多谢各位 import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint def dr_dt(y, t): """Integration of the governing vector differential equation. d2r_dt2 = -(e**2/

我想看看静电作用下运动方程的解。下面的脚本有什么错误?这是初始条件下的问题吗?多谢各位

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

def dr_dt(y, t):
    """Integration of the governing vector differential equation.
    d2r_dt2 = -(e**2/(4*pi*eps_0*me*r**2)) with d2r_dt2 and r as vecotrs.
    Initial position and velocity are given.
    y[0:2] = position components
    y[3:] = velocity components"""

    e = 1.602e-19 
    me = 9.1e-31
    eps_0 = 8.8541878128e-12
    r = np.sqrt(y[0]**2 + y[1]**2 + y[2]**2)

    dy0 = y[3]
    dy1 = y[4]
    dy2 = y[5]
    dy3 = -e**2/(4 * np.pi * eps_0 * me * (y[0])**2)
    dy4 = -e**2/(4 * np.pi * eps_0 * me * (y[1])**2)
    dy5 = -e**2/(4 * np.pi * eps_0 * me * (y[2])**2)
    return [dy0, dy1, dy2, dy3, dy4, dy5]

t = np.arange(0, 100000, 0.1)
y0 = [10, 0., 0., 0., 1.e3, 0.]
y = odeint(dr_dt, y0, t)
plt.plot(y[:,0], y[:,1])
plt.show()
这是轨迹形状的预期结果:

我应用以下初始条件:

t = np.arange(0, 2000, 0.1)   
y01 = [-200, 400., 0., 1., 0, 0.]                   
y02 = [-200, -400., 0., 1., 0, 0.]
得到这个:


为什么轨迹的形状不同?

是的,你是对的。初始条件似乎是问题所在。您在
dy4
dy5
中被零除,这导致出现
运行时警告:被零除

将启动条件替换为:

y0 = [10, 20., 20., 1., 1.e3, 0]

给出以下输出:

中心力在半径方向上的大小确实为
F=-c/r^2
c=e**2/(4*pi*eps\u 0*me)
。要获得向量值的力,需要将其与远离中心的方向向量相乘。这给出了向量力
F=-c*x/r^3
,其中
r=|x

def dr_dt(y, t):
    """Integration of the governing vector differential equation.
    d2x_dt2 = -(e**2*x/(4*pi*eps_0*me*r**3)) with d2x_dt2 and x as vectors, 
    r is the euclidean length of x.
    Initial position and velocity are given.
    y[:3] = position components
    y[3:] = velocity components"""

    e = 1.602e-19 
    me = 9.1e-31
    eps_0 = 8.8541878128e-12
    x, v = y[:3], y[3:]
    r = sum(x**2)**0.5
    a = -e**2*x/(4 * np.pi * eps_0 * me * r**3)
    return [*v, *a]

t = np.arange(0, 50, 0.1)
y0 = [-120, 40., 0., 4., 0., 0.]
y = odeint(dr_dt, y0, t)
plt.plot(y[:,0], y[:,1])
plt.show()
初始条件
[10,0,0,0,1.e3,0.]
对应于与固定在原点的质子相互作用的电子,该质子从10米外开始,以1000米/秒的速度垂直于半径方向移动。在旧物理学中(你需要一个合适的过滤器来过滤微米大小的粒子),这直观地意味着电子几乎不受阻碍地飞走,在1e5秒后,它将有1e8米的距离,这一代码的结果证实了这一点


至于添加的双曲线摆动图,请注意开普勒定律的圆锥截面参数化如下所示:

r(φ)= R/(1+E*cos(φ-φ_0))
其最小半径
r=r/(1+E)
at
φ=φ0
。所需的渐近线大约位于顺时针移动的
φ=π
φ=-π/4
处。然后将
φ0=3π/8
作为对称轴的角度,将
E=-1/cos(π-φ0)=1/cos(φ0)
作为偏心。要将水平渐近线的高度合并到计算中,请计算
y
坐标,如下所示:

y(φ)=R/E*sin(φ)/(cos(φ-φ0)+cos(φ0))
=R/E*sin(φ/2)/cos(φ/2-φ0)
极限
y(π)=R/(E*sin(φ_0))
当图形集
y(π)=b
时,我们得到
R=E*sin(φ0)*b

远离原点的速度为
r'(-oo)=sqrt(E^2-1)*c/K
,其中
K
为常数或面积定律
r(t)^2*φ'(t)=K
,其中
K^2=r*c
。将其作为初始点处水平方向上的近似初始速度
[x0,y0]=[-3*b,b]

因此,对于
b=200
,这将导致初始条件向量

y0 = [-600.0, 200.0, 0.0, 1.749183465630342, 0.0, 0.0]
积分到
T=4*b
给出了曲线图

上述代码中的初始条件是
b=40
,这会产生类似的图像

使用
b=200
将初始速度乘以
0.4,0.5,…,1.0,1.1


你的方程式有问题。如果只有一个分量为零,那么速度差就不应该爆炸,如果r为零,可能有意义,但不是单个分量。例如,假设你正在解决月球上一个固定质子的问题,并找到一个电子在地球上的运动。这里应该发生的是,dy3,dy4,dy5都非常非常小,但是这些问题表明它取决于你的坐标系,如果你碰巧选择了一个,其中电子靠近同一个轴,因为质子dv是超大的?再次检查你的来源,微分方程中已经有问题了。注意查看位置向量
pos=y[:3]
与其长度
r=sum(pos**2)**0.5之间的差异。如果该方程与电势
1/r
,则力矢量与
pos/r**3
成正比。我正在求解电力的运动方程(公式添加到我的问题中)。请问怎么了?这个公式只计算力的大小,它不包含方向
\hat{r}=\vec{r}/r
。你需要注意什么是标量“半径”
r
,什么是位置向量
\vec{r}
\mathbf{r}
\mathfrak{x}
,无论排版惯例是什么。非常感谢