【发布时间】:2021-08-12 16:40:36
【问题描述】:
对于一个项目,我需要模拟阴极射线管中的电子并绘制电子曲线。
电子以 x 方向的速度从 v_x = sqrt(2U_Be/m_e) 离开阳极 在 y 方向上,速度等于 0。 当电子进入电容器极板时,y 方向有一个加速度:ay = U_Ae/dm_e
The experiment is looking like this
为从 x=-l_r 到 x=s+l_r 的轨迹编写 ODE 函数 到目前为止,我的代码看起来像这样。 我做错了什么?
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
def trajectory(t,y,d,e,m_e,U_A,U_B,l_r=10,s=5):
# y[0] - x-position
# y[1] - x-velocity
# y[2] - y-position
# y[3] - y-velocity
while -l_r<y[0]<0:
d2xdt2 = 0
d2dyt2 = 0
dxdt = np.sqrt(2*U_B*e/m_e)
dydt=0
return dxdt, d2xdt2, dydt, d2ydt2
if 0<y[0]<s:
d2xdt2 = 0
dxdt = np.sqrt(2*U_B*e/m_e)
d2ydt2 = U_A*e/(d*m_e)
dxdt = np.sqrt(2*U_B*e/m_e)
dydt = y[0]/(np.sqrt(2*d*m_e/(U_A*e)*y[2]))
return dxdt, d2xdt2, dydt, d2ydt2
if s<y[0]<l_s:
d2xdt2 = 0
d2ydt2 = 0
dxdt = np.sqrt(2*U_B*e/m_e)
dydt=0
return dxdt, d2xdt2, dydt, d2ydt2
def hit_screen(t,y, *args):
return y[1]
hit_screen.terminal = True
hit_screen.direction = -1
#Konstanten definieren
U_A = 100
U_B = 300
l_r = l_s = 10
d = 0.5
m_e = 9.1*20**(-31)
e=1.602*10**(-19)
# inputparameter
x0 = -l_r
y0 = 0
v0 = np.sqrt(2*U_B*e/m_e)
v0_y = 0
start_vec=[x0,v0,y0,v0_y]
tspan = [0, 20]
sol = solve_ivp(trajectory,tspan,start_vec,args=(e,m_e,U_A,U_B,l_r),events=(hit_screen))
t = sol.t
x = sol.y[0,:]
v_x = sol.y[1,:]
y = sol.y[2,:]
plt.plot(x,y)
【问题讨论】:
-
难道你不能直接解决 ode 并编写确切的函数并明确计算事件的时间吗?