2

我正在玩数值积分方法,并希望有一个函数

myIntegrator(f,fParams)

我将在其中实现数值积分。

由于f可能需要任意数量的参数,我正在寻找一种通用方式让myIntegrator() 接受函数句柄 (@f) 并使用fParams调用它。

为了更好地澄清,我想调用myIntegrator,一次使用以下@g,然后使用@h(只是一些数字函数):

g(x,y)
h(x)

我想知道我是否可以在myIntegrator中使用一行代码来执行:

myIntegrator(f,fParams)
   invoke(f,fParams)
end

并且可以同时为

myIntegrator(@g,[x,y])

myIntegrator(@h,[x])

非常感谢您的帮助!

4

2 回答 2

1

您是否考虑过使用可变数量的输入参数 varargin

function myIntegrator( f, varargin )
%
%
fprintf(1, 'function f got %d arguemnts\n', nargin );
% calling f with its arguments
f( varargin{:} );

varargin有关更多信息,请参阅手册。

现在你可以调用它了

myIntegrator( @g, x, y );

myIntegrator( @h, x );
于 2013-04-04T10:11:24.850 回答
0

我想你正在寻找feval

>> feval(@cos, pi)
ans =
   -1

feval接受任意数量的输入,然后将其作为函数的输入f。此外,feval适用于函数句柄和由字符串定义的函数。

传递参数的一个很好的机制是varargin方法,在对 的调用中进行单元格扩展f,如 Shai 所述。

但是,我建议您忘记这一切并采取另一条路线;匿名函数

[t,y] = myIntegrator(@(t,x) f(a,t,c,x,y), ...)
[t,y] = myIntegrator(@(t,x) g(x,y,z,u,v,t), ...)

积分器(如果您确实指的是 ODE 的求解器;否则,它们被称为正交方法)通常只将时间t和状态变量输入x到您的微分方程中。这也是你在数学上写它的方式。

DE 可能需要的任何其他参数(常量、数据、文件名……)属于集成商的责任;那是调用者的责任。集成商不必了解您的函数的任何细节,也不必拥有或多或少复制 MATLAB 已经内置的东西的机制;它违反了KISS原则

我正在谈论的这种责任转移是通过我上面给出的简单示例完成的。查看如何使用ode45以获取更多详细信息,或有关此问题的 MATLAB 文档经常引用的此页面。

于 2013-04-04T10:00:37.387 回答