Как построить систему DE, если функции являются «периодическими»? - PullRequest
0 голосов
/ 15 декабря 2018

Я использую модель «хищник – жертва» Лотки – Вольтерры, поэтому у меня есть система двух ЭД, и их решение - это «периодические» функции.Мой код указан ниже.

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

График DE правильный, поэтому я хочу нанести 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 становится «мешающим», и это больше »сетчатый в правом верхнем углу и более гладкий в левом нижнем.Интересно, что вызывает это. enter image description here

1 Ответ

0 голосов
/ 16 декабря 2018

Вы можете сделать такие графики, используя 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]});

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) илиу (т).Это может быть не так эффективно, и построение графика не адаптивно, поэтому большее значение 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

Byувеличив число вычисленных точек, мы можем вернуться к более гладкой кривой для большей конечной точки.

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

...