Matlab 向事件函数传递参数时出错

Matlab 向事件函数传递参数时出错,matlab,ode,Matlab,Ode,我有一个名为initial的函数,它接受一个参数funname,并执行一些集成。我想将多个参数传递给events函数。所以我这样做了: odeopt=odeset('RelTol',1e-5,'AbsTol',1e-5,'Events',@(t,y) events(t,y,prm,funname)); fun=str2func(funname); [t,y]=ode15s(fun,[0 3600],z,odeopt,prm); prm是一个结构,funname是一个字符串 这是事件功能: fu

我有一个名为
initial
的函数,它接受一个参数
funname
,并执行一些集成。我想将多个参数传递给events函数。所以我这样做了:

odeopt=odeset('RelTol',1e-5,'AbsTol',1e-5,'Events',@(t,y) events(t,y,prm,funname));
fun=str2func(funname);
[t,y]=ode15s(fun,[0 3600],z,odeopt,prm);
prm
是一个结构,
funname
是一个字符串

这是事件功能:

function [value,isterminal,direction] = events(t,y,prm,funname)

isterminal=1;
direction=0;
v=feval(funname,1,y,prm);
value=~all(v<1e-10);
版本(使用7.6)不会有问题,因为解决此问题的版本是在2006年


有什么想法吗?

因为
prm
是作为
ode15s
中的最后一个参数传递的,它将导致
eventArgs
单元格将值传递给事件句柄。换句话说,这条线

eventValue = feval(eventFcn,t0,y0,eventArgs{:});
他真的在做什么

eventValue = eventFcn(t,y,prm);
因此,如果需要将
prm
作为ODE系统中的额外参数,只需在事件句柄中输入
prm

odeopt=odeset(..., @(t,y,prm) events(t,y,prm,funname));


另外,由于events函数的设计目的是定位通过零的解,因此
值应该是一个双精度值,这样MATLAB的
符号
函数就可以正常工作。

我想,既然您在
ode15s
调用中将
prm
作为一个额外参数传递,
eventArgs
单元格数组具有该值,并且
odeevents
基本上正在执行
事件(t,y,prm)
。我从事件函数中删除了
prm
(在
odeset
中也删除了
但是它仍然给出了相同的错误。如果
事件
句柄定义为
(t,y)
,则从事件函数中删除它并不重要;尝试将句柄更改为
(t,y,prm)
。这有点奏效。新错误:
未定义类型为“logical”的输入参数的函数或方法“sign”
。这可能是由于事件函数的值是逻辑变量所致。将其乘以1或添加0以将
转换为双精度,或使用
double()
odeopt=odeset(..., @(t,y,prm) events(t,y,prm,funname));