В этом примере показано, как использовать dde23
решить сердечно-сосудистую модель, которая имеет прерывистое производное. Пример был первоначально представлен Оттесеном [1].
Система уравнений
Условия для и являются изменениями того же уравнения с временной задержкой и без нее. и представляют среднее артериальное давление с задержкой и без нее, соответственно.
Эта задача имеет ряд физических параметров:
Артериальная податливость
Венозная податливость
Периферийное сопротивление
Сопротивление венозному оттоку
Объем штриха
Типичное среднее артериальное давление
На систему сильно влияет периферийное давление, которое уменьшается экспоненциально кому начиная с . В результате система имеет разрыв в производной низкого порядка .
История постоянных решений определяется в терминах физических параметров
Чтобы решить эту систему уравнений в MATLAB, необходимо кодировать уравнения, параметры, задержки и историю перед вызовом решателя для дифференциальных уравнений с задержкой dde23
, который предназначен для систем с постоянными временными задержками. Можно либо включить необходимые функции в качестве локальных функций в конце файла (как это сделано здесь), либо сохранить их как отдельные, именованные файлы в директории по пути MATLAB.
Во-первых, задайте физические параметры задачи как поля в структуре.
p.ca = 1.55; p.cv = 519; p.R = 1.05; p.r = 0.068; p.Vstr = 67.9; p.alpha0 = 93; p.alphas = 93; p.alphap = 93; p.alphaH = 0.84; p.beta0 = 7; p.betas = 7; p.betap = 7; p.betaH = 1.17; p.gammaH = 0;
Затем создайте переменную tau
для представления постоянной временной задержки в уравнениях для членов .
tau = 4;
Теперь создайте функцию, чтобы кодировать уравнения. Эта функция должна иметь подпись dydt = ddefun(t,y,Z,p)
, где:
t
является временем (независимая переменная).
y
- решение (зависимая переменная).
Z(n,j)
аппроксимирует задержки , где задержка задается как компонент j
от dely(t,y)
.
p
является необязательным четвертым входом, используемым для прохождения в значениях параметров.
Первые три входов автоматически передаются функции решателем, и имена переменных определяют, как вы кодируете уравнения. Структура параметров p
передается в функцию, когда вы вызываете решатель. В этом случае задержки представлены:
Z(:,1)
function dydt = ddefun(t,y,Z,p) if t <= 600 p.R = 1.05; else p.R = 0.21 * exp(600-t) + 0.84; end ylag = Z(:,1); Patau = ylag(1); Paoft = y(1); Pvoft = y(2); Hoft = y(3); dPadt = - (1 / (p.ca * p.R)) * Paoft ... + (1/(p.ca * p.R)) * Pvoft ... + (1/p.ca) * p.Vstr * Hoft; dPvdt = (1 / (p.cv * p.R)) * Paoft... - ( 1 / (p.cv * p.R)... + 1 / (p.cv * p.r) ) * Pvoft; Ts = 1 / ( 1 + (Patau / p.alphas)^p.betas ); Tp = 1 / ( 1 + (p.alphap / Paoft)^p.betap ); dHdt = (p.alphaH * Ts) / (1 + p.gammaH * Tp) ... - p.betaH * Tp; dydt = [dPadt; dPvdt; dHdt]; end
Примечание.Все функции включены в качестве локальных функций в конце примера.
Затем создайте вектор, чтобы задать историю постоянных решений для трех компонентов , , и . История решений является решением для времени .
P0 = 93; Paval = P0; Pvval = (1 / (1 + p.R/p.r)) * P0; Hval = (1 / (p.R * p.Vstr)) * (1 / (1 + p.r/p.R)) * P0; history = [Paval; Pvval; Hval];
Использование ddeset
для определения наличия разрыва в . Наконец, задайте интервал интегрирования и решить DDE используя dde23
решатель. Задайте ddefun
использование анонимной функции для прохождения в структуре параметров, p
.
options = ddeset('Jumps',600);
tspan = [0 1000];
sol = dde23(@(t,y,Z) ddefun(t,y,Z,p), tau, history, tspan, options);
Структура решения sol
имеет поля sol.x
и sol.y
которые содержат внутренние временные шаги, предпринятые решателем, и соответствующие решения в эти моменты времени. (Если вам нужно решение в определенных точках, вы можете использовать deval
для оценки решения в конкретных точках.)
Постройте график компонента третьего решения (частота сердечных сокращений) относительно времени.
plot(sol.x,sol.y(3,:)) title('Heart Rate for Baroreflex-Feedback Mechanism.') xlabel('Time t') ylabel('H(t)')
Здесь перечислены локальные вспомогательные функции, которые решатель DDE dde23
вызывается для вычисления решения. Также можно сохранить эти функции как собственные файлы в директории по пути MATLAB.
function dydt = ddefun(t,y,Z,p) % equation being solved if t <= 600 p.R = 1.05; else p.R = 0.21 * exp(600-t) + 0.84; end ylag = Z(:,1); Patau = ylag(1); Paoft = y(1); Pvoft = y(2); Hoft = y(3); dPadt = - (1 / (p.ca * p.R)) * Paoft ... + (1/(p.ca * p.R)) * Pvoft ... + (1/p.ca) * p.Vstr * Hoft; dPvdt = (1 / (p.cv * p.R)) * Paoft... - ( 1 / (p.cv * p.R)... + 1 / (p.cv * p.r) ) * Pvoft; Ts = 1 / ( 1 + (Patau / p.alphas)^p.betas ); Tp = 1 / ( 1 + (p.alphap / Paoft)^p.betap ); dHdt = (p.alphaH * Ts) / (1 + p.gammaH * Tp) ... - p.betaH * Tp; dydt = [dPadt; dPvdt; dHdt]; end
[1] Оттесен, Дж. Т. «Моделирование механизма Baroreflex-Feedback с задержкой по времени». J. Math. Biol. vol. 36, Number 1, 1997, pp. 41-63.
dde23
| ddensd
| ddesd
| deval