2012-03-08 171 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

相关问题