在解决具有多个输出参数的ODE时,在Matlab中使用事件定位器

时间:2014-06-24 14:46:57

标签: matlab ode numerical-integration

我在Matlab中遇到了事件定位器的问题。我正在寻找一个耦合的ODE,它代表两个不稳定的接口。我没有解决它的问题,我想要做的就是在每个接口达到一定幅度(R_2v)时找到半径(10^2)。 Av是两个列向量的矩阵,它是两个接口振幅的径向(或时间)演变。

报告的问题是'不允许非标量的函数句柄数组;改为使用单元格数组。'

n.b。 2mu_2_0mu_2_fR_gelV都是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;

1 个答案:

答案 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(见下文)将告诉您在AVR_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;您致电ode15spass parameter via the anonymous function,这是多年来首选和最有效的方式。虽然因为你没有提供一个有效的例子,但我可能会把你的实际代码搞砸了。