如何传递ode45一个带有两个参数的odefun?

时间:2015-04-04 02:27:59

标签: matlab

我有一个用例如下:

F.m内部,我有一个函数F,它将2 x 1矩阵x作为参数。 F需要将矩阵kmat矩阵乘以xkmat是由脚本生成的变量。

所以,我所做的是将kmat设置为脚本中的全局:

global kmat;
kmat = rand(2);

F.m

function result = F(x)
    global kmat;
    result = kmat*x;
end

最后,在我的脚本中(x_0已被定义为适当的2 x 1矩阵,tstarttend是正整数):

xs = ode45(F, [tstart, tend], x_0);

然而,这导致了错误:

Error using F (line 3)
Not enough input arguments.

Error in script (line 12)
xs = ode45(F, [tstart, tend], x_0);

这里发生了什么,我该怎么做才能修复它?或者,将kmat传递给F的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

首先,处理kmat的正确方法是使其成为F.m的输入参数

function result = F(x,kmat)
    result = kmat*x;
end

其次,ode45的输入函数必须是输入tx的函数(可能是向量,t是因变量和x是依赖的)。由于您的F函数没有t作为输入参数,并且您有一个额外的参数kmat,因此在调用ode45时必须创建一个小的匿名函数

ode45(@(t,x) F(x,kmat),[tstart tend],x_0)

如果你的衍生函数是function result=derivative(t,x),那么你就像Erik所说的那样只做ode45(@derivative,[tstart tend],x_0)

答案 1 :(得分:0)

我相信F中的ode45(F,...)应该是一个函数句柄,即@F。此外,您可以查看this page of the MATLAB documentation以获取将额外参数传递给函数的不同方法。