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));