В этом примере показано, как использовать 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] Оттесен, J. T. “Моделирование Механизма Baroreflex-обратной-связи с Задержкой”. J. Математика. Biol. Издание 36, Номер 1, 1997, стр 41–63.
dde23
| ddensd
| ddesd
| deval