matlab使用教程(34)—求解时滞微分方程(2)

news2024/12/23 17:32:51

1.具有状态依赖时滞的 DDE

        以下示例说明如何使用 ddesd 对具有状态依赖时滞的 DDE(时滞微分方程)方程组求解。Enright 和Hayashi [1] 将此 DDE 方程组用作测试问题。方程组为:
        方程中的时滞仅出现在 y 项中。时滞仅取决于第二个分量 y 2 t 的状态,因此这些方程构成状态依赖时滞方程组。
        要在 MATLAB® 中求解此方程组,您需要先编写方程组、时滞和历史解的代码,然后再调用时滞微分方程求解器 ddesd,该求解器适用于具有状态依赖时滞的方程组。您可以将所需的函数作为局部函数包含在文件末尾(如本处所示),或者将它们作为单独的命名文件保存在 MATLAB 路径上的目录中。

1.1编写时滞代码

function d = dely(t,y)
d = exp(1 - y(2));
end

1.2编写方程代码

现在,创建一个函数来编写方程的代码。此函数应具有签名 dydt = ddefun(t,y,Z) ,其中:
function dydt = ddefun(t,y,Z)
dydt = [y(2);
 -Z(2,1)*y(2)^2*exp(1 - y(2))];
end

1.3编写历史解代码

        接下来,创建一个函数来定义历史解。历史解是时间 t t 0 的解。
function v = history(t) % history function for t < t0
v = [log(t); 
 1./t];
end

1.4求解方程

        最后,定义积分区间并使用 ddesd 求解器对 DDE 求解。
tspan = [0.1 5];
sol = ddesd(@ddefun, @dely, @history, tspan);

1.5对解进行绘图

        解结构体 sol 具有字段 sol.x sol.y,这两个字段包含求解器在这些时间点所用的内部时间步和对应的解。(如果您需要在特定点的解,可以使用 deval 来计算在特定点的解。)使用历史解函数绘制两个解分量对时间的图,以计算积分区间内的解析解来进行比较。
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')

1.6局部函数

        此处列出了 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

2具有不连续性的心血管模型 DDE

        此示例说明如何使用 dde23 对具有不连续导数的心血管模型求解。此示例最初由 Ottesen [1] 提出。方程组为:
        该方程组受外周压的巨大影响,外周压会从 R = 1 . 05 急剧减少到 R = 0 . 84 ,从 t = 600 处开始。因此,该方程组在 t = 600 处的低阶导数具有不连续性。常历史解由以下物理参数定义
        要在 MATLAB® 中求解此方程组,您需要先编写方程组、参数、时滞和历史解的代码,然后再调用时滞微分方程求解器 dde23,该求解器适用于具有常时滞的方程组。您可以将所需的函数作为局部函数包含在文件末尾(如本处所示),或者将它们作为单独的命名文件保存在 MATLAB 路径上的目录中。

2.1定义物理参数

首先,将问题的物理参数定义为结构体中的字段。
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 = 4;

2.2编写方程代码

现在,创建一个函数来编写方程的代码。此函数应具有签名 dydt = ddefun(t,y,Z,p) ,其中:
        求解器自动将前三个输入传递给函数,变量名称决定如何编写方程代码。调用求解器时,参数结构体 p 将传递给函数。在本例中,时滞表示为:
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

2.3编写历史解代码

接下来,创建一个向量来定义三个分量 P a P v H 的常历史解。历史解是时间 t t 0 的解。
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];
2.4 求解方程
        使用 ddeset 来指定在 t = 600 处存在不连续性。最后,定义积分区间 并使用 dde23 求解器对 DDE 求解。使用匿名函数指定 ddefun 以传入参数结构体 p
options = ddeset('Jumps',600);
tspan = [0 1000];
sol = dde23(@(t,y,Z) ddefun(t,y,Z,p), tau, history, tspan, options);

2.4对解进行绘图

        解结构体 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)')

2.5局部函数

        此处列出了 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1571345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日面经分享(Git经典题目,Git入门)

1. GitHub是什么 a. Git是一个分布式版本控制系统&#xff0c;作用是跟踪、管理和协调软件开发项目中的代码更改。 b. 提供了一种有效的方式来管理代码的版本历史&#xff0c;以及多人协作开发的能力。 2. Git的作用有哪些 a. 版本控制&#xff1a;Git可以记录每次代码更改的…

政安晨:【Keras机器学习实践要点】(十六)—— 图像分类从零开始

目录 简介 设置 加载数据&#xff1a;猫与狗数据集 原始数据下载 滤除损坏的图像 生成数据集 将数据可视化 使用图像数据增强 数据标准化 预处理数据的两个选项 配置数据集以提高性能 建立模型 训练模型 对新数据进行推理 政安晨的个人主页&#xff1a;政安晨 欢…

【快捷部署】011_PostgreSQL(16)

&#x1f4e3;【快捷部署系列】011期信息 编号选型版本操作系统部署形式部署模式复检时间011PostgreSQL16Ubuntu 20.04Docker单机2024-03-28 一、快捷部署 #!/bin/bash ################################################################################# # 作者&#xff1…

【二分查找】Leetcode 二分查找

题目解析 二分查找在数组有序可以使用&#xff0c;也可以在数组无序的时候使用&#xff08;只要数组中的一些规律适用于二分即可&#xff09; 704. 二分查找 算法讲解 当left > right的时候&#xff0c;我们循环结束&#xff0c;但是当left和right缩成一个点的时候&#x…

DDR3接口

mig IP核的配置 首先添加mig IP核   然后确认以下工程信息&#xff0c;主要是芯片型号以及编译环境&#xff0c;没什么问题后点击next.   如下图所示&#xff0c;这一页选择"Create Design"&#xff0c;在"Component Name"一栏设置该IP元件的名称&…

Redis数据库——群集(主从、哨兵)

目录 前言 一、主从复制 1.基本原理 2.作用 3.流程 4.搭建主动复制 4.1环境准备 4.2修改主服务器配置 4.3从服务器配置&#xff08;Slave1和Slave2&#xff09; 4.4查看主从复制信息 4.5验证主从复制 二、哨兵模式——Sentinel 1.定义 2.原理 3.作用 4.组成 5.…

59 使用 uqrcodejs 生成二维码

前言 这是一个最近的一个来自于朋友的需求, 然后做了一个 基于 uqrcodejs 来生成 二维码的一个 demo package.json 中增加以依赖 "uqrcodejs": "^4.0.7", 测试用例 <template><div class"hello"><canvas id"qrcode&qu…

代码随想录-算法训练营day02【滑动窗口、螺旋矩阵】

专栏笔记&#xff1a;https://blog.csdn.net/weixin_44949135/category_10335122.html https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG?uc71ed002e4554fee8c262b2a4a4935d8977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II &#xff0c;总结 建议…

[中级]软考_软件设计_计算机组成与体系结构_08_输入输出技术

输入输出技术 前言控制方式考点往年真题 前言 输入输出技术就是IO技术 控制方式 程序控制(查询)方式&#xff1a;分为无条件传送和程序查询方式两种。 方法简单&#xff0c;硬件开销小&#xff0c;但I/O能力不高&#xff0c;严重影响CPU的利用率。 程序中断方式&#xff1…

LeetCode---127双周赛

题目列表 3095. 或值至少 K 的最短子数组 I 3096. 得到更多分数的最少关卡数目 3097. 或值至少为 K 的最短子数组 II 3098. 求出所有子序列的能量和 一、或值至少k的最短子数组I&II 暴力的做法大家都会&#xff0c;这里就不说了&#xff0c;下面我们来看看如何进行优化…

Python云计算技术库之libcloud使用详解

概要 随着云计算技术的发展,越来越多的应用和服务迁移到了云端。然而,不同云服务商的API和接口千差万别,给开发者带来了不小的挑战。Python的libcloud库应运而生,它提供了一个统一的接口,让开发者可以轻松地管理不同云服务商的资源。本文将深入探讨libcloud库的特性、安装…

SecureCRT通过私钥连接跳板机,再连接到目标服务器

文章目录 1. 配置第一个session&#xff08;跳板机&#xff09;2. 设置本地端口3. 设置全局firewall4. 配置第二个session&#xff08;目标服务器&#xff09; 服务器那边给了一个私钥&#xff0c;现在需要通过私钥连接跳板机&#xff0c;再连接到目标服务器上 &#x1f349; …

vue3和vue2项目中如何根据不同的环境配置基地址?

在不同环境下取出的变量的值是不同的, 像这样的变量称为环境变量 为什么要使用环境变量呢? 开发环境生产环境下的接口地址有可能是不一样的&#xff0c;所以我们需要根据环境去配置不同的接口基地址 1、vue2环境变量配置 在根目录创建&#xff1a;.env.development和.env.p…

getc(),putc(),getchar(),putchar()之间的区别

getc&#xff08;&#xff09; putc() 与函数 getchar() putchar()类似&#xff0c;但是不同点在于&#xff1a;你要告诉getc和putc函数使用哪一个文件 1.从标准输入中获取一个字符&#xff1a; ch getchar(); //在处理器上输入字符 2.//从fp指定的文件中获取以一个字符 ch …

全面解析找不到msvcr110.dll,无法继续执行代码的解决方法

MSVCR110.dll的丢失可能导致某些应用程序无法启动。当用户试图打开依赖于该特定版本DLL文件的软件时&#xff0c;可能会遭遇“找不到指定模块”的错误提示&#xff0c;使得程序启动进程戛然而止。这种突如其来的故障不仅打断了用户的正常工作流程&#xff0c;也可能导致重要数据…

分库分表 ——12 种分片算法

目录 前言 分片策略 标准分片策略 行表达式分片策略 复合分片策略 Hint分片策略 不分片策略 分片算法 准备工作 自动分片算法 1、MOD 2、HASH_MOD 3、VOLUME_RANGE 4、BOUNDARY_RANGE 5、AUTO_INTERVAL 标准分片算法 6、INLINE 7、INTERVAL COSID 类型算法 …

004 CSS介绍2

文章目录 css最常用属性link元素进制css颜色表示浏览器的渲染流程(不含js) css最常用属性 font-size 文字大小 color:前景色(文字颜色) background-color:背景色 width:宽度 height:高度 link元素 也可以用来创建站点图标 link元素常见属性 href:指定被链接资源的URL rel:指…

【Linux篇】认识冯诺依曼体系结构

文章目录 一、冯诺依曼体系结构是什么二、冯诺依曼为什么要这么设计&#xff1f;三、内存是怎么提高效率的呢&#xff1f;解释&#xff1a;程序要运行&#xff0c;必须加载到内存四、和QQ好友聊天的时候&#xff0c;数据是怎么流向的&#xff1f; 一、冯诺依曼体系结构是什么 冯…

抖音运营技巧

1、视频时长 抖音的作品是否能够继续被推荐&#xff0c;取决于综合数据&#xff0c;包括完播率、点赞率、评论率、转发率和收藏率等。其中&#xff0c;完播率是最容易控制的因素。对于新号来说&#xff0c;在没有粉丝的初期&#xff0c;发布过长的视频可能会导致无人观看。因此…

vue 打包 插槽 inject reactive draggable 动画 foreach pinia状态管理

在Vue项目中&#xff0c;当涉及到打包、插槽&#xff08;Slots&#xff09;、inject/reactive、draggable、transition、foreach以及pinia时&#xff0c;这些都是Vue框架的不同特性和库&#xff0c;它们各自在Vue应用中有不同的用途。下面我将逐一解释这些概念&#xff0c;并说…