如果函数是 "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,numeric
与 output=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);
我用的是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,numeric
与 output=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);