在Matlab中求解ODE时,是否可以使用匿名函数作为事件函数

The*_*guy 5 events matlab anonymous-function ode

是否可以在Matlab中使用匿名函数作为事件函数.我想做的基本上是

opt = odeset('Events', @(t,y) (deal(y(end)-t^2,1,0)));
[T,Y] = ode45(@odefun,[tstart tend],y0,opt);
Run Code Online (Sandbox Code Playgroud)

但是,这会返回一个错误,抱怨要处理的输出数量必须完全匹配.有没有其他方法使匿名函数返回多个参数?

小智 0

另外(这在游戏中已经很晚了,但这让我很沮丧)。这是一个带有嵌套函数的解决方案:

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
Run Code Online (Sandbox Code Playgroud)

该函数只需编写一次(如果您必须使用许多不同的事件函数,这会很方便)。这可用于在代码中生成匿名事件函数,如下所示:

arrayfunc = @(t,y) [y(1), 0, 1];
events = dealwithit(arrayfunc);

opts = odeset('Events', events);
Run Code Online (Sandbox Code Playgroud)

然后按照正常方式使用 ode45。