2013-01-01 61 views
2

我想使用scipy.integrate.ode求解器。我可以將可調用函數f僅定義爲離散點陣列(因爲它取決於先前迭代的積分結果)。但從文檔看來,集成商希望可調用函數是一個連續函數。我想有些內插需要完成。求解器可以自行處理,還是需要編寫一些插值程序?是否有一些scipy文檔/教程解釋它?帶離散化值的ODE積分

+0

所以你的意思是[scipy.integrate.ode](http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.ode.html#scipy.integrate.ode)? – unutbu

+0

例如,如果您的ODE系統混亂,如[Lorenz系統](http://en.wikipedia.org/wiki/Lorenz_system),則插值導數可能會導致嚴重依賴於插值的結果。 – unutbu

+0

是的,我的意思是'scipy.integrate.ode' –

回答

1

是的,可調用需要是一個函數,它返回提供給函數的任何值的導數。如果你有一個函數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在評論中指出的那樣,如果插值,您將在混沌系統中得到足夠長時間的錯誤解決方案。但是,由於任何數值求解算法都是如此,所以很難對此做任何事情。