用Python解决矢量ODE

时间:2018-12-04 00:55:50

标签: python python-3.x vector physics ode

我想感谢谁提前回答了这个问题,因为这可能是一个愚蠢的问题,而且浪费时间。

给定的代码吸收了粒子上的电磁力,并推测了其轨迹,但是我无法弄清楚如何将rk4与向量一起使用。感觉我的功能设置错误。

import numpy as np
import matplotlib.pyplot as plt
from numpy.linalg import inv, det, eig
from numpy.random import randn

def rk4(f, x0, dt):
    tn = 0
    xn = x0

    while True:        
        yield tn,xn

        k1 = dt*f(tn,xn)
        k2 = dt*f(tn+dt/2,xn+k1/2)
        k3 = dt*f(tn+dt/2,xn+k2/2)
        k4 = dt*f(tn+dt,xn+k3)

        xn = xn + (k1+2*k2+2*k3+k4)/6
        tn = tn + dt
#--------------------------------------------------------

def f(t,X):
    x,y,z,xv,yv,zv = X
    v = [xv,yv,zv]
    E = [k*x , k*y , -2*z]
    a = (q/m)*(E+np.cross(v,B))
    Xdot = np.array([v,a])
    return Xdot

q , m , B , k = 1.6e-19, 40, [0,0,1], 10e+4


X0 = np.array([0.001 , 0 , 0.001 , 100 , 0 , 0]) 
solver = rk4(f,X0,10e-7) 

ts = []
Xs = []
for t,X in solver:
    ts.append(t)
    Xs.append(X[0])
    if t > 0.001:
        break


#Xs = np.array(Xs) 
#plt.figure()
#plt.plot(ts,Xs)

Id非常感谢任何提示或提示 我怀疑问题源于iv设置函数的方式,因为一旦尝试通过rk4运行代码,代码就会崩溃。

1 个答案:

答案 0 :(得分:0)

您不能将向量算术应用于简单的python列表,因此首先将列表转换为numpy数组。您需要返回平面向量,而不是矩阵,因此请使用数组串联将这两部分结合起来。

def f(t,X):
    x,y,z,xv,yv,zv = X
    v = np.array([xv,yv,zv])  #  or v = X[3:]
    E = np.array([k*x , k*y , -2*z]) # or E=k*X[:3]; E[2]=-2*X[2]
    a = (q/m)*(E+np.cross(v,B))
    Xdot = np.concatenate([v,a])
    return Xdot

有关最后的更改,请参见Concatenating two one-dimensional NumPy arrays