2012-03-08 2 views
2

Я хотел бы реализовать собственный базовый интегратор Runge-Kutta 4 в Python. Формат должен быть что-то вроде этого:Передача набора функций в качестве аргументов другой функции в 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

FYI вы знаете, что это, вероятно, будет медленным, не так ли? – katrielalex

ответ

2

ОТКАЗ: Python не предназначен для написания такого рода низкоуровневого числового материала. Это, безусловно, хорошо на управление it - 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