将参数传递给事件函数时出错

时间:2014-11-13 14:41:37

标签: 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是一个字符串。

这是事件功能:

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

isterminal=1;
direction=0;
v=feval(funname,1,y,prm);
value=~all(v<1e-10);

funname基本上就是ode函数。

它仍然说太多输入参数。:

??? Error using ==> initial>@(t,y)events(t,y,prm,funname)
Too many input arguments.

Error in ==> odeevents at 29
  eventValue = feval(eventFcn,t0,y0,eventArgs{:});

Error in ==> ode15s at 263
[haveEventFcn,eventFcn,eventArgs,valt,teout,yeout,ieout] = ...

Error in ==> initial at 10
[t,y]=ode15s(fun,[0 3600],z,odeopt,prm);

不能成为版本问题(使用7.6),因为解决此问题的post是在2006年。

任何想法?

1 个答案:

答案 0 :(得分:1)

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

此外,由于事件函数的设计是为了找到通过零的解决方案,因此value应该是双倍的,这样MATLAB的sign函数才能正常工作。