微分方程的解法(Matlab)

微分方程分为刚性微分方程和非刚性微分方程,在数值解法中的表现和行为特性上存在显著差异。

  • 刚性微分方程(Stiffness Equation)是指其数值分析的解只有在时间间隔很小时才会稳定,只要时间间隔略大,其解就会不稳定。这类方程通常包含多个时间尺度,且至少有一个时间尺度非常小,导致解的变化速率差异很大。
  • 刚性微分方程对数值解法的微小误差非常敏感,传统的显式数值方法(如显式欧拉法)在求解时可能遇到稳定性问题,因为解的变化速率差异大,显式方法可能由于稳定性限制而需要非常小的步长,从而导致计算效率低下。
  • 求解方法:需要使用隐式方法(如隐式欧拉法、后退欧拉法、亚当斯-穆森方法、BDF、SDIRK等)来求解,这些方法对时间步长的大小不那么敏感,能够在保证稳定性的同时允许使用较大的时间步长,从而提高计算效率。

非刚性微分方程 

  • 非刚性微分方程是指那些解的变化速率相对均匀,对数值解法误差不太敏感的系统。这类方程的所有时间尺度都相似,或者时间尺度的差异不大,解在整个时间范围内变化速度相对均匀。
  • 非刚性微分方程可以使用较大的时间步长,并且显式数值方法通常足够稳定和有效。
  • 求解方法:可以使用更广泛的数值方法进行求解,包括显式方法和隐式方法。显式方法(如显式欧拉法)因其简单性和易于实现,在求解非刚性微分方程时常常被采用。

Matlab数值解

非刚性常微分方程的解法

Matlab 的工具箱提供了几个解非刚性常微分方程的功能函数,如 ode45,ode23, ode113,其中 ode45 采用四五阶 RK 方法,是解非刚性常微分方程的首选方法,ode23 采用二三阶 RK 方法,ode113 采用的是多步法,效率一般比 ode45 高 。

 示例:

编写改进的 Euler 方法函数如下: 

function [x,y]=eulerpro(fun,x0,xfinal,y0,n) 
if nargin<5,n=50;end 
h=(xfinal-x0)/n; 
x(1)=x0;y(1)=y0; 
for i=1:n 
    x(i+1)=x(i)+h; 
    y1=y(i)+h*feval(fun,x(i),y(i)); 
    y2=y(i)+h*feval(fun,x(i+1),y1); 
    y(i+1)=(y1+y2)/2; 
end 

需要五个输入参数:fun 是微分方程 f(x,y) 的函数句柄,x0 是初始 x 值,xfinal 是求解区间的终点 x 值,y0 是初始 y 值,n 是将区间 [x0​,xfinal​] 分割成的小区间数(即步数),默认步长为50。函数返回两个数组 x 和 y,分别表示 x 值和对应的 y 值近似解。 

function f=doty(x,y)
f=-2*y+2*x^2+2*x; 

求解:

[x,y]=eulerpro('doty',0,0.5,1,10)

 求得数值解如下:

 ode23,ode45,ode113的使用

Matlab的函数形式是: [t,y]=solver('F',tspan,y0)

这里solver为ode45,ode23,ode113,输入参数 F 是用M文件定义的微分方程。

tspan=[t0,tfinal]是求解区间,y0是初值。

 根据前边写好的函数文件:

[x,y]=ode45('doty',[0,0.5],1)

 即可求出数值解:

或者用句柄函数也可以求出相同的数值解:

clc,clear;
f=@(x,y)-2*y+2*x^2+2*x;
[x,y]=ode45(f,[0,0.5],1)

 刚性常微分方程的解法

Matlab的工具箱提供了几个解刚性常微分方程的功能函数,如ode15s,ode23s, ode23t,ode23tb,这些函数的使用同上述非刚性微分方程的功能函数。

高阶微分方程的解法

用 Matlab 解决此问题的函数形式为 [T,Y]=solver('F',tspan,y0) 这里 solver ode45、ode23、ode113,输入参数 F 是用 M 文件定义的常微分方程组, tspan=[t0 tfinal]是求解区间,y0 是初值列向量。

把一阶方程组写成接受两个参数t y ,返回一个列向量的 M 文件 :

function dy=F(t,y); 
dy=[y(2);y(3);3*y(3)+y(2)*y(1)]; 

求上述常微分方程的数值解:

[T,Y]=ode45('F',[0 1],[0;1;-1])

这里 Y 和时刻 T 是一一对应的,Y(:,1)是初值问题的 解,Y(:,2)是解的导数,Y(:,3)是解的二阶导数。

或者使用句柄函数可得相同结果: 

F=@(t,y)[y(2);y(3);3*y(3)+y(2)*y(1)];
[T,Y]=ode45(F,[0 1],[0;1;-1])

示例:

书写 M 文件:

function dy=vdp1(t,y); 
dy=[y(2);(1-y(1)^2)*y(2)-y(1)]; 

调用 Matlab 函数。对于初值 y(0) = 2, y''(0) = 0 ,解为 :

[T,Y]=ode45('vdp1',[0 20],[2;0])

或使用句柄函数:

F=@(t,y)[y(2);(1-y(1)^2)*y(2)-y(1)];
[T,Y]=ode45(F,[0 20],[2;0])

 将结果可视乎:

plot(T,Y(:,1),'-',T,Y(:,2),'--') 
title('Solution of van der Pol Equation,mu=1'); 
xlabel('time t'); 
ylabel('solution y'); 
legend('y1','y2'); 

 van der Pol 方程, μ =1000 (刚性)

function dy=vdp1000(t,y); 
dy=[y(2);1000*(1-y(1)^2)*y(2)-y(1)];

 得出结果,绘出结果如下:

[t,y]=ode15s('vdp1000',[0 3000],[2;0]); 
subplot(1,2,1)
plot(t,y(:,1),'o') 
title('Solution of van der Pol Equation,mu=1000'); 
xlabel('time t'); 
ylabel('solution y(:,1)');
subplot(1,2,2)
plot(t,y(:,2),'*')
title('Solution of van der Pol Equation,mu=1000'); 
xlabel('time t'); 
ylabel('solution y(:,2)');

 常微分方程的解析解

 在 Matlab 中,符号运算工具箱提供了功能强大的求解常微分方程的符号运算命令 dsolve。常微分方程在 Matlab 中按如下规定重新表达:

符号 D 表示对变量的求导。Dy 表示对变量 y 求一阶导数,当需要求变量的 n 阶导 数时,用 Dn 表示,D4y 表示对变量 y 求 4 阶导数。

无初边值条件的常微分方程的解就是该方程的通解。

其使用格式为:

dsolve('diff_equation')

dsolve(' diff_equation','var')

式中 diff_equation 为待解的常微分方程,第 1 种格式将以变量 t 为自变量进行求解, 第 2 种格式则需定义自变量 var。

syms x y 
diff_equ='x^2+y+(x-2*y)*Dy=0'; 
dsolve(diff_equ,'x')

 求解带有初边值条件的常微分方程的使用格式为: dsolve('diff_equation','condition1,condition2,…','var') 其中 condition1,condition2,… 即为微分方程的初边值条件。

y=dsolve('D3y-D2y=x','y(1)=8,Dy(1)=7,D2y(2)=4','x')

求解常微分方程组的命令格式为:

dsolve('diff_equ1,diff_equ2,…','var')

dsolve('diff_equ1,diff_equ2,…','condition1,condition2,…','var') 

 第 1 种格式用于求解方程组的通解,第 2 种格式可以加上初边值条件,用于具体求解。

clc,clear 
equ1='D2f+3*g=sin(x)'; 
equ2='Dg+Df=cos(x)'; 
[general_f,general_g]=dsolve(equ1,equ2,'x') 
[f,g]=dsolve(equ1,equ2,'Df(2)=0,f(3)=3,g(5)=1','x')

通解:

 

syms t 
a=[2,1,3;0,2,-1;0,0,2]; 
x0=[1;2;1]; 
x=expm(a*t)*x0 

 

clc,clear 
syms t s 
a=[1,0,0;2,1,-2;3,2,1];ft=[0;0;exp(t)*cos(2*t)]; 
x0=[0;1;1]; 
x=expm(a*t)*x0+int(expm(a*(t-s))*subs(ft,s),s,0,t); 
x=simplify(x) 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【BUG】Python3|COPY 指令合并 ts 文件为 mp4 文件时长不对(含三种可执行源代码和解决方法)

文章目录 前言源代码FFmpeg的安装1 下载2 安装 前言 参考&#xff1a; python 合并 ts 视频&#xff08;三种方法&#xff09;使用 FFmpeg 合并多个 ts 视频文件转为 mp4 格式 Windows 平台下&#xff0c;用 Python 合并 ts 文件为 mp4 文件常见的有三种方法&#xff1a; 调用…

项目范围管理-系统架构师(二十九)

1、&#xff08;重点&#xff09;软件设计包括了四个独立又相互联系的活动&#xff0c;高质量的&#xff08;&#xff09;将改善程序结构的模块划分&#xff0c;降低过程复杂度。 A程序设计 B数据设计 C算法设计 D过程设计 解析&#xff1a; 软件设计包含四个&#xff0c;…

博客前端项目学习day01

这里写自定义目录标题 登录创建项目配置环境变量&#xff0c;方便使用登录页面验证码登陆表单 在VScode上写前端&#xff0c;采用vue3。 登录 创建项目 检查node版本 node -v 创建一个新的项目 npm init vitelatest blog-front-admin 中间会弹出询问是否要安装包&#xff0c…

R语言安装devtools包失败过程总结

R语言安装devtools包时&#xff0c;遇到usethis包总是安装失败&#xff0c;现总结如下方法&#xff0c;亲测可有效 一、usethis包及cli包安装问题 首先&#xff0c;Install.packages("usethis")出现如下错误&#xff0c;定位到是这个cli包出现问题 载入需要的程辑包…

Mac和VirtualBox Ubuntu共享文件夹

1、VirtualBox中点击设置->共享文件夹 2、设置共享文件夹路径和名称&#xff08;重点来了&#xff1a;共享文件夹名称&#xff09; 3、保存设置后重启虚拟机&#xff0c;执行下面的命令 sudo mkdir /mnt/share sudo mount -t vboxsf share /mnt/share/ 注&#xff1a;shar…

.快速幂.

按位与&#xff08;Bitwise AND&#xff09;是一种二进制运算&#xff0c;它逐位对两个数的二进制表示进行运算。对于每一位&#xff0c;只有两个相应的位都为1时&#xff0c;结果位才为1&#xff1b;否则&#xff0c;结果位为0。如&#xff1a;十进制9 & 5转化为二进制&am…

基于lstm的股票Volume预测

LSTM&#xff08;Long Short-Term Memory&#xff09;神经网络模型是一种特殊的循环神经网络&#xff08;RNN&#xff09;&#xff0c;它在处理长期依赖关系方面表现出色&#xff0c;尤其适用于时间序列预测、自然语言处理&#xff08;NLP&#xff09;和语音识别等领域。以下是…

酒店管理系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;酒店管理员管理&#xff0c;房间类型管理&#xff0c;房间信息管理&#xff0c;订单信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;房间信息…

智慧校园信息化大平台整体解决方案PPT(75页)

1. 教育信息化政策 教育部印发《教育信息化2.0行动计划》&#xff0c;六部门联合发布《关于推进教育新型基础设施建设构建高质量教育支撑体系的指导意见》&#xff0c;中共中央、国务院印发《中国教育现代化2035》。这些政策文件强调了教育的全面发展、面向人人、终身学习、因…

Linux vim文本编辑器

Vim&#xff08;Vi IMproved&#xff09;是一个高度可配置的文本编辑器&#xff0c;它是Vi编辑器的增强版本&#xff0c;广泛用于程序开发和系统管理。Vim不仅保留了Vi的所有功能&#xff0c;还增加了许多新特性&#xff0c;使其更加强大和灵活。 Vim操作模式 普通模式&#xf…

vue3.0 项目h5,pc端实现扫描二维码 qrcode-reader-vue3

qrcode-reader-vue3 插件简述 qrcode-reader-vue3插件&#xff0c;允许您在不离开浏览器的情况下检测和解码二维码。 &#x1f3a5; 访问设备摄像头并持续扫描传入帧。QrcodeStream&#x1f6ae; 渲染到一个空白区域&#xff0c;您可以在其中拖放要解码的图像。QrcodeDropZon…

大气热力学(8)——热力学图的应用之一

本篇文章源自我在 2021 年暑假自学大气物理相关知识时手写的笔记&#xff0c;现转化为电子版本以作存档。相较于手写笔记&#xff0c;电子版的部分内容有补充和修改。笔记内容大部分为公式的推导过程。 文章目录 8.1 复习斜 T-lnP 图上的几种线8.1.1 等温线和等压线8.1.2 干绝热…

LintCode 629 · 最小生成树【困难 并查集 Java】

题目 题目链接&#xff1a; https://www.lintcode.com/problem/629/ 思路 核心1&#xff1a;对connections进行排序&#xff0c;根据开销升序排序 核心2&#xff1a;并查集&#xff0c;合并集合&#xff0c;记录下合并的边缘 核心3&#xff1a;如果合并完后&#xff0c;集合数…

Java 中的正则表达式

转义字符由反斜杠\x组成&#xff0c;用于实现特殊功能当想取消这些特殊功能时可以在前面加上反斜杠\ 例如在Java中当\出现时是转义字符的一部分&#xff0c;具有特殊意义&#xff0c;前面加一个反斜可以取消其特殊意义&#xff0c;表示1个普通的反斜杠\&#xff0c;\\\\表示2个…

《python程序语言设计》2018版第5章第55题利用turtle黑白棋盘。可读性还是最重要的。

今天是我从2024年2月21日开始第9次做《python程序语言设计》作者梁勇 第5章 从2019年夏天的偶然了解python到2020年第一次碰到第5章第一题。彻底放弃。再到半年后重新从第一章跑到第五章&#xff0c;一遍一遍一直到今天2024.7.14日第9次刷第五章。 真的每次刷完第五章感觉好像…

【题解】42. 接雨水(动态规划 预处理)

https://leetcode.cn/problems/trapping-rain-water/description/ class Solution { public:int trap(vector<int>& height) {int n height.size();// 预处理数组vector<int> lefts(n, 0);vector<int> rights(n, 0);// 预处理记录左侧最大值lefts[0] …

Python应用 | 基于flask-restful+AntDesignVue实现的一套图书管理系统

本文将分享个人自主开发的一套图书管理系统&#xff0c;后端基于Python语言&#xff0c;采用flask-restful开发后端接口&#xff0c;前端采用VueAntDesignVue实现。对其他类似系统的实现&#xff0c;比如学生管理系统等也有一定的参考作用。有问题欢迎留言讨论~ 关注公众号&am…

最新Wireshark查看包中gzip内容

虽然是很简单的事情&#xff0c;但是网上查到的查看gzip内容的方法基本都是保存成zip文件&#xff0c;然后进行二进制处理。 其实现在最新版本的Wireshark已经支持获取gzip内容了。 选中HTTP协议&#xff0c;右键选择[追踪流]->[HTTP Stream] 在弹出窗口中&#xff0c;已…

mavsdk_server安卓平台编译

1.下载好mavsdk并进入mavsdk目录 2.生成docker安卓平台文件 docker run --rm dockcross/android-arm64 >./dockcross-android-arm64 3.生成makefile ./dockcross-android-arm64 cmake -DCMAKE_BUILD_TYPERelease -DBUILD_MAVSDK_SERVERON -DBUILD_SHARED_LIBSOFF -Bbuild/…

专业条码二维码扫描设备和手机二维码扫描软件的区别?

条码二维码技术已广泛应用于我们的日常生活中&#xff0c;从超市结账到公交出行&#xff0c;再到各类活动的入场验证&#xff0c;条码二维码的便捷性不言而喻&#xff0c;而在条码二维码的扫描识别读取过程中&#xff0c;专业扫描读取设备和手机二维码扫描软件成为了两大主要工…