我有一个用例如下:
在F.m
内部,我有一个函数F
,它将2 x 1
矩阵x
作为参数。 F
需要将矩阵kmat
矩阵乘以x
。 kmat
是由脚本生成的变量。
所以,我所做的是将kmat
设置为脚本中的全局:
global kmat;
kmat = rand(2);
在F.m
:
function result = F(x)
global kmat;
result = kmat*x;
end
最后,在我的脚本中(x_0
已被定义为适当的2 x 1
矩阵,tstart
和tend
是正整数):
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
的正确方法是什么?
答案 0 :(得分:1)
首先,处理kmat
的正确方法是使其成为F.m
的输入参数
function result = F(x,kmat)
result = kmat*x;
end
其次,ode45
的输入函数必须是输入t
和x
的函数(可能是向量,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以获取将额外参数传递给函数的不同方法。