2016-04-24 66 views
0

是否有可能採用scipy ODE集成商的單一步驟?我知道step參數爲scipy.integrate.ode.integrate,但我不知道如何設置t這個參數,以保證它完全採用一個完整的步驟。最明顯的選擇是t=inf,而是給出了一個ODE失敗::以單一ODE步驟

from scipy.integrate import ode 
obj = ode(lambda t, y: -y) 
obj.set_initial_value(1) 
y_new = obj.integrate(inf, step=True) 

-

DVODE-- At T (=R1) and step size H (=R2), the  
     corrector convergence failed repeatedly  
     or with abs(H) = HMIN 
     In above, R1 = 0.0000000000000D+00 R2 =    Infinity 
C:\Anaconda3\lib\site-packages\scipy\integrate\_ode.py:869: UserWarning: 
vode: Repeated convergence failures. (Perhaps bad Jacobian supplied or 
wrong choice of MF or tolerances.) 
    'Unexpected istate=%s' % istate)) 

如果我使用t=0,那麼ODE根本不會前進。我可以選擇一個有限的正數,但是如果t小於完整的步長,那麼這是保證完整步驟並跨過t?我正在寫一個普通圖書館,不知道典型的步長是多少。

回答

0

我做了一些測試,並驗證設置step=Truet等於任何正的有限數字將只需要一步。如果t小於下一步,它將跳過t

from scipy.integrate import ode 
obj = ode(lambda t, y: -y) 
obj.set_initial_value(1) 
while obj.t < 1: 
    y_new = obj.integrate(1, step=True) 
print(obj.t) # prints 1.037070648009345 

有一點要注意的是,自適應步長猜測的基礎上t特定餾分的初始步長。選擇一個較小的t會導致它採取較小的第一步。這就是爲什麼inf出現故障,爲什麼沒有值t會導致集成商在第一步中跳過t

0

數字集成商並非真正按照固定步驟進行設計,所以即使可能,也很難通過這種方式實現您的目標。您可以通過最大和最小步長參數來找到一種方法。 但是,如果您想檢查集成商正在執行的操作,或者將某些日誌記錄功能附加到集成器進程中,則可以這樣做:使用set_solout() method

作爲參數傳遞給set_solout()的函數(callable對象)將在每個集成步驟中調用。

+0

我不是在尋找一個固定的步驟。但即使是可變步驟求解器仍然有步驟(傳遞給'set_selout'的函數在每個之後都被調用)。我會嘗試從selout函數返回'-1'來做我想做的事。 – drhagen

+0

是的,這就是我的答案的重點:'set_selout'是你可能想要的,但你的問題是關於用集成器執行一個步驟。 – Cyb3rFly3r

+0

「數值積分器的設計並不是按照固定步驟設計的」 - 它取決於方法。例如,明確的[Runge-Kutta](https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods)使用固定步長。 – dkv