解决具有离散值的ODE的最佳方法

时间:2019-04-14 16:37:46

标签: python ode

我想求解一个y'(x)= f1(x)* y(x)+ f2(x)* y(x)^ 3的ODE。关键是我不知道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 integration with discretized values。但是我不知道如何将其应用于我的问题以及它是否有用。

另外,我收到一条消息错误: ODEintWarning:在此调用上完成了过多的工作(也许是错误的Dfun类型)。以full_output = 1运行以获得定量信息。可能是相关的,因为我正在做一个循环,但是看起来很奇怪。

你有什么主意吗?谢谢。

0 个答案:

没有答案