В этом примере показано, как использовать ddensd для решения нейтрального DDE (дифференциального уравнения задержки), где задержки появляются в производных слагаемых. Первоначально эту проблему представил Павел [1].
Уравнение:
2-y ′ (t-δ).
Функция истории (t) t≤0.
Поскольку уравнение имеет временные задержки в ′ слагаемом, уравнение называется нейтральным DDE. Если временные задержки присутствуют только в y терминах, то уравнение будет постоянным или зависящим от состояния DDE, в зависимости от того, какую форму имеют временные задержки.
Чтобы решить это уравнение в MATLAB, необходимо кодировать уравнение, задержки и историю перед вызовом решения дифференциального уравнения задержки ddensd. Их можно либо включить в качестве локальных функций в конце файла (как здесь сделано), либо сохранить в виде отдельных файлов в каталоге по пути MATLAB.
Во-первых, записать функции, чтобы определить задержки в уравнении. Первое слагаемое в уравнении с задержкой равно ).
function dy = dely(t,y) dy = t/2; end
Другой член в уравнении с задержкой - t-δ).
function dyp = delyp(t,y) dyp = t-pi; end
В этом примере присутствует только одна задержка для y и одна задержка для y ′. Если задержки были больше, то их можно добавить в эти же файлы функций, чтобы функции возвращали векторы вместо скаляров.
Примечание.В конце примера все функции включаются как локальные.
Теперь создайте функцию для кодирования уравнения. Эта функция должна иметь подпись yp = ddefun(t,y,ydel,ypdel), где:
t - время (независимая переменная).
y - решение (зависимая переменная).
ydel содержит задержки для .
ypdel содержит задержки для .
Эти входные данные автоматически передаются функции решателем, но имена переменных определяют способ кодирования уравнения. В этом случае:
ydel
ypdel )
function yp = ddefun(t,y,ydel,ypdel) yp = 1 + y - 2*ydel^2 - ypdel; end
Затем создайте функцию для определения истории решения. История решения - это решение для .
function y = history(t) y = cos(t); end
Наконец, определите интервал интеграции и решите 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] Пол, К.А.Х. «Тестовый набор функциональных дифференциальных уравнений». Отчеты числового анализа. № 243. Манчестер, Великобритания: факультет математики, Манчестерский университет, 1994 год.
dde23 | ddensd | ddesd | deval