我正在玩数值积分方法,并希望有一个函数
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])
非常感谢您的帮助!
答案 0 :(得分:1)
您是否考虑过使用variable number of input arguments 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 );
答案 1 :(得分: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 principle。
我所谈论的这种责任转移是通过我上面给出的简单例子来实现的。请查看如何使用ode45
获取更多详细信息,或this page关于此事项的MATLAB文档经常引用的内容。