Этот пример показывает, как использовать ddensd
, чтобы решить нейтральный DDE (дифференциальное уравнение с запаздывающим аргументом), где задержки появляются в производных терминах. Проблема была первоначально представлена Полом [1].
Уравнение
.
Функция истории для .
Поскольку уравнение имеет задержки a назовите, уравнение называется нейтральным 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] Пол, C.A.H. “Набор тестов функциональных дифференциальных уравнений”. Числовые аналитические отчеты. № 243. Манчестер, Великобритания: математический отдел, Манчестерский университет, 1994.
dde23
| ddensd
| ddesd
| deval