Вы можете сделать такие графики, используя 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) илиу (т).Это может быть не так эффективно, и построение графика не адаптивно, поэтому большее значение 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);
Byувеличив число вычисленных точек, мы можем вернуться к более гладкой кривой для большей конечной точки.
DEplot(de_sys, [x(t), y(t)], t = 0 .. 4000, {[x(0) = 6, y(0) = 6]},
numpoints=4000, thickness=0, linecolor=blue);