Scipy ода интегрировать до неизвестного предела t, в зависимости от размера решения - PullRequest
0 голосов
/ 26 апреля 2018

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

1 Ответ

0 голосов
/ 26 апреля 2018

Вы можете управлять процессом, шаг за шагом выполняя интеграцию, используя scipy.integrate.ode . Пример:

from scipy.integrate import ode
t_initial = 0
dt = 0.1
t_max = 10
r = ode(RHS).set_initial_value(state0, t_initial).set_f_params(Efield, q, mp)
solution = [state0]
while r.successful() and r.t < t_max:
    new_val = r.integrate(r.t + dt)
    solution.append(new_val)
    if np.linalg.norm((new_val[0], new_val[1], new_val[2])) > 30000:
        break
print(solution)

Обратите внимание, что сигнатура RHS должна быть изменена на def RHS(t, state, Efield, q, mp): для ode, независимая переменная стоит первой, в отличие от odeint.

Выход - это решение, вычисленное с шагом dt независимой переменной, вплоть до момента окончания цикла (либо потому, что достигнут t_max, либо произошел сбой интегратора, либо возникло условие для break ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...