matlab解常微分方程常用数值解法1:前向欧拉法和改进的欧拉法

news2024/11/27 2:36:02

总结和记录一下matlab求解常微分方程常用的数值解法,本文先从欧拉法和改进的欧拉法讲起。

d x d t = f ( x , t ) , x ( t 0 ) = x 0 \frac{d x}{d t}=f(x, t), \quad x\left(t_{0}\right)=x_{0} dtdx=f(x,t),x(t0)=x0

1. 前向欧拉法

前向欧拉法使用了泰勒展开的第一项线性项逼近。

x ( t 0 + h ) = x ( t 0 ) + h x ′ ( t 0 ) + 1 2 x ′ ′ ( ξ ) h 2 , t 0 < ξ < t 0 + h x\left(t_{0}+h\right)=x\left(t_{0}\right)+h x^{\prime}\left(t_{0}\right)+\frac{1}{2} x^{\prime \prime}(\xi) h^{2}, \quad t_{0}<\xi<t_{0}+h x(t0+h)=x(t0)+hx(t0)+21x′′(ξ)h2,t0<ξ<t0+h

x k + 1 = x k + h x k ′ + O ( h 2 ) = x k + h f ( x k , t k ) + O ( h 2 ) x_{k+1}=x_{k}+h x'_k+O\left(h^{2}\right)=x_{k}+h f\left(x_{k}, t_{k}\right)+O\left(h^{2}\right) xk+1=xk+hxk+O(h2)=xk+hf(xk,tk)+O(h2)

2. 改进的欧拉法

在原来前向欧拉法的基础上泰勒展开使用了前面两项:
x k + 1 = x k + h x k ′ + 1 2 h 2 x k ′ ′ + O ( h 3 ) x_{k+1}=x_{k}+h x^{\prime}_k+\frac{1}{2} h^{2} x_{k}^{\prime \prime}+O\left(h^{3}\right) xk+1=xk+hxk+21h2xk′′+O(h3)

这里使用:

x k ′ ′ = x k + 1 ′ − x k ′ h x_{k}^{\prime \prime}=\frac{x_{k+1}^{\prime}-x_{k}^{\prime}}{h} xk′′=hxk+1xk

于是我们有:

x k + 1 = x k + h 2 ( x k ′ + x k + 1 ′ ) + O ( h 3 ) x_{k+1}=x_{k}+\frac{h}{2}\left(x_{k}^{\prime}+x_{k+1}^{\prime}\right)+O\left(h^{3}\right) xk+1=xk+2h(xk+xk+1)+O(h3)

也就是:

x k + 1 = x k + h 2 [ f ( x k , t k ) + f ( x k + 1 , t k + 1 ) ] + O ( h 3 ) x_{k+1}=x_{k}+\frac{h}{2}\left[f\left(x_{k}, t_{k}\right)+f\left(x_{k+1}, t_{k+1}\right)\right]+O\left(h^{3}\right) xk+1=xk+2h[f(xk,tk)+f(xk+1,tk+1)]+O(h3)

我们怎么计算 f ( x k + 1 , t k + 1 ) f(x_{k+1},t_{k+1}) f(xk+1,tk+1)呢,因为我们还不知道 x k + 1 x_{k+1} xk+1

对比前向欧拉法,改进欧拉法的右边不使用 x k + 1 x_{k+1} xk+1(我们还不知道),但是我们可以用前向欧拉法计算的 x k + h f ( x k , t k ) x_{k}+h f\left(x_{k}, t_{k}\right) xk+hf(xk,tk)来代替 x k + 1 x_{k+1} xk+1,于是我们有
x k + 1 = x k + 1 2 ( k 1 + k 2 ) + O ( h 3 ) , 其中: k 1 = h f ( x k , t k ) , k 2 = h f ( x k + h , t k + k 1 ) x_{k+1}=x_{k}+\frac{1}{2}\left(k_{1}+k_{2}\right)+O\left(h^{3}\right), \\\text{其中:}k_{1}=h f\left(x_{k}, t_{k}\right), k_{2}=h f\left(x_{k}+h, t_{k}+k_{1}\right) xk+1=xk+21(k1+k2)+O(h3),其中:k1=hf(xk,tk),k2=hf(xk+h,tk+k1)

对比一下前向欧拉法:

x k + 1 = x k + k 1 + O ( h 2 ) , k 1 = h f ( x k , t k ) x_{k+1}=x_{k}+k_{1}+O\left(h^{2}\right), \quad k_{1}=h f\left(x_{k},t_{k} \right) xk+1=xk+k1+O(h2),k1=hf(xk,tk)

例子

x ′ = x + t , x ( 0 ) = 1 x^{\prime}=x+t, \quad x(0)=1 x=x+t,x(0)=1

clear

% 测试三个不同的步长
test_times = 3;
% 保存时间、差分时间和步长
h_res=ones(1,test_times);
t_res=cell(1,test_times);%时间
tplot_res=cell(1,test_times);%差分的时间,比时间长度少1
% 保存两种数值方法和解析解的计算结果
x_euler_res=cell(1,test_times);
x_modified_res=cell(1,test_times);
x_exact_res=cell(1,test_times);
% 保存误差
diff1_res=cell(1,test_times);
diff2_res=cell(1,test_times);

for i = 1:test_times
% 设置步长间隔和步长数
h = 1/10^i; n = 10/h;
% set up initial conditions
t=zeros(n+1,1); t(1) = 0;
x_euler=zeros(n+1,1); x_euler(1) = 1;
x_modified=zeros(n+1,1); x_modified(1) = 1;
x_exact=zeros(n+1,1); x_exact(1) = 1;
% 设置不同的比较误差的图
diff1 = zeros(n,1); diff2 = zeros(n,1); tplot = zeros(n,1);
% define right side of differential equation, Equation 1.7.10
f = inline('xx+tt','tt','xx');
for k = 1:n
t(k+1) = t(k) + h;
% 计算解析解
x_exact(k+1) = 2*exp(t(k+1)) - t(k+1) - 1;
% 使用前向欧拉法计算
k1 = h * f(t(k),x_euler(k));
x_euler(k+1) = x_euler(k) + k1;
tplot(k) = t(k+1);
diff1(k) = x_euler(k+1) - x_exact(k+1);
diff1(k) = abs(diff1(k) / x_exact(k+1));
% 使用改进欧拉法计算
k1 = h * f(t(k),x_modified(k));
k2 = h * f(t(k+1),x_modified(k)+k1);
x_modified(k+1) = x_modified(k) + 0.5*(k1+k2);
diff2(k) = x_modified(k+1) - x_exact(k+1);
diff2(k) = abs(diff2(k) / x_exact(k+1));
end
diff1_res{i}=diff1;
diff2_res{i}=diff2;
tplot_res{i}=tplot;
h_res(i)=h;
x_euler_res{i}=x_euler;
x_modified_res{i}=x_modified;
x_exact_res{i}=x_exact;
t_res{i}=t;
end

figure
for i=1:test_times
subplot(2,2,i)
plot(t_res{i},x_exact_res{i},'k-',t_res{i},x_euler_res{i},'b-',t_res{i},x_modified_res{i},'r:')
xlabel('TIME','Fontsize',18)
ylabel('|RELATIVE ERROR|','Fontsize',18)
legend({'Analytical method','Euler method','modified Euler method'},'Location','best')
legend boxoff;
title(['h = ',num2str(h_res(i))]);
end
subplot(2,2,4)

% 计算相对误差
for i=1:test_times
semilogy(tplot_res{i},diff1_res{i},'b-',tplot_res{i},diff2_res{i},'r:')
hold on
num1 = 0.2*10/h_res(i); num2 = 0.8*10/h_res(i);
text(3,diff1_res{i}(num1),['h = ',num2str(h_res(i))],'Fontsize',12,...
'HorizontalAlignment','right',...
'VerticalAlignment','bottom')
text(9,diff2_res{i}(num2),['h = ',num2str(h_res(i))],'Fontsize',12,...
'HorizontalAlignment','right',...
'VerticalAlignment','bottom')
end
xlabel('TIME','Fontsize',18)
ylabel('|RELATIVE ERROR|','Fontsize',18)
legend({'Euler method','modified Euler method'},'Location','best')
legend boxoff;

我们对各个不同的步长进行了比较,并比较了它们的误差,发现改进的欧拉法要比前向欧拉法的精度更高。随着步长的变小,误差也在变小。

在这里插入图片描述

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

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

相关文章

GitOps实践 | 企业生产环境Jenkins流水线分享,从Gitlab到镜像构建到部署测试以及企业微信消息通知...

关注回复【学习交流群】加入【安全开发运维】答疑交流群 目录: 0x00 前言简述 描述: 当前在企业内部开发中最常用的CI/CD&#xff08;持续集成和交付&#xff09;&#xff0c;总是可以看到Jenkins&#xff08;大叔&#xff09;的身影&#xff0c;其作为老牌开源的CI/CD工具&…

【Minecraft】Fabric Mod开发完整流程3 - 配方与挖掘等级

目录 新配方工作台配方无序合成配方有序合成配方 熔炉配方 挖掘等级与掉落物挖掘等级标准等级配置易错点分析 战利品与掉落物普通方块掉落物矿石方块掉落物 新配方 工作台配方 为便于你快速创建配方&#xff0c;可以直接去这个网站上通过拖拽的方式创建属于你的配方表&#xf…

9.3.1网络原理(应用层)

HTTP和HTTPS后面的博客会另外介绍. 一.设计应用层协议: 1.明确当前请求和响应中包含哪些内容. 2.明确具体请求和响应格式. 网络上传输的数据,本质上就是字符串(无法直接传对象). 序列号:发送数据的时候,把对象转化成二进制字符串.(注意,网络上传输的数据统一为大端字节序…

基于飞桨图学习框架实现的城市地点动态关系挖掘

李双利 飞桨开发者技术专家&#xff08;PPDE&#xff09;&#xff0c;百度研究院商业智能实验室研究实习生&#xff0c;中国科学技术大学在读博士生。 主要进行时空数据挖掘和图深度学习的相关研究工作。曾获2021年百度研究院年度优秀实习生&#xff0c;有多篇基于飞桨完成的论…

Linux常见面试题,应对面试分享

操作系统基础 1.cpu占⽤率太⾼了怎么办? 排查思路是什么&#xff0c;怎么定位这个问题&#xff0c;处理流程 其他程序: 1.通过top命令按照CPU使⽤率排序找出占⽤资源最⾼的进程 2.lsof查看这个进程在使⽤什么⽂件或者有哪些线程 3.询问开发或者⽼⼤,是什么业务在使⽤这个进程…

Linux学习之sed多行模式

N将下一行加入到模式空间 D删除模式空间中的第一个字符到第一个换行符 P打印模式空间中的第一个字符到第一个换行符 doubleSpace.txt里边的内容如下&#xff1a; goo d man使用下边的命令可以实现把上边对应的内容放到doubleSpace.txt。 echo goo >> doubleSpace.txt e…

无代码集成励销云CRM连接更多应用

场景描述&#xff1a; 基于励销云的开放API&#xff0c;实现无代码集成连接励销云与其它应用。通过Aboter可轻松搭建业务自动化流程&#xff0c;实现多个应用之间的数据连接。 接口能力&#xff1a; 用户模块业务模块拜访签到模块公海客户模块联系人模块合同模块客户模块任务…

EVE-NG 隐藏没有镜像的模板

eve-ng 默认情况下&#xff0c;在添加node时&#xff0c;会列出所有的模板&#xff0c;这样用着很不方便。 通过以下方式&#xff0c;可以使没有设备的模板不可见 cp /opt/unetlab/html/includes/config.php.distribution /opt/unetlab/html/includes/config.php 如下图&#…

大数据面试题:说下Spark中的Transform和Action,为什么Spark要把操作分为Transform和Action?

面试题来源&#xff1a; 《大数据面试题 V4.0》 大数据面试题V3.0&#xff0c;523道题&#xff0c;679页&#xff0c;46w字 可回答&#xff1a;Spark常见的算子介绍一下 参考答案&#xff1a; 我们先来看下Spark算子的作用&#xff1a; 下图描述了Spark在运行转换中通过算…

tomcat服务七层搭建动态页面查看

一个服务器多实例复制完成 配置tomcat多实例的环境变量 vim /etc/profile.d/tomcat.sh配置tomcat1和tomcat2的环境变量 进入tomcat1修改配置 测试通信端口是否正常 连接正常 toncat 2 配置修改 修改这三个 端口配置修改完成 修改tomcat1 shudown 分别把启动文件指向tomcat1…

【Linux】进程信号之信号的处理

进程信号 三 一、信号的处理时机二、内核态与用户态1、内核态与用户态的转化2、重谈进程地址空间 三、信号的处理1、一般信号的处理流程2、捕捉信号的处理流程3、信号捕捉函数sigaction 一、信号的处理时机 在前面我们讲过信号产生和保存以后&#xff0c;我们知道进程对于产生…

YOLOv5、YOLOv8改进: GSConv+Slim Neck

论文题目&#xff1a;Slim-neck by GSConv: A better design paradigm of detector architectures for autonomous vehicles 论文&#xff1a;https://arxiv.org/abs/2206.02424 代码&#xff1a;https://github.com/AlanLi1997/Slim-neck-by-GSConv 在计算机视觉领域&#x…

YOLOv8“炼丹“之扑克牌识别

最近沉迷炼丹, 效果图: 框架Ultralytics YOLOv8 来自GitHub的介绍: Ultralytics YOLOv8 is a cutting-edge, state-of-the-art (SOTA) model that builds upon the success of previous YOLO versions and introduces new features and improvements to further boost pe…

Centos7源码安装redis

1、下载redis Index of /releases/ 2、解压redis tar -xvf redis-6.2.9.tar.gz 3、进入解压后的目录 cd redis-6.2.9/4、指定内存分配器为 libc make MALLOClibc 5、进入src目录&#xff0c;安装 cd src && make install6、运行 ./redis-server 7、添加开机…

IIC延时函数

别人家的程序 void i2c_Start(void) {OLED_I2C_SDA_1(); //SDA 总线置1OLED_I2C_SCL_1(); //SCL 总线置1i2c_Delay(); //延时信号OLED_I2C_SDA_0(); //置 0 i2c_Delay();OLED_I2C_SCL_0(); //SCL 置0i2c_Delay(); }延时函数 static void i2c_Delay(void) {uint8_t…

企业时代下的汽车4S店形势分析

据网上数据显示&#xff0c;2022年约有2000家汽车4S店闭店退网&#xff0c;这一数据不由令人惊叹&#xff01; 疫情放开后&#xff0c;原以为汽车经销商的春天也即将来临&#xff0c;可它们有些已经死在了半路上。 2023年伊始&#xff0c;经销商大戏以一则破产消息开幕——浙…

NR700 —基础知识

01 中国5G频段分布及700M频谱 中国运营商频段分布&#xff1a; 不同频段的无线电波的特征&#xff1a; 700M网络因其低频特性&#xff0c;有着极佳的覆盖能力和穿透能力&#xff0c;但同时相对运营商已有的高频网络有着明显的性能差距。因此700M网络更适合用于底层网络深度覆盖…

mac harbor的安装

harbor的安装 为什么要整这个呢&#xff0c;因为我在学习k8s&#xff0c;但是需要一个自己的镜像仓库。于是&#xff0c;最开始想到的就是在本地直接部署一个&#xff0c;还比较安全、快速。 直接下载了官方的项目&#xff0c;运行脚本发现出了异常&#xff0c;这种异常我已经…

帮群里一位留学生订机票,省了2.2万元

注&#xff1a;此篇文章为峰哥环游世界番外篇&#xff0c;我会记录很多我认为值得分享的图文。在环游世界交流群里的同学记得扫描下方二维码直接观看&#xff0c;不要付费&#xff0c;具体事宜可以看贴&#xff1a;付费文章说明&#xff01; 想进一步了解我环游世界的故事&…

React 之 Suspense和lazy

一. Suspense 参考链接&#xff1a;https://react.docschina.org/reference/react/Suspense suspense&#xff1a;n. 焦虑、悬念 <Suspense> 允许你显示一个退路方案&#xff08;fallback&#xff09;直到它的所有子组件完成加载。 <Suspense fallback{<Loadin…