Оптимальный способ решения ОДУ с дискретными значениями - PullRequest
0 голосов
/ 14 апреля 2019

Я хочу решить ODE как y '(x) = f1 (x) * y (x) + f2 (x) * y (x) ^ 3. Дело в том, что я не знаю, что такое аналитическое выражение для f1 (x) и f2 (x), я знаю только дискретные значения в области ODE.

Я должен решать этот ODE каждый раз, когда круто, так как входит в систему уравнений в частных производных, поэтому в каждый момент времени t значения f1 (x) и f2 (x) различны.

Я сделал следующий код для решения этой проблемы (код является идеализацией, поскольку функции f1 и f2 не являются аналитическими). Проблема в том, что полный цикл занимает много времени.

from scipy.integrate import odeint
from scipy.interpolate import interp1d
import numpy as np
import time

start_time = time.time()
xs = np.linspace(0,10,100+1);


def dy_dx(y, x):
    return (y)*f1i(x)+(y**3)*f2i(x)


for t in range(100):
    f1 = xs+(0.01*t)
    f2 = np.sin(xs)*(xs+0.01*t)**2
    f1i = interp1d(xs, f1, kind="cubic", fill_value="extrapolate")
    f2i = interp1d(xs, f2, kind="cubic", fill_value="extrapolate")
    ys = odeint(dy_dx, 1.0, xs)[:, 0]

print("--- %s seconds ---"% (time.time()-start_time)) 

Интересно, есть ли другой, более оптимальный подход? Я видел этот пост интеграция ODE с дискретизированными значениями . Но я не знаю, как это можно применить к моей проблеме и может ли она быть полезной.

Кроме того, я получаю сообщение об ошибке: ODEintWarning: избыточная работа, выполненная для этого вызова (возможно, неправильный тип Dfun). Запустите с full_output = 1, чтобы получить количественную информацию. Возможно, это связано с тем, что я делаю цикл, но выглядит странно.

У вас есть идея? Спасибо.

...