В этом примере показано, как использовать ddensd
решить нейтральный DDE (дифференциальное уравнение задержки), где задержки появляются в производных терминах. Изначально задача была представлена Павлом [1].
Уравнение
.
Функция истории является для .
Поскольку уравнение имеет временные задержки в термин, уравнение называется нейтральным DDE. Если задержки присутствуют только в тогда уравнение будет постоянным или зависящим от состояния DDE, в зависимости от формы, которую имеют задержки по времени.
Чтобы решить это уравнение в MATLAB, необходимо кодировать уравнение, задержки и историю перед вызовом решателя для дифференциальных уравнений с задержкой ddensd
. Можно либо включить их в качестве локальных функций в конце файла (как это сделано здесь), либо сохранить как отдельные файлы в директории по пути MATLAB.
Во-первых, запишите функции, чтобы задать задержки в уравнении. Первый член уравнения с задержкой .
function dy = dely(t,y) dy = t/2; end
Другой член уравнения с задержкой является .
function dyp = delyp(t,y) dyp = t-pi; end
В этом примере только одна задержка для и одну задержку для присутствуют. Если задержек было больше, то можно добавить их в эти же файлы функции, чтобы функции возвращали векторы вместо скаляров.
Примечание.Все функции включены в качестве локальных функций в конце примера.
Теперь создайте функцию, чтобы кодировать уравнение. Эта функция должна иметь подпись 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. Manchester, UK: Math Department, University of Manchester, 1994.
dde23
| ddensd
| ddesd
| deval