颂函数 - solve_ivp -阴极射线管

Ode Function - solve_ivp -Cathode Ray Tube

为了一个项目,我需要模拟阴极射线管中的电子并绘制电子曲线。

电子以 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)

如果您有 x,vx,y,vy 作为输入,则不需要速度计算,它只是从输入复制到输出。您只需要计算加速度或二阶导数。可以首先设置对所有情况都相同的组件。在您的情况下,除了在单个段中,计算的分量为零,这也可以使用三元 if 运算符来简化。

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
    dxdt = y[1]
    dydt = y[3]
    d2xdt2 = 0
    d2ydt2 = U_A*e/(d*m_e)  if 0<y[0]<s  else  0

    return dxdt, d2xdt2, dydt, d2ydt2

hit_screen中,你错误地返回了x速度,你想要的是y坐标y[2]