DDE нейтрального типа

В этом примере показано, как использовать ddensd решить нейтральный DDE (дифференциальное уравнение с запаздывающим аргументом), где задержки появляются в производных терминах. Проблема была первоначально представлена Полом [1].

Уравнение

y(t)=1+y(t)-2y(t2)2-y(t-π).

Функция историиy(t)=cos(t) для t0.

Поскольку уравнение имеет задержки a y назовите, уравнение называется нейтральным DDE. Если задержки только присутствуют в y условия, затем уравнение было бы постоянным или DDE состояния зависимым, в зависимости от того, какую форму задержки имеют.

Чтобы решить это уравнение в MATLAB, необходимо закодировать уравнение, задержки и историю прежде, чем вызвать решатель дифференциального уравнения с запаздывающим аргументом ddensd. Вы любой может включать их как локальные функции в конце файла (как сделано здесь) или сохранить их как отдельные файлы в директории на пути MATLAB.

Задержки кода

Во-первых, запишите функции, чтобы задать задержки уравнения. Первый срок в уравнении с задержкой y(t2).

function dy = dely(t,y) 
    dy = t/2;
end

Другой термин в уравнении с задержкой y(t-π).

function dyp = delyp(t,y) 
    dyp = t-pi;
end

В этом примере, только одной задержке y и одна задержка y присутствуют. Если было больше задержек, то можно добавить их в этих тех же файлах функции, так, чтобы функции возвратили векторы вместо скаляров.

Примечание: Все функции включены как локальные функции в конце примера.

Уравнение кода

Теперь создайте функцию, чтобы закодировать уравнение. Эта функция должна иметь подпись yp = ddefun(t,y,ydel,ypdel), где:

  • t время (независимая переменная).

  • y решение (зависимая переменная).

  • ydel содержит задержки y.

  • ypdel содержит задержки y=dydt.

Эти входные параметры автоматически передаются функции решателем, но имена переменных определяют, как вы кодируете уравнение. В этом случае:

  • ydel   y(t2)

  • ypdely(t-π)

function yp = ddefun(t,y,ydel,ypdel) 
    yp = 1 + y - 2*ydel^2 - ypdel;
end

История решения кода

Затем создайте функцию, чтобы задать историю решения. История решения является решением в течение многих времен tt0.

function y = history(t)
    y = cos(t);
end

Решите уравнение

Наконец, задайте интервал интегрирования [t0  tf] и решите DDE с помощью ddensd решатель.

tspan = [0 pi];
sol = ddensd(@ddefun, @dely, @delyp, @history, [0,pi]);

Постройте решение

Структура решения sol имеет поля sol.x и sol.y это содержит внутренние временные шаги, взятые решателем и соответствующими решениями в те времена. Однако можно использовать deval оценивать решение в отдельных моментах.

Оцените решение в 20 равномерно распределенных точках между 0 и pi.

tn = linspace(0,pi,20);
yn = deval(sol,tn);

Постройте расчетное решение и историю против аналитического решения.

th = linspace(-pi,0);
yh = history(th);
ta = linspace(0,pi);
ya = cos(ta);

plot(th,yh,tn,yn,'o',ta,ya)
legend('History','Numerical','Analytical','Location','NorthWest')
xlabel('Time t')
ylabel('Solution y')
title('Example of Paul with 1 Equation and 2 Delay Functions')
axis([-3.5 3.5 -1.5 1.5])

Локальные функции

Перечисленный здесь локальные функции помощника что решатель DDE ddensd вызовы, чтобы вычислить решение. В качестве альтернативы можно сохранить эти функции как их собственные файлы в директории на пути MATLAB.

function yp = ddefun(t,y,ydel,ypdel) % equation being solved
    yp = 1 + y - 2*ydel^2 - ypdel;
end
%-------------------------------------------
function dy = dely(t,y) % delay for y
    dy = t/2;
end
%-------------------------------------------
function dyp = delyp(t,y) % delay for y'
    dyp = t-pi;
end
%-------------------------------------------
function y = history(t) % history function for t < 0
    y = cos(t);
end
%-------------------------------------------

Ссылки

[1] Пол, C.A.H. “Набор тестов функциональных дифференциальных уравнений”. Числовые аналитические отчеты. № 243. Манчестер, Великобритания: математический отдел, Манчестерский университет, 1994.

Смотрите также

| | |

Похожие темы