繁体   English   中英

使用事件将外部变量输入方程式

[英]ode using events to input external variable into equations

我试图弄清楚如何将外部变量(随时间变化-激素水平)输入到ode中。 我正在考虑使用事件。 我尝试进行优化(使用内置事件对Matlab中的微分方程进行优化)

为了学习如何使用它们,我尝试在Matlab ode求解器中运行代码:更改状态和指定的时间但是,我做错了。 我想问题出在我的函数myfun上,但是我不知道为什么。

我尝试运行以下命令:

           function ydot=myfun(t,y,a)

           S1 = 2 *a* 2 * y(2)  -  2 * 3 * y(1)*y(1);
           S2 = 3 * y(1)*y(1) + a -  5 * y(2);
           ydot = [S1; S2];
           y_0=[0,0];
           %[t,y]=ode45(@myfun,[0:0.1:Tfinal],y_0);


and run following with nested myfun function:


%function events=events_in_Matlab(a)
       dt=0.01;
       T=0:dt:30;
       y_0=[0 0];
       Y=zeros(length(T),length(y_0));


       %t=0 to t=10, pass parameter a=0 to add to ODEs
       a=0;
       [~,Y(1:10/dt+1,:)]=ode45(@(t,y)myfun(t,y,a),T(1:10/dt+1),y_0);
       %t=10 to t=20, pass parameter a=10 to add to ODEs
       a=10;
       [~,Y(10/dt+1:20/dt+1,:)]=ode45(@(t,y)myfun(t,y,a),T(10/dt+1:20/dt+1),
       Y(10/dt+1,:));
       %t=20 to t=30, pass parameter a=20 to add to ODEs
       a=20;

      [~,Y(20/dt+1:end,:)]=ode45(@(t,y)myfun(t,y,a),T(20/dt+1:end),(20/dt+1,:));

我认为您的代码正确,但是您的微分方程可能不正确。

首先,您的最后一个方程式缺少“ Y”,应该是:

[~,Y(20/dt+1:end,:)]=ode45(@(t,y)myfun(t,y,a),T(20/dt+1:end),Y(20/dt+1,:));

其次,这似乎是一个刚性的微分方程组。 我建议您使用其他求解器,例如ode23s而不是ode45 这样,我设法获得了一个解决方案(由于接近奇异矩阵,出现了很多警告)。

希望对您有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM