【问题标题】:MATLAB - tricky ode system with booleanMATLAB - 带有布尔值的棘手 ode 系统
【发布时间】:2013-01-05 15:44:55
【问题描述】:

已编辑:感谢您的支持,现在我终于添加了图片。添加了完整的 m.file,尽管我认为没有必要。代码的关键是。

xp(2)=...-((x(2)>=X2)&(xp(3)>=0)...; 
xp(3)=...-((x(3)>=X3)&(xp(2)>=0))...;

完整代码:

function xp=uzdevums1(t,x)
%parametr values
r1 = 0.1; r2 = 1; r3 = 0.2;
K1=100;K2 = 100; K3 = 100;
X2=25;X3=10;
speedx2 = 0.02; speedx3=0.02;
%ode system
xp=zeros(3,1);
xp(1)=r1*(1-x(1)/(x(2)+x(3)))*x(1);
xp(2)=r2*(1-x(2)/K2)*x(2)-((x(2)>=X2)&(xp(3)>=0)&xp(1)>0)*x(2)*x(1)*speedx2; 
xp(3)=r3*(1-x(3)/K3)*x(3)-((x(3)>=X3)&(xp(2)>=0))*x(3)*x(1)*speedx3;

从外壳: [T,X]=ode45('uzdevums1',[0 60],[10 80 20]); 这个想法是 xp(2) 中的布尔表达式(绿线的导数)应该为真,直到它接近 X2=25,但是 xp(3) 的布尔表达式(红线的导数)应该为假,直到 xp(2) 改变符号。

红线 = x3 没问题.. 随着 xp(2) 的符号变化,布尔表达式现在为真,红线改变方向,但绿线没有这样做......换句话说,x(2) >=X2(这很好)和 xp(3)>=0(我不明白)

也就是说:红线掉了,怎么xp(3)>=0?

在第二张图片中,我添加了 xp(1)>0 并且布尔表达式最终变为 false...但是为什么不作为 xp(3) 更改符号?!

谢谢

【问题讨论】:

  • 等等,我没有看到任何指向您的图片的链接.. 我们如何理解这个问题?
  • 此代码是您的模型方程的一部分吗?如果是这样,那真是个坏主意。通常的求解器不会期望右手边出现不连续的变化。您将需要离散化,但由于间隔取决于您的参数,这将需要更多的东西,如约束和可能的时间转换。不知道你在这里尝试什么。
  • 我想附上图片,但软件没有让我没有足够的积分。
  • 我在求解器方面没有遇到任何问题。ode45 对我来说效果很好。
  • 如果您不能发布图片,您至少可以发布更多代码

标签: matlab boolean derivative


【解决方案1】:

如果我对您的理解正确,您需要帮助的主要是解释为什么声明 xp(3)>=0 评估为 true。

逐步研究您对xp 的计算。

xp=zeros(3,1);
xp(1)=r1*(1-x(1)/(x(2)+x(3)))*x(1);
xp(2)=r2*(1-x(2)/K2)*x(2)-((x(2)>=X2)&(xp(3)>=0)&xp(1)>0)*x(2)*x(1)*speedx2; 
xp(3)=r3*(1-x(3)/K3)*x(3)-((x(3)>=X3)&(xp(2)>=0))*x(3)*x(1)*speedx3;

您在计算xp(2) 时尝试使用xp(3) 的值(反之亦然)。但是xp(3) 在计算 xp(2) 时仍然为零,因此表达式xp(3)>=0 的计算结果总是为真。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2016-12-23
    • 1970-01-01
    • 2020-07-11
    • 2014-09-16
    相关资源
    最近更新 更多