如果函数是“定期的”,如何绘制DE系统?

时间:2018-12-15 11:48:10

标签: maple

我使用Lotka–Volterra捕食者–猎物模型,所以我有两个DE的系统,它们的解决方案是“定期”函数。我的代码如下。

error_log("Login Success...")

enter image description here

DEplot是正确的,所以我想在同一图上绘制x(t)和y(t)。我开始了

with(DEtools): 
de_sysset := diff(x(t), t) = -.1*x(t)+0.2e-1*x(t)*y(t), diff(y(t), t) = .2*y(t)-0.25e-1*x(t)*y(t); 
de_sys := [de_sysset]; 
DEplot(de_sys, [x(t), y(t)], t = 0 .. 100, {[x(0) = 6, y(0) = 6]});

但是从现在开始我不知道如何处理地块。我所有的绘图尝试都给出了不同的错误。使用(Matlab)Simulink可以得出正确的结果,所以我认为DE系统一切正常。 如何绘制DE系统的解?另外,如果所有解都针对不同的初始条件(例如,我有第二个条件[x(0)= 32,y( 0)= 24])。此外,我对能否以某种方式获得DE的隐式解决方案感兴趣。

我还注意到,对于较大的t间隔(例如sol_sys := dsolve({de_sysset, x(0) = 6, y(0) = 6}, {x(t), y(t)}, numeric): ),DEplot变为“混乱”,其右上角更加“混乱”,而在左下角更加平滑。我不知道是什么原因造成的。enter image description here

1 个答案:

答案 0 :(得分:2)

您可以使用DEtools:-DEplot(通过DE)或使用plots:-odeplot(通过dsolve,numeric传递结果)或使用单独的过程(从结果中提取)来进行这类绘图来自dsolve,numericoutput=listprocedure)。

有关可以与这些命令一起使用的选项的更多信息,请参见帮助页面。

首先,您的原始照片,

restart;
with(DEtools):
de_sysset := diff(x(t), t) = -.1*x(t)+0.2e-1*x(t)*y(t), diff(y(t), t) = .2*y(t)-0.25e-1*x(t)*y(t):
de_sys := [de_sysset]:

DEplot(de_sys, [x(t), y(t)], t = 0 .. 100, {[x(0) = 6, y(0) = 6]});

enter image description here

我更喜欢使用output=listprocedure,并使用2参数eval来分别解决因变量的求解过程。

sol_sys := dsolve({de_sysset, x(0) = 6, y(0) = 6}, {x(t), y(t)}, numeric, output=listprocedure);

        sol_sys := [t = proc(t)  ...  end;, x(t) = proc(t)  ...  end;, 
                     y(t) = proc(t)  ...  end;]

X := eval(x(t), sol_sys);

                X := proc(t)  ...  end;

Y := eval(y(t), sol_sys);

                Y := proc(t)  ...  end;

# parametric form, agreeing with earlier DEplot
plot([X(t), Y(t), t=0..100]);

enter image description here

# separately as functions of t
plot([X(t), Y(t)], t=0..100, color=["Burgundy", "Navy"]);

enter image description here

现在,使用plots:-odeplot

plots:-odeplot(sol_sys, [x(t), y(t)], t=0..100);

enter image description here

plots:-display(
  plots:-odeplot(sol_sys, [t, x(t)], t=0..100, color="Burgundy"),
  plots:-odeplot(sol_sys, [t, y(t)], t=0..100, color="Navy")
);

enter image description here

您还可以使用DEtools[DEplot]来获得x(t)或y(t)的曲线。这可能不那么有效,并且绘制也不具有适应性,因此较大的numpoints值可以帮助使曲线更平滑。

plots:-display(
  DEplot([de_sysset], [x(t), y(t)], t = 0 .. 100,
         scene=[t, x(t)], {[x(0) = 6, y(0) = 6]},
         linecolor="Niagara Burgundy",
         numpoints=100, thickness=1),
  DEplot([de_sysset], [x(t), y(t)], t = 0 .. 100,
         scene=[t, y(t)], {[x(0) = 6, y(0) = 6]},
         linecolor="Niagara Navy",
         numpoints=100, thickness=1)
);

enter image description here

现在,对于多对初始条件,使用一些自定义颜色,

inits := { [x(0) = 6,  y(0) = 6],   [x(0) = 14, y(0) = 14],
           [x(0) = 20, y(0) = 18],  [x(0) = 26, y(0) = 22],
           [x(0) = 32, y(0) = 24] }:

colorlist := [seq(ColorTools:-Color([0,i,1-i]),
                  i=0.1 .. 0.9, 1/nops(inits))]:

DEplot(de_sys, [x(t), y(t)], t = 0 .. 100, inits,
       numpoints=1000, thickness=2, linecolor=colorlist);

enter image description here

请注意,DEplot不会自动调整构成曲线的计算点数。因此,如果您将结束时间设置得很大,那么从默认的计算点数中会得到更多的锯齿曲线。

DEplot(de_sys, [x(t), y(t)], t = 0 .. 4000, {[x(0) = 6, y(0) = 6]},
       thickness=0, linecolor=blue);

enter image description here

通过增加计算点的数量,对于较大的端点,我们可以返回到更平滑的曲线。

DEplot(de_sys, [x(t), y(t)], t = 0 .. 4000, {[x(0) = 6, y(0) = 6]},
       numpoints=4000, thickness=0, linecolor=blue);

enter image description here