matlab解常微分方程常用数值解法2:龙格库塔方法

news2024/10/6 10:39:34

总结和记录一下matlab求解常微分方程常用的数值解法,本文将介绍龙格库塔方法(Runge-Kutta Method)。

龙格库塔迭代的基本思想是:

x k + 1 = x k + a k 1 + b k 2 x_{k+1}=x_{k}+a k_{1}+b k_{2} xk+1=xk+ak1+bk2

k 1 = h f ( x k , t k )  and  k 2 = h f ( x k + B 1 k 1 , t k + A 1 h ) k_{1}=h f\left(x_{k},t_{k} \right) \quad \text { and } \quad k_{2}=h f\left(x_{k}+B_{1}k_{1},t_{k}+A_{1} h \right) k1=hf(xk,tk) and k2=hf(xk+B1k1,tk+A1h)

其中 a , b , A 1 , B 1 a,b,A_1,B_1 a,b,A1,B1是未知的,我们进行推导。

首先对 f ( x + k , t + h ) f(x+k,t+h) f(x+k,t+h)进行泰勒展开:

f ( x + k , t + h ) = f ( x , t ) + ( k f x + h f t ) + 1 2 ( k 2 f x x + 2 k h f x t + h 2 f t t ) + 1 6 ( k 3 f x x x + 3 k 2 h f x x t + 3 k h 2 f x t t + h 3 f t t t ) + ⋯ \begin{aligned} f(x+k, t+h) & =f(x, t)+\left(k f_{x}+h f_{t}\right)+\frac{1}{2}\left(k^{2} f_{xx}+2 k h f_{xt }+h^{2} f_{tt}\right) \\ & +\frac{1}{6}\left(k^{3} f_{xxx}+3 k^{2} h f_{xxt}+3 k h^{2} f_{xtt}+h^{3} f_{ttt}\right)+\cdots \end{aligned} f(x+k,t+h)=f(x,t)+(kfx+hft)+21(k2fxx+2khfxt+h2ftt)+61(k3fxxx+3k2hfxxt+3kh2fxtt+h3fttt)+
利用泰勒展开我们展开 k 2 k_2 k2
k 2 = h f [ x k + B 1 h f ( x k , t k ) , t k + A 1 h ] = h [ f ( x k , t k ) + ( B 1 h f f x + A 1 h f t ) ] = h f + A 1 h 2 f t + B 1 h 2 f f x , \begin{aligned} k_{2} & =h f\left[x_{k}+B_1 h f\left( x_{k},t_{k}\right),t_{k}+A_{1} h\right] \\ & =h\left[f\left(x_{k},t_{k} \right)+\left(B_{1} h f f_{x}+A_{1} h f_{t}\right)\right] \\ & =h f+A_{1} h^{2} f_{t}+B_{1} h^{2} f f_{x}, \end{aligned} k2=hf[xk+B1hf(xk,tk),tk+A1h]=h[f(xk,tk)+(B1hffx+A1hft)]=hf+A1h2ft+B1h2ffx,
上式中的 f f f f ( x k , t k ) f(x_k,t_k) f(xk,tk),我们将上式代回到最开始的式子 x k + 1 = x k + a k 1 + b k 2 x_{k+1}=x_{k}+a k_{1}+b k_{2} xk+1=xk+ak1+bk2得到(*)式

x k + 1 = x k + ( a + b ) h f + ( A 1 b f t + B 1 b f f x ) h 2 ( ∗ ) x_{k+1}=x_{k}+(a+b) h f+\left(A_{1} b f_{t}+B_{1} b f f_{x}\right) h^{2}\quad\quad(*) xk+1=xk+(a+b)hf+(A1bft+B1bffx)h2()

对应于二阶泰勒展式:

x k + 1 = x k + h x k ′ + 1 2 h 2 x k ′ ′ x_{k+1}=x_{k}+h x_{k}^{\prime}+\frac{1}{2} h^{2} x_{k}^{\prime \prime} xk+1=xk+hxk+21h2xk′′

对于微分方程我们知道 x ′ = f ( x , t ) x^{\prime}=f(x, t) x=f(x,t),于是对 t t t求二阶导数:

x ′ ′ = f t + f x x ′ = f t + f f x x^{\prime \prime}=f_{t}+f_{x} x^{\prime}=f_{t}+f f_{x} x′′=ft+fxx=ft+ffx

于是有:

x k + 1 = x k + h f + 1 2 h 2 ( f t + f f x ) x_{k+1}=x_{k}+h f+\frac{1}{2} h^{2}\left(f_{t}+f f_{x}\right) xk+1=xk+hf+21h2(ft+ffx)

对比(*)式我们有:

a + b = 1 , A 1 b = 1 2 ,  and  B 1 b = 1 2 .  a+b=1, A_{1} b=\frac{1}{2}, \quad \text { and } \quad B_{1} b=\frac{1}{2} \text {. } a+b=1,A1b=21, and B1b=21

如果我们取 a = b = 1 2 a=b=\frac{1}{2} a=b=21,那么 A 1 = B 1 = 1 A_1=B_1=1 A1=B1=1,为二阶的龙哥库塔算法。其形式和改进的欧拉法一致:

x k + 1 = x k + 1 2 ( k 1 + k 2 ) x_{k+1}=x_{k}+\frac{1}{2}\left(k_{1}+k_{2}\right) xk+1=xk+21(k1+k2)

从二阶的出发,我们可以得到改进的一套更好的框架,一个常用的龙哥库塔方法是四阶的:

x k + 1 = x k + 1 6 ( k 1 + 2 k 2 + 2 k 3 + k 4 ) ,  x_{k+1}=x_{k}+\frac{1}{6}\left(k_{1}+2 k_{2}+2 k_{3}+k_{4}\right) \text {, } xk+1=xk+61(k1+2k2+2k3+k4)

其中:

k 1 = h f ( x k , t k ) k 2 = h f ( x k + 1 2 k 1 , t k + 1 2 h ) k 3 = h f ( x k + 1 2 k 2 , t k + 1 2 h ) k 4 = h f ( x k + k 3 , t k + h ) \begin{aligned} &k_{1}=h f\left(x_{k},t_{k} \right) \\ &k_{2}=h f\left(x_{k}+\frac{1}{2} k_{1},t_{k}+\frac{1}{2} h \right) \\ &k_{3}=h f\left(x_{k}+\frac{1}{2} k_{2},t_{k}+\frac{1}{2} h \right) \\ &k_{4}=h f\left(x_{k}+k_{3},t_{k}+h\right) \end{aligned} k1=hf(xk,tk)k2=hf(xk+21k1,tk+21h)k3=hf(xk+21k2,tk+21h)k4=hf(xk+k3,tk+h)

例子

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

clc
clear
% 测试4个不同的步长
test_times = 3;
h_test = [0.10, 0.05, 0.01];%根据步长数改变

% 保存时间、差分时间和步长
h_res=ones(1,test_times);
t_res=cell(1,test_times);%时间
tplot_res=cell(1,test_times);%差分的时间,比时间长度少1
% 保存两种数值方法和解析解的计算结果
x_rk_res=cell(1,test_times);
x_exact_res=cell(1,test_times);
% 保存误差
diff_res=cell(1,test_times);



for i = 1:test_times
% 设置步长间隔和步长数
    h = h_test(i);
    n = 10/h;
% 设置初始条件
    t=zeros(n+1,1); t(1) = 0;
    x_rk=zeros(n+1,1); x_rk(1) = 1;
    x_exact=zeros(n+1,1); x_exact(1) = 1;
% 设置龙哥库塔方法误差存放向量(和精确解比较)
    diff = zeros(n,1); tplot = zeros(n,1);
% 定义微分方程
    f = @(tt,xx)(xx+tt);
    for k = 1:n
        x_local = x_rk(k); t_local = t(k);
        k1 = h * f(t_local,x_local);
        k2 = h * f(t_local + h/2,x_local + k1/2);
        k3 = h * f(t_local + h/2,x_local + k2/2);
        k4 = h * f(t_local + h,x_local + k3);
        t(k+1) = t_local + h;
        x_rk(k+1) = x_local + (k1+2*k2+2*k3+k4) / 6;
        x_exact(k+1) = 2*exp(t(k+1)) - t(k+1) - 1;
        tplot(k) = t(k);
        diff(k) = x_rk(k+1) - x_exact(k+1);
        diff(k) = abs(diff(k) / x_exact(k+1));
    end
    diff_res{i}=diff;
	tplot_res{i}=tplot;
	h_res(i)=h;
	x_rk_res{i}=x_rk;
	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},'r-',t_res{i},x_rk_res{i},'b--')
    xlabel('t','Fontsize',18)
    ylabel('x','Fontsize',18)
    legend({'Analytical method','Runge-Kutta method'},'Location','best')
    legend boxoff;
    title(['h = ',num2str(h_res(i))]);
    axis tight
end

% 相对误差图
subplot(2,2,4)
for i = 1:test_times
    semilogy(tplot_res{i},diff_res{i},'b-')
    hold on
    num1 = 2; num2 = 2/h_test(i);
    text(num1,diff_res{i}(num2),['h = ',num2str(h_res(i))],'Fontsize',15,...
    'HorizontalAlignment','right',...
    'VerticalAlignment','bottom')
end
xlabel('t','Fontsize',20)
ylabel('|relative error|','Fontsize',20)
title('Runge-Kutta method''s relative error')

可以看到使用龙格库塔法,步长 h = 0.1 h=0.1 h=0.1精度就已经很高了。
在这里插入图片描述

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

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

相关文章

ZDH-wemock模块

本次介绍基于版本v5.1.1 目录 项目源码 预览地址 安装包下载地址 wemock模块 wemock模块前端 配置首页 配置mock wemock服务 下载地址 打包 运行 效果展示 项目源码 zdh_web: https://github.com/zhaoyachao/zdh_web zdh_mock: https://github.com/zhaoyachao/z…

带你了解接收参数@PathVariable、@ModelAttribute 等相关注解

😀前言 本篇博文是关于SpringBoot 接收客户端提交数据/参数会使用到的相关注解应用说明,希望能够帮助到您😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文…

elasticsearch 基础

ES 搜索技术历史 今天看的是《Elasticsearch实战与原理解析》 第一章 搜索技术发展史 1、搜索技术发展史 宏观而言,搜索引擎的发展经历了五个尖端和两大分类。五个阶段分别是ftp文件检索阶段、分类目录阶段、文本相关性检索阶段、网页链接分析阶段和用户意图识别…

警惕 C++ 中的隐式类型转换

今天文章的主题灵感来自客户的一个问题: 我在研究一个代码中的栈溢出问题。为了减小栈帧的大小,我尽可能多地删除了局部变量,但仍有很多栈空间无法解释。除了局部变量、参数、保存的寄存器和返回地址之外,栈上还有什么其他的东西…

第八章 CUDA内存应用与性能优化篇(上篇)

cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…

机器学习线性代数基础

本文是斯坦福大学CS 229机器学习课程的基础材料,原始文件下载 原文作者:Zico Kolter,修改:Chuong Do, Tengyu Ma 翻译:黄海广 备注:请关注github的更新,线性代数和概率论已经更新完毕…

ACL 2023 | 使用语言模型解决数学推理问题的协同推理框架

©PaperWeekly 原创 作者 | 朱欣宇 单位 | 清华大学 研究方向 | 自然语言处理 论文标题: Solving Math Word Problems via Cooperative Reasoning induced Language Models 论文链接: https://arxiv.org/abs/2210.16257 代码链接: https…

2023 互联网大厂薪资大比拼

最近整理了33家互联网大厂的薪资情况。可以看出来,大部分互联网大厂薪资还是很不错的,腾讯、阿里、美团、百度等大厂平均月薪超过30k,其他互联网大厂平均月薪也都在25k以上。01020304050607080910111213141516171819202122232425262728293031…

ESP8266(RTOS SDK)内嵌网页以实现WEB配网以及数据交互

【本文发布于https://blog.csdn.net/Stack_/article/details/131997098,未经允许不得转载,转载须注明出处】 1、执行make menuconfig,将http头由512改为更大的值,否则用电脑浏览器访问正常,但用手机浏览器访问会因为ht…

关于`IRIS/Caché`进程内存溢出解决方案

文章目录 关于IRIS/Cach进程内存溢出解决方案 描述原因相关系统变量$ZSTORAGE$STORAGE 什么情况下进程内存会变化?内存不足原理解决方案 关于 IRIS/Cach进程内存溢出解决方案 描述 在IRIS/Cach中,进程内存溢出错误是指一个进程(例如运行中的…

群晖 nas 自建 ntfy 通知服务(梦寐以求)

目录 一、什么是 ntfy ? 二、在群晖nas上部署ntfy 1. 在Docker中安装ntfy 2. 设置ntfy工作文件夹 3. 启动部署在 docker 中的 ntfy(binwiederhier/ntfy) 三、启动配置好后,如何使用ntfy 1. 添加订阅主题( Subscribe to topic…

六种不同的CRM系统类型分别有哪些特点?

企业想要管理销售,可以选择CRM系统;企业想要优化业务流程,可以选择CRM系统;企业想要提高收入,可以选择CRM系统。下面来说说,CRM是什么?六种常见CRM系统类型对比。 什么是CRM? CRM是…

当执行汇编指令MOV [0001H] 01H时,CPU都做了什么?

今天和几位单位大佬聊天时,讨论到一个非常有趣的问题-当程序执行MOV [0001H], 01H计算机实际上都做了哪些工作?乍一看这个问题平平无奇,CPU只是把立即数01H放在了地址为0001的内存里,但仔细想想这个问题远没有那么简单&#xff0c…

Synchronized八锁

/** * Description: 8 锁 * 1 标准访问,先打印短信还是邮件 ------sendSMS ------sendEmail 2 停 4 秒在短信方法内,先打印短信还是邮件 ------sendSMS ------sendEmail 3 新增普通的 hello 方法,是先打短信还是 hello ------getHello ------…

阿里云服务器IP地址查看方法(公网/私网)

阿里云服务器IP地址在哪查看?在云服务器ECS管理控制台即可查看,阿里云服务器IP地址包括公网IP和私有IP,阿里云百科分享阿里云服务器IP地址查询方法: 目录 阿里云服务器IP地址查询 阿里云服务器IP地址查询 1、登录到阿里云服务器…

HTML基础知识,网页和报表都可用

首先我们先介绍一下网页: 网页时构成网站的基本元素,它通常由图片,链接,文字,声音,视频等元素组成。通常我们看到的网页,常见以.htm或.html后缀结尾的文件,因此我们把它俗称为HTML文…

易服客工作室:Elementor AI简介 – 彻底改变您创建网站的方式

Elementor 作为领先的 WordPress 网站构建器,是第一个添加本机 AI 集成的。Elementor AI 的第一阶段将使您能够生成和改进文本和自定义代码(HTML、自定义代码和自定义 CSS)。我们还已经在进行以下阶段的工作,其中将包括基于人工智…

uniapp 使用 uni push 2.0 推送消息

因为之前使用uni push 1.0,开通账号和配置厂商就不写了。只说一点,配置厂商很重要,不然收不到离线推送的消息。那么就直接开始咯!!! 一、创建并关联云服务空间 1.创建云服务空间,右键项目【创…

『C语言初阶』第八章 -隐式类型转换规则

前言 今天小羊又来给铁汁们分享关于C语言的隐式类型转换规则,在C语言中类型转换方式可分为隐式类型转换和显式类型转换(强制类型转换),其中隐式类型转换是由编译器自动进行,无需程序员干预,今天小羊课堂说的就是关于隐式类型转换…

阻塞和非阻塞,同步和异步

文章目录 典型的一次IO的两个阶段IO多路复用是同步还是异步? 典型的一次IO的两个阶段 数据就绪和数据读写 同步:需要应用程序自己操作 IO多路复用是同步还是异步? epoll也是同步的 具体数据读取还是通过应用程序自己完成的 只有使用了特…