是否可以在Matlab中将匿名函数用作事件函数。我想做的基本上是
opt = odeset('Events', @(t,y) (deal(y(end)-t^2,1,0)));
[T,Y] = ode45(@odefun,[tstart tend],y0,opt);
但是,这返回一个错误,提示要处理的输出数量必须完全匹配。还有其他方法可以使匿名函数返回多个参数吗?
最佳答案
也(这在游戏中添加到现在很晚了,但这让我感到沮丧)。这是带有嵌套函数的解决方案:
function [ dealfunchandle ] = dealwithit( arrayfunc )
% Takes as input an event function of (t,z) that returns a 3 array (in same order as event syntax).
function [a, b, c] = dealfunc(t,z)
output = arrayfunc(t,z);
a = output(:,1);
b = output(:,2);
c = output(:,3);
end
dealfunchandle = @dealfunc;
end
该函数只需要编写一次(如果您必须使用许多不同的事件函数,该函数就很方便)。可以使用它在代码内生成匿名事件函数,如下所示:
arrayfunc = @(t,y) [y(1), 0, 1];
events = dealwithit(arrayfunc);
opts = odeset('Events', events);
然后按照常规ode45。