Сердечно-сосудистая модель DDE с разрывами

В этом примере показано, как использовать dde23 решить сердечно-сосудистую модель, которая имеет прерывистое производное. Пример был первоначально представлен Оттесеном [1].

Система уравнений

Pa˙(t)=-1caRPa(t)+1caRPv(t)+1caVstr(Paτ(t))H(t)

P˙v(t)=1cvRPa(t)-(1cvR+1cvr)Pv(t)

H˙(t)=αHTs1+γHTp-βHTp.

Условия для Ts и Tp являются изменениями того же уравнения с временной задержкой и без нее. Paτ и Pa представляют среднее артериальное давление с задержкой и без нее, соответственно.

Ts=11+(Paταs)βs

Tp=11+(Paαp)-βp.

Эта задача имеет ряд физических параметров:

  • Артериальная податливость ca=1.55ml/mmHg

  • Венозная податливость cv=519ml/mmHg

  • Периферийное сопротивление R=1.05(0.84)mmHgs/ml

  • Сопротивление венозному оттоку r=0.068mmHgs/ml

  • Объем штриха Vstr=67.9(77.9)ml

  • Типичное среднее артериальное давление P0=93mmHg

  • α0=αs=αp=93(121)mmHg

  • αH=0.84sec-2

  • β0=βs=βp=7

  • βH=1.17

  • γH=0

На систему сильно влияет периферийное давление, которое уменьшается экспоненциально R=1.05 кому R=0.84 начиная с t=600. В результате система имеет разрыв в производной низкого порядка t=600.

История постоянных решений определяется в терминах физических параметров

Pa=P0,        Pv(t)=11+RrP0,         H(t)=1RVstr11+rRP0.

Чтобы решить эту систему уравнений в 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 для представления постоянной временной задержки τ в уравнениях для членов Paτ(t)=Pa(t-τ).

tau = 4;

Кодовые уравнения

Теперь создайте функцию, чтобы кодировать уравнения. Эта функция должна иметь подпись dydt = ddefun(t,y,Z,p), где:

  • t является временем (независимая переменная).

  • y - решение (зависимая переменная).

  • Z(n,j) аппроксимирует задержки yn(d(j)), где задержка d(j) задается как компонент j от dely(t,y).

  • p является необязательным четвертым входом, используемым для прохождения в значениях параметров.

Первые три входов автоматически передаются функции решателем, и имена переменных определяют, как вы кодируете уравнения. Структура параметров p передается в функцию, когда вы вызываете решатель. В этом случае задержки представлены:

  • Z(:,1)Pa(t-τ)

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 

Примечание.Все функции включены в качестве локальных функций в конце примера.

История решения кода

Затем создайте вектор, чтобы задать историю постоянных решений для трех компонентов Pa, Pv, и H. История решений является решением для времени tt0.

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 для определения наличия разрыва в t=600. Наконец, задайте интервал интегрирования [t0  tf] и решить 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)')

Figure contains an axes. The axes with title Heart Rate for Baroreflex-Feedback Mechanism. contains an object of type line.

Локальные функции

Здесь перечислены локальные вспомогательные функции, которые решатель 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.

См. также

| | |

Похожие темы