[英]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.