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