我想感谢谁提前回答了这个问题,因为这可能是一个愚蠢的问题,而且浪费时间。
给定的代码吸收了粒子上的电磁力,并推测了其轨迹,但是我无法弄清楚如何将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运行代码,代码就会崩溃。
答案 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