我使用Lotka–Volterra捕食者–猎物模型,所以我有两个DE的系统,它们的解决方案是“定期”函数。我的代码如下。
error_log("Login Success...")
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变为“混乱”,其右上角更加“混乱”,而在左下角更加平滑。我不知道是什么原因造成的。
答案 0 :(得分:2)
您可以使用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);