matlab使用教程(27)—微分代数方程(DAE)求解

news2024/11/19 19:33:29

1.什么是微分代数方程?

        微分代数方程是一类微分方程,其中一个或多个因变量导数未出现在方程中。方程中出现的未包含其导数的变量称为代数变量,代数变量的存在意味着您不能将这些方程记为显式形式 y ′ = f t , y 。相反,您可以解算下列形式的 DAE:
        • ode15s ode23t 求解器可以使用奇异质量矩阵 M t , y y ′ = f t , y 来解算微分指数为 1 的线性隐式问题,包括以下形式的半显式 DAE
y ′ = f(t , y , z)
0 = g(t , y , z) .
        在此形式中,由于主对角线存在一个或多个零值,因此代数变量的存在会产生奇异质量矩
阵。
        默认情况下,求解器会自动检验质量矩阵的奇异性,以检测 DAE 方程组。如果您提前知道奇异性,则可将 odeset MassSingular 选项设为 'yes' 。对于 DAE,您还可以使用 odeset InitialSlope 属性为求解器提供 y 0 的初始条件估计值。除此之外,还可在调用求解器时指定 y 0 的常用初始条件。
        • ode15i 求解器可解算更通用的完全隐式形式的 DAE
f(t , y , y ′ )= 0 .
        在完全隐式形式下,代数变量的存在会产生奇异 Jacobian 矩阵。这是因为,由于至少有一个变量的导数没有出现在方程中,因此矩阵中的对应列必定全部为零值。
        ode15i 求解器要求您同时为 y 0 y 0 指定初始条件。此外,与其他 ODE 求解器不同, ode15i 要求为方程编码的函数能够接受额外输入: odefun(t,y,yp)
        DAE 会产生各种方程组,因为物理守恒定律通常具有类似 x + y + z = 0 这样的形式。如果已在方程中显式定义 x x' y y' ,则此守恒方程无需 z' 表达式便足以解算 z

2.一致的初始条件

        在解算 DAE 时,可以同时为 y 0 y 0 指定初始条件。 ode15i 求解器要求同时将这两个初始条件指定为输入参数。对于 ode15s ode23t 求解器, y 0 的初始条件是可选的(但可使用 odeset InitialSlope选项指定)。这两种情况下,您所指定的初始条件可能与正在尝试解算的方程不相符。彼此冲突的初始条件称为不一致。初始条件的处理因求解器而异:
        • ode15s ode23t - 如果您没有为 y 0 指定初始值,则求解器会自动基于您为 y 0 提供的初始条件计算一致的初始条件。如果您为 y 0 指定了不一致的初始条件,则求解器会将这些值作为估计值进行处理,尝试计算接近估计值的一致值,并继续解算该问题。
        • ode15i - 您为求解器提供的初始条件必须一致,并且 ode15i 不会检查所提供的值的一致性。辅助函数 decic 可计算满足这一要求的一致初始条件。

3.微分指数

        DAE 的特征是其作为奇异性度量的微分指数。通过对方程进行微分,可以消除代数变量,并且如果执行此操作的次数足够多,这些方程将呈现为显式 ODE 方程组。DAE 方程组的微分指数是为了将方程组表示为等效的显式 ODE 方程组必须执行的求导次数。因此,ODE 的微分指数为 0。
        微分指数为 1 的 DAE 示例如下
y(t) = k(t) .
        对于此方程,只需执行一次求导便可获得显式 ODE 形式
y ′ = k ′( t)  .
        微分指数为 2 的 DAE 示例如下
y 1 = y 2
0 = k(t)  y 1 .
        这些方程要求进行两次求导才能重写为显式 ODE 形式
y 1 = k ′ ( t)
y 2 = k ′′ ( t)  .
        ode15sode23t 求解器仅可解算微分指数为 1 的 DAE。如果您的方程微分指数为 2 或更高,则需要将方程重写为微分指数为 1 的等效 DAE 方程组。您可随时对 DAE 方程组求导并将其重写为微分指数为 1 的等效 DAE 方程组。请注意,如果您将代数方程替换为其导数,则可能已删除某些约束。如果这些方程不再包含原始约束,则数值解可能发生漂移。

4.施加非负性

        odeset 的大多数选项与 DAE 求解器 ode15s ode23t ode15i 一起使用时能按预期工 作。然而,一个明显的例外是使用 NonNegative (第 11-33 页) 选项。 NonNegative 选项不支持应用于具有质量矩阵的问题的隐式求解器( ode15s ode23t ode23tb)。因此,您不能使用此选项对DAE 问题施加非负性约束,DAE 问题一定有奇异质量矩阵。

5.将 Robertson 问题作为半显式微分代数方程 (DAE) 求解

        此示例将 ODE 方程组重新表示为微分代数方程组 (DAE)。hb1ode.m 中的 Robertson 问题是刚性 ODE解算程序的经典测试问题。方程组为:
        hb1ode 将此 ODE 方程组解算为稳定状态,初始条件为有y1=1 、y2=0和y3=0 。但这些方程也满足线性守恒定律,

        在解和初始条件方面,守恒定律为 

        通过使用守恒定律确定y3的状态,该方程组可以重写为 DAE 方程组。这会将问题重新表示为 DAE 方程组  

        此方程组的微分指数为 1,因为只需y3的一个导数就能使其成为 ODE 方程组。因此,在解算该方程组之前,不需要进行更多变换。函数 robertsdae 为此 DAE 方程组编码。将 robertsdae.m 保存在您的当前文件夹中,以运行该示例。
function out = robertsdae(t,y)
out = [-0.04*y(1) + 1e4*y(2).*y(3)
0.04*y(1) - 1e4*y(2).*y(3) - 3e7*y(2).^2
y(1) + y(2) + y(3) - 1 ];
        hb1dae.m 中提供了用这种方法表示 Robertson 问题的完整示例代码。
        使用 ode15s 解算 DAE 方程组。根据守恒定律,显然需要一致的 y0 初始条件。使用 odeset 设置选项:
        • 使用常量质量矩阵表示方程组的左侧。
        • 将相对误差容限设为 1e-4
        • 使用 1e-10 的绝对误差作为第二个解分量,因为标度范围与其他分量相差很大。
        • 将 'MassSingular' 选项保留其默认值 'maybe' ,以测试 DAE 的自动检测。
y0 = [1; 0; 0];
tspan = [0 4*logspace(-6,6)];
M = [1 0 0; 0 1 0; 0 0 0];
options = odeset('Mass',M,'RelTol',1e-4,'AbsTol',[1e-6 1e-10 1e-6]);
[t,y] = ode15s(@robertsdae,tspan,y0,options);
y(:,2) = 1e4*y(:,2);
semilogx(t,y);
ylabel('1e4 * y(:,2)');
title('Robertson DAE problem with a Conservation Law, solved by ODE15S');
        运行结果如下:

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

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

相关文章

详细讲解移植u-boot.2022.10版本移植到开发板基本方法

大家好,我是ST​。​ 今天给大家讲一讲如何将u-boot.2022.10版本移植到imx6ull开发板上。 环境 选项内容编译主机UbuntuLTS 18.04目标板ATK I.MX6ULL(512MB DDR3 8GB EMMC)u-boot版本2022.10交叉编译工具链gcc-linaro-7.5.0-2019.12-i686…

springBoot打印精美logo

文章目录 🐒个人主页🏅JavaEE系列专栏📖前言:🎀文本logo 🐒个人主页 🏅JavaEE系列专栏 📖前言: 本篇博客主要以提供springBoot打印精美logo 🎀文本logo ??…

克努森数与连续介质

1 克努森数的概念 克努森数(Knudsen number)定义为分子平均自由程和空间尺度的比例: 克努森数的取值决定了物理问题的类型及其适用的方程。 各方程对应的克努森数适用范围(图源:researchgate.net) 2 大克努…

嵌入式学习笔记(4)S5PV210的启动过程详解

1.9.1内存 SRAM 特点是容量小,价格高,优点是不需要软件初始化直接上电就能用 DRAM 特点是容量大,价格低,缺点是上电后不能直接使用,需要软件初始化 1.9.2外存 NorFlash:特点是容量小,价格高&am…

为什么劝年轻人不要频繁跳槽?

这是一个让很多年轻人犯愁的问题,尤其是在现如今竞争激烈的职场环境中。许多年轻人因为各种原因选择频繁跳槽,但是在我看来,这并不是一个明智的选择。下面就让我们来看看为什么劝年轻人不要频繁跳槽。 1. 错失成长机会 每一个工作都有其独特…

记一次批量更新mysql数据过程

一、前言 需求背景:mysql数据库中有一个表的数据(600多万)有一个字段的内容需要解密再通过另外一种加密方式进行加密再回存。通过java程序计算完成更新。 二、方案一 一条条计算更新。这里是将手机号解密,在通过另外一种方式回…

港联证券:哪里可以买卖股票?

股票作为一种出资品,已经成为了出资者不可忽视的重要东西。然而,关于新手出资者来说,他们往往不知道哪里能够生意股票。本文将从多个视点剖析,介绍股票市场的基本知识、股票生意的方法以及购买股票需求留意的事项。 一、股票市场的…

(三)行为模式:6、备忘录模式(Memento Pattern)(C++示例)

目录 1、备忘录模式(Memento Pattern)含义 2、备忘录模式的UML图学习 3、备忘录模式的应用场景 4、备忘录模式的优缺点 (1)优点: (2)缺点 5、C实现备忘录模式的实例 1、备忘录模式&#…

实战教程:如何自己搭建一个小程序商城?

如今,随着移动互联网的发展,电子商务已经成为人们购物的主要方式之一。而商城小程序的出现,更是方便了商家进行线上销售和推广。本文将为大家详细介绍如何搭建一个商城小程序,让你从小白变为专家。 首先,我们需要登录乔…

Linux内核源码分析 (3)调度器的实现

Linux内核源码分析 (3)调度器的实现 文章目录 Linux内核源码分析 (3)调度器的实现一、概述二、调度器数据结构1、task_struct中与调度有关的的成员2、调度器类3、就绪队列4、调度实体 三、处理优先级1、优先级的内核表示2、计算优先级3、计算负荷权重 四、核心调度器1、周期性调…

工作的记录

request.getServletPath(),request.getContextPath()的区别 request.getSession().getServletContext().getRealPath("/"); request.getServletPath(),request.getContextPath()的区别_中森明菜的博客-CSDN博客 spring中 getBeansOfType 灵…

可拖动表格

支持行拖动&#xff0c;列拖动 插件&#xff1a;sortablejs UI: elementUI <template><div><hr style"margin: 30px 0;"><div><!-- 数据里面要有主键id&#xff0c; 否则拖拽异常 --><h2 style"margin-bottom: 30px&qu…

【大山里的女孩】

我生来就是高山而非溪流&#xff0c;我欲于群峰之巅仰视平庸的沟壑。 这是她们的呐喊&#xff01; “我不知道我还有多少时间&#xff0c;现在还能动&#xff0c;我想做点事。” 这是张桂梅平凡的宣言&#xff0c;也是她一生都在践行的梦想。 17岁的她&#xff0c;为了祖国建…

Python-matplotlib画图时标题中的指数表示

1.示例 2.核心代码 # 修改横轴的刻度 # 生成刻度的位置和标签 total_steps 1000000 # 总共100万步 num_segments 10 # 分成10段 segment_length total_steps // num_segments # 每段的步数# 生成刻度的位置 custom_ticks np.arange(0, total_steps 1, segment_length…

基于孪生神经网络Siamese开发构建牛脸识别分析系统

关于牛脸识别相关的项目开发实践&#xff0c;在我前面的一篇文章中已经有非常详细的实践记录了&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a;《助力养殖行业数字化转型&#xff0c;基于深度学习模型开发构建牛脸识别系统》 在我们以往接触到的项目或者是业务场景中…

L1-044 稳赢(Python实现) 测试点全过

题目 大家应该都会玩“锤子剪刀布”的游戏&#xff1a;两人同时给出手势&#xff0c;胜负规则如图所示&#xff1a; 现要求你编写一个稳赢不输的程序&#xff0c;根据对方的出招&#xff0c;给出对应的赢招。但是&#xff01;为了不让对方输得太惨&#xff0c;你需要每隔K次就…

小红书运营 变现方法总结

大家好&#xff0c;我是网媒智星&#xff0c;今天跟大家分享一下小红书如何变现的方法。介绍四个赛道和玩法给大家参考。 想在小红书成为博主的同学们要牢记一句话&#xff1a;赛道的选择比流量更重要。方向错误&#xff0c;再怎么努力也是徒劳。小红书是近几年最值得投资的平台…

JUC并发编程--------基础篇

一、多线程的相关知识 栈与栈帧 我们都知道 JVM 中由堆、栈、方法区所组成&#xff0c;其中栈内存是给谁用的呢&#xff1f;其实就是线程&#xff0c;每个线程启动后&#xff0c;虚拟 机就会为其分配一块栈内存。 每个栈由多个栈帧&#xff08;Frame&#xff09;组成&#xf…

Linux 常用命令 2

Linux 常用命令 2 1、组和权限管理1.1、ls 指令1.2、chown 指令1.3、chgrp 指令1.4、chmod 指令1.5、chown 指令1.6、chgrp 指令 2、crond 任务调度2.1、crontab2.2、时间格式2.3、脚本无法执行问题2.4、案例 3、进程管理3.1、ps 指令3.2、kill 和 killall 指令3.3、pstree 指令…

《开发实战》12 | 异常处理:别让自己在出问题的时候变为瞎子

12 | 异常处理&#xff1a;别让自己在出问题的时候变为瞎子 捕获和处理异常容易犯的错 “统一异常处理”方式正是我要说的第一个错&#xff1a;不在业务代码层面考虑异常处理&#xff0c;仅在框架层面粗犷捕获和处理异常。为了理解错在何处&#xff0c;先看看大多数业务应用都…