【问题标题】:Using the events locator in Matlab when solving an ODE with multiple output arguments在求解具有多个输出参数的 ODE 时使用 Matlab 中的事件定位器
【发布时间】:2014-06-24 23:30:31
【问题描述】:

我在使用 Matlab 中的事件定位器时遇到问题。我正在查看一个耦合 ODE,它表示两个接口变得不稳定。我解决它没有问题,我要做的就是在每个接口达到一定幅度(10^2)时找到半径(R_2v)。 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;

【问题讨论】:

    标签: matlab ode numerical-integration


    【解决方案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(见下文)将告诉您在R_2AeAe 触发特定事件的AV 的索引1 或2。

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

    您的输出参数太多,所以我删除了多余的参数。我还将您对ode15s 的电话“固定”到pass parameter via the anonymous function,这是多年来首选和最有效的做事方式。不过,相对于你的实际代码,我可能把事情搞砸了,因为你没有提供一个可行的例子。

    【讨论】:

    • 那行得通。我曾尝试过这种性质的东西,但由于某种原因它不起作用。它想要 isterminal = [0,0];大概是因为 Av 有两列。
    • @user3648565:实际上Av 有两个,所以我认为[0;0] 应该可以工作(或[0;1] 等)。我使用这种技巧来捕获一种类型的事件,然后在发生不同的事情时终止集成。这在my answer here 的示例代码中进行了说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多