四阶龙格库塔法求解微分方程【MATLAB||C】

article/2025/8/29 19:52:11

四阶龙格库塔法求解微分方程


作者:PEZHANG
时间:2021.11.6


求解过程数学描述

四阶龙格库塔的求解过程可用如下数学公式描述:
k 1 = f ( t n , y n ) k_1=f\left( t_n,y_n \right) k1=f(tn,yn)

k 2 = f ( t n + h 2 , y n + h 2 k 1 ) k_2=f\left( t_n+\frac{h}{2},y_n+\frac{h}{2}k_1 \right) k2=f(tn+2h,yn+2hk1)

k 3 = f ( t n + h 2 , y n + h 2 k 2 ) k_3=f\left( t_n+\frac{h}{2},y_n+\frac{h}{2}k_2 \right) k3=f(tn+2h,yn+2hk2)

k 4 = f ( t n + h , y n + h k 3 ) k_4=f\left( t_n+h,y_n+hk_3 \right) k4=f(tn+h,yn+hk3)

y n + 1 = y n + h 6 ( k 1 + 2 k 2 + 2 k 3 + k 4 ) y_{n+1}=y_n+\frac{h}{6}\left( k_1+2k_2+2k_3+k_4 \right) yn+1=yn+6h(k1+2k2+2k3+k4)

例子

为验证程序的有效性,选取一个已知解析解的微分方程验证。

​ equ: y ′ = y y^{'}=y y=y ,零初值状态,即 y ( 0 ) = 1 y(0)=1 y(0)=1
可知解析解为: y = e x y=e^x y=ex

code【此处代码建议不看,请跳转至下方修正代码】

编写的MATLAB程序如下:

% function RK4()
clc;clear;
Ts = 0.01;
h = Ts;
time = 1.5;
N = time/Ts;
t = linspace(Ts,time,N);y = zeros(1,N+1);
for m=2:Nk1 = exp(m*Ts);k2 = exp(m*Ts+h/2*k1);k3 = exp(m*Ts+h/2*k2);k4 = exp(m*Ts+h*k3);y(1,m+1) = y(1,m) +(k1+2*k2+2*k3+k4)*h/6;
end
figure
plot(t,exp(t))
hold on
y = y(1,2:N+1);
y = y+1;
plot(t,y)
legend('解析解','数值解');

结果分析

在这里插入图片描述

根据预期,算法应当逐渐收敛至稳态,但是实际的求解过程无法反应此过程。当求解区间变大时,出现算法出现轻微的发散现象,说明算法设计存在缺陷,原因尚未分析出来,后续理清思路后再补充。

参考文献

【1】https://www.jianshu.com/p/e4aa9a688959

【2】https://wenku.baidu.com/view/d69e8f1f77c66137ee06eff9aef8941ea76e4b2c.html


2022-10-26-四阶龙格库塔法计算程序【修正】

由于后续的工作需要使用数值计算方法,重写了四阶龙格库塔法,通过控制求解步长,可以有效的控制误差,上次遗留的发散问题仍未得到解决。

再次阅读之前写的程序,发现公布的算法是在反向验证龙格库塔算法的有效性,在解析解未知的前提下,算法无法进行正向求解。最新改进的算法已实现了正向求解。

%eqution
%y'=y y(0)=1clc;clear;% set the solution range and solution step
h = 0.01;
time = 5;
N = time/h;
t = linspace(h,time,N);
y = zeros(1,N);
y(1,1) = 1;% RK4
for m=1:N-1k1 = h*y(1,m);k2 = h*(y(1,m)+k1/2);k3 = h*(y(1,m)+k2/2);k4 = h*(y(1,m)+k3);y(1,m+1) = y(1,m) +(k1+2*k2+2*k3+k4)/6;
end% data visualization
figure
subplot(2,1,1); 
plot(t,exp(t))
hold on
plot(t,y)
legend('解析解','数值解');
title('h=0.01')
subplot(2,1,2); 
error = exp(t)-y;
plot(t,error)
legend('误差');

请添加图片描述
请添加图片描述
通过对比上方的两张图片,可以发现,在求解步长设置为0.01时,求解误差已经非常小。


2022-12-29-四阶龙格库塔法C语言计算程序

sublime text的C语言环境配置

{"working_dir": "$file_path","cmd": "gcc -Wall \"$file_name\" -o \"$file_base_name\"","file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$","selector": "source.c","variants":[{"name": "Run","shell_cmd": "gcc -Wall \"$file\" -o \"$file_base_name\" && start cmd /c \"${file_path}/${file_base_name} & pause\""}]
}

例子1、已知: y ′ = y − 2 x y , y ( 0 ) = 1 y^{'}=y-\frac{2x}{y}\text{,}y\left( 0 \right) =1 y=yy2xy(0)=1

#include<stdio.h>
#include<math.h>#define NS 1double x[NS];
double y[NS];
void equ(double t, double *x, double *fx){//fx[0] = x[0];   //求解y'=yfx[0] = x[0] - 2*y[0] / x[0]; //求解y' = y-2x/y,y=1
}void RK4(double t, double *x, double hs){double fx[NS];double k1[NS], k2[NS], k3[NS], k4[NS], xk[NS];int i;equ(t, x, fx);for(i=0; i<NS; ++i){        k1[i] = fx[i] * hs;xk[i] = x[i] + k1[i]*0.5; //对应yy[i] = t+hs/2; //对应x}equ(t, xk, fx); // timer.t+hs/2., for(i=0; i<NS; ++i){        k2[i] = fx[i] * hs;xk[i] = x[i] + k2[i]*0.5;y[i] = t+hs/2;}equ(t, xk, fx); // timer.t+hs/2., for(i=0;i<NS;++i){        k3[i] = fx[i] * hs;xk[i] = x[i] + k3[i];y[i] = t+hs;}equ(t, xk, fx); // timer.t+hs, for(i=0; i<NS; ++i){        k4[i] = fx[i] * hs;x[i] = x[i] + (k1[i] + 2*(k2[i] + k3[i]) + k4[i])/6.0;}
}int main(){//	double sumtime = 0.1;double hs = 0.2;double t = 0;int jj = 0;x[0] = 1;y[0] = 0;for (int i = 0; i < 5; ++i){RK4(t, x, hs);t = t + hs;jj = jj + 1;printf("第%d次循环:%f\n", jj, x[0]);}return 0;
}

代码执行结果
在这里插入图片描述

例子2、已知: y ′ = y , y ( 0 ) = 1 y^{'}=y\text{,}y\left( 0 \right) =1 y=yy(0)=1

#include<stdio.h>
#include<math.h>
#include <cstdlib>
#define NS 1double x[NS];
//double y[NS];
void equ(double t, double *x, double *fx){fx[0] = x[0];   //求解y'=y,y(0)=1//fx[0] = x[0] - 2*y[0] / x[0];
}void RK4(double t, double *x, double hs){double fx[NS];double k1[NS], k2[NS], k3[NS], k4[NS], xk[NS];int i;equ(t, x, fx);for(i=0; i<NS; ++i){        k1[i] = fx[i] * hs;xk[i] = x[i] + k1[i]*0.5;}equ(t, xk, fx); // timer.t+hs/2., for(i=0; i<NS; ++i){        k2[i] = fx[i] * hs;xk[i] = x[i] + k2[i]*0.5;}equ(t, xk, fx); // timer.t+hs/2., for(i=0;i<NS;++i){        k3[i] = fx[i] * hs;xk[i] = x[i] + k3[i];}equ(t, xk, fx); // timer.t+hs, for(i=0; i<NS; ++i){        k4[i] = fx[i] * hs;x[i] = x[i] + (k1[i] + 2*(k2[i] + k3[i]) + k4[i])/6.0;}
}void write_data_to_file(FILE *fw);int main(){//	double sumtime = 0.1;double hs = 0.01;double t = 0;int jj = 0;x[0] = 1;//y[0] =0;remove("RKdata.dat");FILE* fw;for (int i = 0; i < 300; ++i){t = t + 0.01;fw = fopen("RKdata.dat", "a");RK4(t, x, hs);fprintf(fw, "%f,%f,", t, x[0]);jj = jj + 1;printf("第%d次循环:%f\n", jj, x[0]);fclose(fw);}system("python ./datavis.py"); return 0;
}

python代码:datavis.py,python环境配置可以参考下方的参考文献【4】

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib; matplotlib.use('TkAgg')c = pd.read_csv("RKdata.dat", sep = ",", header=None,encoding='utf-8')
c = c.iloc[:,0:len(c.columns)-1]
#print(c)
#df= c[[i%2==0 for i in range(len(c.index))]]
#tt = c.iloc[:,0:len(c.columns)-1]
t = c.iloc[:,c.columns%2 == 0]x = c.iloc[:,c.columns%2 == 1]t.to_csv('excel2txt.txt', sep='\t', index=False)
a = np.loadtxt('excel2txt.txt')x.to_csv('excel2txt1.txt', sep='\t', index=False)
b = np.loadtxt('excel2txt1.txt')#print(a.shape)
#print(b.shape)x = np.arange(0, 3, 0.01)
#print(x.shape)
y = np.exp(x)z = b[1,:]-y
plt.subplot(2, 1, 1)plt.plot(x,y,label='analytical solution')
plt.plot(a[1,:],b[1,:],label='numerical solution')
plt.legend()
plt.subplot(2, 1, 2)
plt.plot(x,z,label='numerical error')
plt.legend()plt.savefig("test.jpg", dpi=300,format="jpg")
plt.show()

例子2代码执行结果
在这里插入图片描述
参考文献
【3】https://blog.csdn.net/Devid_/article/details/105855009
【4】https://zhuanlan.zhihu.com/p/64445558
【5】https://www.bilibili.com/video/BV1JQ4y1k77Z/?spm_id_from=333.999.0.0


http://chatgpt.dhexx.cn/article/9uqvIksf.shtml

相关文章

算法-----龙格-库塔法(转)

数值分析中&#xff0c;龙格&#xff0d;库塔法&#xff08;Runge-Kutta&#xff09;是用于模拟常微分方程的解的重要的一类隐式或显式迭代法。这些技术由数学家卡尔龙格和马丁威尔海姆库塔于1900年左右发明。 龙格库塔法的家族中的一个成员如此常用&#xff0c;以至于经常被称…

隐式龙格库塔法举例说明

隐式龙格-库塔法 题目具体分析前期准备确定系数MATLAB求解 题目 用隐式中点公式求解常微分方程: { d y d x y , y ( 0 ) 1. \begin{cases} \dfrac{dy}{dx}y,\\ y(0)1. \end{cases} ⎩⎨⎧​dxdy​y,y(0)1.​ 具体分析 前期准备 首先对和在区间上进行离散化&#xff0c;然…

龙格库塔法求解微分方程

在https://blog.csdn.net/weixin_42141390/article/details/110184743一文中&#xff0c;我们曾经讨论了欧拉法&#xff0c;龙格-库塔法也跟欧拉法一样&#xff0c;是用梯形的面积去替代积分的面积的一种方法。 欧拉法简介 设有微分方程&#xff1a; d x ( t ) d t f ( x )…

数值计算大作业:常微分初值问题数值解法(欧拉法、改进欧拉法、四阶龙格库塔法程序在Matlab中的实现)

作为研究生的入门课&#xff0c;数值计算的大作业算是所有研究生开学的重要编程作业。 我把矩常微分初值问题用欧拉法、改进欧拉法、与四阶龙格库塔法分别在MATLAB中编程实现。具体的程序详细标注后放在文章最后了&#xff0c;每道题我只展示运算结果与结论&#xff0c;需要的同…

Matlab之四阶龙格—库塔法方法:解常微分初值问题

目录 1. 题目 2. 算法原理 3. 代码 4. 结果 4.1 运行结果 4.2 结果分析 【若觉文章质量良好且有用&#xff0c;请别忘了点赞收藏加关注&#xff0c;这将是我继续分享的动力&#xff0c;万分感谢&#xff01;】 直接通过解题的方式进行学习&#xff0c;代入感更强 1. 题…

龙格库塔方法的原理和案例及MTATLAB编程

文章目录 龙格库塔法的原理利用四阶龙格库塔法求解一个案例用MATLAB编程 龙格库塔法的原理 在百度百科中是这么解释的&#xff1a;在各种龙格&#xff0d;库塔法当中有一个方法十分常用&#xff0c;以至于经常被称为“RK4”或者就是“龙格&#xff0d;库塔法”。该方法主要是在…

欧拉法、改进的欧拉法、龙格-库塔法求解初值问题

求解初值问题 简介前期准备欧拉法改进的欧拉法龙格-库塔法标准四阶显式Kutta公式三级三阶显式公式四级四阶显式Kutta公式四级四阶显式Gill公式 示例MATLAB代码结果 简介 通过求解简单的初值问题&#xff1a; { d u d x f ( x , u ) ( 1 ) u ( x 0 ) u 0 ( 2 ) \begin{cases…

6.2 龙格—库塔法

学习目标&#xff1a; 学习龙格-库塔法的具体明确的学习目标可以有以下几点&#xff1a; 理解龙格-库塔法的基本思想和原理&#xff1a;我们应该了解龙格-库塔法的数值求解思想和数值误差的概念&#xff0c;包括截断误差和稳定性等基本概念&#xff0c;并且要熟悉龙格-库塔法的…

四阶龙格库塔法求解一次常微分方程组(python实现)

四阶龙格库塔法求解一次常微分方程组 一、前言二、RK4求解方程组的要点1. 将方程组转化为RK4求解要求的标准形式2. 注意区分每个方程的独立性 三、python实现RK4求解一次常微分方程组1. 使用的方程组2. python代码3. 运行结果 一、前言 之前在博客发布了关于使用四阶龙格库塔方…

四阶龙格库塔算法及matlab代码

常微分方程 Ordinary differential equation&#xff0c;简称ODE&#xff0c;自变量只有一个的微分方程。 例子1&#xff1a; d y d x f ( x , y ) \dfrac {dy} {dx}f(x,y) dxdy​f(x,y) , f ( x , y ) f(x,y) f(x,y)是已知函数 偏微分方程 Partial differential equation…

经典四阶龙格库塔法

关注微信公众号“二进制小站”~~获取更多分析~~&#xff08;文末二维码~~&#xff09; 龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法,经常被称为“RK4”或者就是“龙格库塔法”。 令初值问题表述如下。 对于该问题的RK4由如下方程给出&#xff1a; 其中&…

四阶龙格库塔法(Runge-Kutta)求解常微分方程的 Matlab程序及案例

文章目录 1. 算法2. 程序3. 案例4. 联系作者 1. 算法 上一篇介绍了显式欧拉法、隐式欧拉法、两步欧拉法和改进欧拉法求解常微分方程初值问题&#xff1b;其中显式欧拉法和隐式欧拉法是一阶算法精度&#xff0c;截断误差为 O ( h 2 ) O\left( {{h^2}} \right) O(h2)&#xff1b…

【Runge-Kutta】龙格-库塔法求解微分方程matlab仿真

1.软件版本 MATLAB2013b 2.算法理论 龙格&#xff0d;库塔法&#xff08;Runge-Kutta&#xff09;是用于模拟常微分方程的解的重要的一类隐式或显式迭代法。龙格库塔法的家族中的一个成员如此常用&#xff0c;以至于经常被称为“RK4”或者就是“龙格库塔法”。令初值问题表述…

龙格-库塔方法学习笔记

1、龙格-库塔法简介 龙格—库塔法是一种在工程上应用广泛的高精度单步算法&#xff0c;其中包括著名的欧拉法&#xff0c;用于数值求解微分方程。 由于此算法精度高&#xff0c;采取措施对误差进行抑制&#xff0c;所以其实现原理也较复杂。 在各种龙格—库塔法当中有一个方法十…

四阶龙格库塔法的计算例子

序 没有对比就没有伤害&#xff0c;本文先给出很多时候直接采用的矩形法&#xff0c;然后与四阶龙格库塔法做比较&#xff0c;着重说明四阶龙格库塔法。 一、矩形法 1.1 原理 设微分方程 y ˙ f ( y ) (1.1) \dot yf(y) \tag{1.1} y˙​f(y)(1.1) 求 y y y。 使用数值方法…

龙格-库塔法(Runge-Kutta methods)

非线性的常微分方程通常是难以求出解析解的&#xff0c;只能通过多次迭代求近似的数值解。 龙格&#xff0d;库塔法&#xff08;Runge-Kutta methods&#xff09;是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。简写做RK法。 对于任意的Yf(X),假设某点(Xi,Yi)的斜…

龙格-库塔(Runge-Kutta)方法C++实现

龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。由于此算法精度高&#xff0c;采取措施对误差进行抑制&#xff0c;所以其实现原理也较复杂。该算法是构建在数学支持的基础之上的。 1 中点法 2传统二阶龙格库塔法&#xff1a; 3 传统三阶龙格库塔法 4 传…

龙格库塔法

1 基本思想 我们求解常微分方程的时候&#xff0c;某些常微分方程有解析方法&#xff0c;但是大多数的常微分方程只能用数值解法来求解。 数值解法的一个基本特点就是“递进式”&#xff0c;顺着节点的顺序一步一步向前推进。 龙格库塔法的基本思想就是利用f(x,y)在某些特殊点…

关于html中文字空格以及换行符的处理

在阮一峰大神的博客中发现空格原来可以有多种处理方式&#xff0c;过去只知道用$nbsp;真是惭愧。长路漫漫吖 目录 1、html里面的空格2、怎样原样显示空格和换行符2.1 使用pre标签2.2 使用white-space设置样式 3、参考链接 1、html里面的空格 在html里面&#xff0c;空格和换行符…

html5中如何取消换行,html5换行符元素: 元素

1. 基本概念 html5中的元素用于产生一个换行符&#xff0c;它的名称br正是单词break的前两个字母&#xff1b;break本身的含义为“打破、拆分”&#xff0c;在此处就引申为换行的意思。 为什么html5要专门定义一个元素来代表换行符呢&#xff1f;我们平常在办公软件中编辑文本的…