我在Matlab中遇到了事件定位器的问题。我正在寻找一个耦合的ODE,它代表两个不稳定的接口。我没有解决它的问题,我想要做的就是在每个接口达到一定幅度(R_2v
)时找到半径(10^2
)。 Av
是两个列向量的矩阵,它是两个接口振幅的径向(或时间)演变。
报告的问题是'不允许非标量的函数句柄数组;改为使用单元格数组。'
n.b。 2
,mu_2_0
,mu_2_f
,R_gel
和V
都是funsys
的参数
options = odeset('Events',[@eventsA,@eventsB]);
[R_2v,Av,R_2Ae,Ae,Aie,R_2Be,Be,Bie] = ode15s(@funsys_back_Vg1,[1 R_max],[1;1],options,2,mu_2_0,mu_2_f,R_gel,V);
function [valueA,isterminalA,directionA] = eventsA(R_2v,Av)
valueA = Av(1) - 10^2;
isterminalA = 0;
directionA = 0;
function [valueB,isterminalB,directionB] = eventsB(R_2v,Av)
valueB = Av(2) - 10^2;
isterminalB = 0;
directionB = 0;
答案 0 :(得分:1)
错误很明显:在Matlab中不允许使用函数句柄数组。在某些情况下,您可以使用单元阵列。见this question。我不确定ODE套件函数是否支持单元格数组中单独事件函数的评估(R2013b给我一个错误)。
但是,我不确定你是否需要做你正在做的事情。事件函数可能相当复杂,可以编写以执行许多操作,包括检测多个事件。例如,请参阅this answer of mine。或this one。你应该只能编写一个函数:
function [value,isterminal,direction] = events(R_2v,Av)
value = Av - 10^2;
isterminal = 0;
direction = 0;
然后,您的Aie
(见下文)将告诉您在AV
和R_2Ae
触发特定活动的Ae
索引1或2。< / p>
options = odeset('Events',@events);
fun = @(R_2v,Av)funsys_back_Vg1(R_2v,Av,2,mu_2_0,mu_2_f,R_gel,V);
[R_2v,Av,R_2Ae,Ae,Aie] = ode15s(fun,[1 R_max],[1;1],options);
你有太多的输出参数,所以我删除了额外的参数。我也&#34;修复&#34;您致电ode15s
至pass parameter via the anonymous function,这是多年来首选和最有效的方式。虽然因为你没有提供一个有效的例子,但我可能会把你的实际代码搞砸了。