如果函数是 "periodic",如何绘制 DE 系统?

How to plot DE system if functions are "periodic"?

我用的是Lotka–Volterra捕食者–猎物模型,所以我有两个DE的系统,他们的解是"periodic"函数。我的代码如下。

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

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

开始
sol_sys := dsolve({de_sysset, x(0) = 6, y(0) = 6}, {x(t), y(t)}, numeric):

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

我还注意到,对于较大的 t 间隔(例如,t=4000),DEplot 变为 "meshy",并且它的右上角更多 "meshy",并且更平滑左下方。我想知道是什么原因造成的。

您可以使用 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]});

我更喜欢使用 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]);

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

现在,使用 plots:-odeplot

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

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

您还可以使用 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)
);

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

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

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

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

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

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