【发布时间】:2018-04-27 03:43:10
【问题描述】:
我正在对穿过电磁场的带电粒子进行建模,并且正在使用 scipy ode。显然,这里的代码是简化的,但可以作为示例。我遇到的问题是我想在限制 r 而不是 t 之后结束积分。因此,将 dx/dt 积分到 norm(x) > r。
我不想仅仅改变函数以在 r 上积分,但是,因为位置是 t 的函数。我可以对不相关的变量或其他东西进行定积分吗?
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
def RHS(state, t, Efield, q, mp):
ds0 = state[3]
ds1 = state[4]
ds2 = state[5]
ds3 = q/mp * Efield*state[0]
ds4 = q/mp * Efield*state[1]
ds5 = q/mp * Efield*state[2]
r = np.linalg.norm((state[0], state[1], state[2]))
# if r > 30000 then do stop integration.....?
# return the two state derivatives
return [ds0, ds1, ds2, ds3, ds4, ds5]
ts = np.arange(0.0, 10.0, 0.1)
state0 = [1.0, 2.0, 3.0, 0.0, 0.0, 0.0]
Efield=1.0
q=1.0
mp=1.0
stateFinal = odeint(RHS, state0, ts, args=(Efield, q, mp))
print(np.linalg.norm(stateFinal[-1,0:2]))
【问题讨论】:
-
一种变体是在目标函数中搜索符号变化,并采用类似于割线的方法来细化根的时间,如math.stackexchange.com/a/2750364/115115 中所做的那样。一般主题是“事件处理”。
标签: python scipy ode numerical-integration