2012-03-08 268 views
2

我想在Python中實現我自己的基本Runge-Kutta 4集成器。格式應該是這樣的:將一組函數作爲參數傳遞給Python中的另一個函數

---- EXAMPLE set of equations ---- 
f1 = lambda x: x**2 
f2 = lambda y: y**2 
. 
. 
. 
fn = lambda n: n**2 
f = [f1, f2, f3, ... , fn] 

result = integrate(f, other arguments [e.g. stepsize etc.]) 

---- result should be of format ---- 
result = [result1 result2 result3 ... resultn] 

所以基本上我希望能夠來定義,例如,一組運動的三個方程,並能夠將這些傳遞給函數和訪問它們操縱這些函數內部的方程。這怎麼可能?

理想情況下,我想才達到類似Matlabs ODE45功能的東西,它可以被稱爲舉例如下:

% ---- file 1 ---- % 
function xp=F(t,x) 
xp=zeros(2,1); 
xp(1)=x(2); 
xp(2)=-t*x(1)+exp(t)*x(2)+3*sin(2*t); 

% ---- file 2 ---- % 
[t,x]=ode45(’file 1’,[t0,tf],[x10,x20]); 

% where t0 tf initial and final values of t 
% x10 x20 initial values of x 

注1:
我已經看了源dopri5在SciPy的,但它以C語言實現,而且我的目的遠遠超前。

注2:
讓我知道如果有什麼我上面寫的是不明確的,在所有的,這

+0

僅供參考,你知道這可能會很慢,對吧? – katrielalex 2012-03-08 19:39:30

回答

2

免責聲明:Python是不適合寫這類的低級別數字的東西。 管理它 - numpy是一個模塊,專門用於處理大型數值數據集並對它們進行這樣的計算 - 但實際的數字運算是在低級C或Fortran中以速度完成的。編寫自己的集成器是一個有趣的學習練習,但它不會教你如何正常使用Python。這就是說:


你可以做你想要的東西。

>>> def integrate(fs): 
...  print fs[0](1) 
... 
>>> f1 = lambda x: x**2 
>>> f2 = lambda x: x**3 
>>> 
>>> fs = (f1, f2) 
>>> 
>>> integrate(fs) 
1 

這很有道理,因爲functions are first-class objects in Python

+0

真棒,這確實有效。謝謝!我意識到Python不是爲這樣的任務而製作的,而是作爲一個練習它會做的。在原型設計之後,我可能還會將例程外包。再次感謝! – Ingo 2012-03-11 19:12:51

相關問題