我有一个名为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年。
任何想法?
答案 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
函数才能正常工作。