Я моделирую заряженные частицы, движущиеся в электромагнитном поле, и использую скипи оду. Код здесь, очевидно, упрощен, но работает как пример. У меня проблема в том, что я хочу завершить интеграцию после ограничения по r, а не по t. Итак, интегрируем dx / dt до точки, где норма (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]))