В этом примере показано, как использовать ddesd
для решения системы DDE (дифференциальные уравнения задержки) с зависящими от состояния задержками. Эта система DDE была использована в качестве тестовой задачи Enright и Hayashi [1].
Система уравнений
Функции истории для являются аналитическими решениями
Задержки в уравнениях присутствуют только в условия. Задержки зависят только от состояния второго компонента таким образом, уравнения образуют систему зависимых от состояния уравнений задержки.
Чтобы решить эту систему уравнений в MATLAB, необходимо кодировать уравнения, задержки и историю перед вызовом решателя для дифференциальных уравнений с задержкой ddesd
, который предназначен для систем с зависящими от состояния задержками. Можно либо включить необходимые функции в качестве локальных функций в конце файла (как это сделано здесь), либо сохранить их как отдельные, именованные файлы в директории по пути MATLAB.
Сначала запишите функцию для определения временных задержек в системе. Единственная задержка, присутствующая в этой системе уравнений, в члене.
function d = dely(t,y) d = exp(1 - y(2)); end
Примечание.Все функции включены в качестве локальных функций в конце примера.
Теперь создайте функцию, чтобы кодировать уравнения. Эта функция должна иметь подпись dydt = ddefun(t,y,Z)
, где:
t
является временем (независимая переменная).
y
- решение (зависимая переменная).
Z(n,j)
аппроксимирует задержки , где задержка задается как компонент j
от dely(t,y)
.
Эти входы автоматически передаются функции решателем, но имена переменных определяют, как вы кодируете уравнения. В этом случае:
Z(2,1)
function dydt = ddefun(t,y,Z) dydt = [y(2); -Z(2,1)*y(2)^2*exp(1 - y(2))]; end
Затем создайте функцию для определения истории решений. История решений является решением для времени .
function v = history(t) % history function for t < t0 v = [log(t); 1./t]; end
Наконец, задайте интервал интегрирования и решить DDE используя ddesd
решатель.
tspan = [0.1 5]; sol = ddesd(@ddefun, @dely, @history, tspan);
Структура решения sol
имеет поля sol.x
и sol.y
которые содержат внутренние временные шаги, предпринятые решателем, и соответствующие решения в эти моменты времени. (Если вам нужно решение в определенных точках, вы можете использовать deval
для оценки решения в конкретных точках.)
Постройте график двух компонентов решения по времени с помощью функции history, чтобы вычислить аналитическое решение в интервале интегрирования для сравнения.
ta = linspace(0.1,5); ya = history(ta); plot(ta,ya,sol.x,sol.y,'o') legend('y_1 exact','y_2 exact','y_1 ddesd','y_2 ddesd') xlabel('Time t') ylabel('Solution y') title('D1 Problem of Enright and Hayashi')
Здесь перечислены локальные вспомогательные функции, которые решатель DDE ddesd
вызывается для вычисления решения. Также можно сохранить эти функции как собственные файлы в директории по пути MATLAB.
function dydt = ddefun(t,y,Z) % equation being solved dydt = [y(2); -Z(2,1).*y(2)^2.*exp(1 - y(2))]; end %------------------------------------------- function d = dely(t,y) % delay for y d = exp(1 - y(2)); end %------------------------------------------- function v = history(t) % history function for t < t0 v = [log(t); 1./t]; end %-------------------------------------------
[1] Энрайт, В.Х. и Х. Хаяси. Оценка численного программного обеспечения для дифференциальных уравнений с запаздывающим аргументом. В Трудах МФИП TC2/WG2.5 рабочая конференция по качеству численного программного обеспечения: оценка и совершенствование. (Р.Ф. Буазверт, ред.). Лондон, Великобритания: Chapman & Hall, Ltd., pp. 179-193.
dde23
| ddensd
| ddesd
| deval