2
我想使用scipy.integrate.ode
求解器。我可以將可調用函數f
僅定義爲離散點陣列(因爲它取決於先前迭代的積分結果)。但從文檔看來,集成商希望可調用函數是一個連續函數。我想有些內插需要完成。求解器可以自行處理,還是需要編寫一些插值程序?是否有一些scipy文檔/教程解釋它?帶離散化值的ODE積分
我想使用scipy.integrate.ode
求解器。我可以將可調用函數f
僅定義爲離散點陣列(因爲它取決於先前迭代的積分結果)。但從文檔看來,集成商希望可調用函數是一個連續函數。我想有些內插需要完成。求解器可以自行處理,還是需要編寫一些插值程序?是否有一些scipy文檔/教程解釋它?帶離散化值的ODE積分
是的,可調用需要是一個函數,它返回提供給函數的任何值的導數。如果你有一個函數interp
該做插值,可以定義調用如下:
f = lambda t,y: interp(y, yvalues, fvalues)
如果你的系統是標量,你可以在下面的例子中使用numpy.interp
功能,如:
import numpy
from scipy import integrate
yvalues = numpy.arange(-2,3,0.1)
fvalues = - numpy.sin(yvalues)
f = lambda t,y: numpy.interp(y, yvalues, fvalues)
r = integrate.ode(f)
r.set_initial_value(1)
t1 = 10
dt = 0.1
while r.successful() and r.t < t1:
r.integrate(r.t+dt)
print r.t, r.y
對於多維繫統,插值非常複雜。如果有任何方法可以在給定的點上實時計算導數,那麼實施起來可能比使用插值更容易。
正如unutbu在評論中指出的那樣,如果插值,您將在混沌系統中得到足夠長時間的錯誤解決方案。但是,由於任何數值求解算法都是如此,所以很難對此做任何事情。
所以你的意思是[scipy.integrate.ode](http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.ode.html#scipy.integrate.ode)? – unutbu
例如,如果您的ODE系統混亂,如[Lorenz系統](http://en.wikipedia.org/wiki/Lorenz_system),則插值導數可能會導致嚴重依賴於插值的結果。 – unutbu
是的,我的意思是'scipy.integrate.ode' –