数值积分方法:欧拉积分、中点积分和龙格-库塔法积分

article/2025/10/1 20:22:54

目录

  • 写在前面
  • 原理
  • 代码
    • CMakeLists.txt
    • euler.cpp
    • midpoint.cpp
    • rk4.cpp
    • compile&run
  • 参考

写在前面

1、本文内容
数值积分方法:欧拉积分(Euler method)、中点积分(Midpoint method)和龙格-库塔法积分(Runge–Kutta methods)

2、转载请注明出处:
https://blog.csdn.net/qq_41102371/article/details/123351399

原理

欧拉积分、中点积分与龙格-库塔积分http://www.liuxiao.org/2018/05/%e6%ac%a7%e6%8b%89%e7%a7%af%e5%88%86%e3%80%81%e4%b8%ad%e7%82%b9%e7%a7%af%e5%88%86%e4%b8%8e%e9%be%99%e6%a0%bc%ef%bc%8d%e5%ba%93%e5%a1%94%e7%a7%af%e5%88%86/
数值积分方法(1)——龙格库塔积分https://zhuanlan.zhihu.com/p/536391602
VIO中的IMU数值积分与IMU预积分 https://zhuanlan.zhihu.com/p/107032156

代码

实现对 y = e x y=e^x y=ex的积分, y ( 0 ) = e ( 0 ) = 1 , y ′ ( 0 ) = e ( 0 ) = 1 y(0)=e^{(0)}=1, y'(0)=e^{(0)}=1 y(0)=e(0)=1,y(0)=e(0)=1

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(Cmake_rk4)add_executable(rk4 rk4.cpp)
add_executable(midpoint midpoint.cpp)
add_executable(euler euler.cpp)

euler.cpp

// euler method
#include <iostream>
#include <cmath>
#include <fstream>
int main(int argc, char* argv[]){double e=2.7182818284;double n,error,y0,k0,k1,kn,yn,step;y0=atof(argv[1]);k1=k0=atof(argv[2]);step=atof(argv[3]);n=atoi(argv[4]);std::ofstream fout;fout.open("./data_euler.txt");if(!fout.is_open()){std::cout<<"open file failed!"<<std::endl;}fout<<0<<" "<<y0<<" "<<y0<<std::endl;for(int i=0;i<n;++i){kn=y0+step*k1;yn=y0+step*k1;double gt=std::pow(e,(i+1)*step);error=std::fabs(gt-yn);std::cout<<(i+1)*step<<std::endl;std::cout<<"y0: "<<y0<<"    k0: "<<k0<<std::endl;std::cout<<"yn: "<<yn<<"    kn: "<<kn<<std::endl<<"gt: "<<gt<<"    error: "<<error<<std::endl;y0=yn;k1=k0=kn;std::cout<<"\n\n\n\n";fout<<(i+1)*step<<" "<<gt<<" "<<yn<<std::endl;}fout.close();return 0;
}

midpoint.cpp

// midpoint method
#include <iostream>
#include <cmath>
#include <fstream>int main(int argc, char* argv[]){double e=2.7182818284;double n,error,y0,k0,k1,k2,kn,yn,step;y0=atof(argv[1]);k1=k0=atof(argv[2]);step=atof(argv[3]);n=atoi(argv[4]);std::ofstream fout;fout.open("./data_midpoint.txt");if(!fout.is_open()){std::cout<<"open file failed!"<<std::endl;}fout<<0<<" "<<y0<<" "<<y0<<std::endl;for(int i=0;i<n;++i){kn=k2=y0+0.5*step*k1;yn=y0+step*kn;double gt=std::pow(e,(i+1)*step);error=std::fabs(gt-yn);std::cout<<(i+1)*step<<std::endl;std::cout<<"y0: "<<y0<<"    k0: "<<k0<<std::endl;std::cout<<"k1: "<<k1<<"    k2: "<<k2<<std::endl;std::cout<<"yn: "<<yn<<"    kn: "<<kn<<std::endl<<"gt: "<<gt<<"    error: "<<error<<std::endl;y0=yn;k1=k0=kn;std::cout<<"\n\n\n\n";fout<<(i+1)*step<<" "<<gt<<" "<<yn<<std::endl;}fout.close();return 0;
}

rk4.cpp

//runge kutta method
#include <iostream>
#include <cmath>
#include <fstream>
int main(int argc, char* argv[]){double e=2.7182818284;double n,error,y0,k0,k1,k2,k3,k4,kn,yn,step;y0=atof(argv[1]);k1=k0=atof(argv[2]);step=atof(argv[3]);n=atoi(argv[4]);std::ofstream fout;fout.open("./data_rk4.txt");if(!fout.is_open()){std::cout<<"open file failed!"<<std::endl;}fout<<0<<" "<<y0<<" "<<y0<<std::endl;for(int i=0;i<n;++i){k2=y0+0.5*step*k1;k3=y0+0.5*step*k2;k4=y0+step*k3;kn=(k1+2*k2+2*k3+k4)/6.0;yn=y0+step*kn;double gt=std::pow(e,(i+1)*step);error=std::fabs(gt-yn);std::cout<<(i+1)*step<<std::endl;std::cout<<"y0: "<<y0<<"    k0: "<<k0<<std::endl;std::cout<<"k1: "<<k1<<"    k2: "<<k2<<"    k3: "<<k3<<"    k4: "<<k4<<std::endl;std::cout<<"yn: "<<yn<<"    kn: "<<kn<<std::endl<<"gt: "<<gt<<"    error: "<<error<<std::endl;y0=yn;k1=k0=kn;std::cout<<"\n\n\n\n";fout<<(i+1)*step<<" "<<gt<<" "<<yn<<std::endl;}return 0;
}

compile&run

cmake -S ./ -B ./build
cmake --build ./build --config Release --parallel 4
./build/euler 1.0 1.0 1 5
./build/midpoint 1.0 1.0 1 5
./build/rk4 1.0 1.0 1 5

曲线图 https://blog.csdn.net/qq_41102371/article/details/125933558
在这里插入图片描述

参考

文中已列出

如有错漏,敬请指正


http://chatgpt.dhexx.cn/article/O6q3X9yk.shtml

相关文章

龙贝格函数求积

龙贝格函数求积 龙贝格函数求积 龙贝格求积公式也称为逐次分半加速法。是数值计算方法之一&#xff0c;用以求解数值积分。是在梯形公式、辛普森公式和柯特斯公式之间关系的基础上&#xff0c;构造出一种加速计算积分的方法。 作为一种外推算法&#xff0c;在不增加计算量的前…

实变函数/实分析总结

一、概述。 实变函数&#xff0c;又叫实分析&#xff0c;整本书满满的证明就讲了一个勒贝格积分。 最为大家所熟知的是用牛顿-莱布尼茨公式算的黎曼积分。但是黎曼积分本身依赖于函数的连续性&#xff0c;像不连续的狄利克雷函数就无法积分了。 为了解决这一问题&#xff0c;…

牛顿柯特斯公式及复合形式、龙贝格求积公式,高斯勒让德求积公式

数值积分的研究实现 牛顿柯特斯公式 柯特斯系数 各阶对应公式 当n 1时&#xff0c;对应的牛顿-柯特斯公式就是是梯形公式 当n 2时&#xff0c;对应的牛顿-柯特斯公式就是辛普森公式 当n 4时&#xff0c;对应的牛顿-柯特斯公式就是柯特斯公式 柯特斯系数表 核心代码实现 …

勒贝格测度?

勒贝格测度&#xff1f; 今天读论文&#xff0c;读到了勒贝格测度&#xff08;Lebesgue measure&#xff09;&#xff0c;不明所以故百度&#xff0c;稍做笔记以记之。 定义 数学上&#xff0c;勒贝格测度是赋予欧几里得空间的子集一个长度、面积、或者体积的标准方法。它广…

Romberg(龙贝格)求积公式求解数值积分时的注意事项

《数值分析》第5版&#xff08;李庆扬编著&#xff09;的第四章课后习题第8-(2)题中&#xff0c;要求使用Romberg(龙贝格)求积公式求解f(x)xsinx在区间[0,2pi]上的积分&#xff0c;要求误差小于10^(-5)。 针对此问题&#xff0c;套用计算公式求解即可。在第一步计算梯形公式时…

勒贝格测度(转)

数学上&#xff0c;勒贝格测度是赋予欧几里得空间的子集一个长度、面积、或者体积的标准方法。它广泛应用于实分析&#xff0c;特别是用于定义勒贝格积分。可以赋予一个体积的集合被称为勒贝格可测&#xff1b;勒贝格可测集A的体积或者说测度记作λ(A)。一个值为∞的勒贝格测度…

利用Matlab编写龙贝格算法(romberg)求函数积分

这次是我初次接触matlab&#xff0c;源于数学老师布置的一个作业&#xff1a;用龙贝格算法来计算函数的积分。 具体的计算原理&#xff0c;由于是数学的东西&#xff0c;不好打印&#xff0c;就不写了。主要把自己的代码贴下来慢慢理解。 一共写了两个文件。一个是romberg.m主要…

数值计算笔记之数值积分(二)龙贝格算法

龙贝格求积公式也称为逐次分半加速法。它是在梯形公式、辛普森公式和柯特斯公式之间的关系的基础上&#xff0c;构造出一种加速计算积分的方法。 作为一种外推算法&#xff0c;它在不增加计算量的前提下提高了误差的精度。 在等距基点的情况下&#xff0c;用计算机计算积分值通…

高斯-勒让德积分学习

高斯-勒让德积分求解函数积分 前言高斯-勒让德积分一般积分区间的归一化Exponential Integral实验参考 前言 梯度和辛普森是经典的几何求积分方法&#xff0c;简单易懂&#xff0c;那如果要更加高档&#xff08;复杂难懂&#xff09;的求积分方法找哪家了&#xff1f;高斯-勒让…

数值积分公式及龙贝格(Romberg)算法实现matlab

一、数值积分方法得基本思想 二、复化求积公式 三、基于复化梯形求积公式的高精度求积算法——Richardson外推法和Romberg算法 四、Romberg算法的matlab程序&#xff1a; function Romberg % 龙贝格(Romberg数值求解公式) % inputs: % -fun&#xff1a;积分函数句柄 % -a/…

数值积分:龙贝格求积

一、数学原理 在变步长的复化梯形计算过程中运用&#xff1a; 就能将粗糙的梯形值Tn逐步加工成精度较高的辛普森值Sn、柯特斯值Cn和龙贝格值Rn。或者说&#xff0c;将收敛缓慢的梯形值序列Tn加工成收敛迅速的龙贝格值序列Rn&#xff0c;这种线性外推的加速方法称为龙贝格算法&…

数值积分之龙贝格积分

除了复化求积外&#xff0c;这里用龙贝格积分法进行近似求积&#xff0c;其原理与埃特金插值有些类似&#xff0c;进行线性整合后使结果具有高精度的求积效果。在实际过程中&#xff0c;由于对于评判合理步长的困难&#xff0c;我们常采取变步长的办法进行计算&#xff0c;使结…

积分极限定理+勒贝格控制收敛定理+高数

在处理积分与极限的交换顺序问题上&#xff0c;勒贝格积分比黎曼积分要求的条件要弱的多&#xff08;并且条件更易于验证&#xff09; 积分与极限交换顺序的定理&#xff1a; 控制收敛定理 { f n ( x ) } 为 E 上 的 一 列 可 测 函 数 \{ f_n(x)\}为E上的一列可测函数 {fn​(…

[转]勒贝格积分的框架与通俗理解

为什么会出现勒贝格积分 这个问题等价于勒贝格积分和黎曼积分有什么区别。其实这个区别没有那么玄&#xff0c;反而很好解释。问题的根源在于黎曼积分的定义上。黎曼积分&#xff1a;.黎曼积分是在轴上做的分割&#xff0c;虽然可以分割得很细&#xff0c;但只要被积函数在这个…

实变函数自制笔记9:勒贝格积分的极限定理

1、非负可测函数积分的极限&#xff1a; 背景&#xff1a;在数学分析里&#xff0c;函数列极限函数黎曼可积性有这样的表述&#xff1a;&#xff0c;且每个均在上可积函数列的极限函数也在上可积&#xff1b;从而有这样的公式&#xff1a;&#xff1b;那我们会想&#xff0c;勒…

实变函数自制笔记8:初识勒贝格积分

1、勒贝格&#xff08;Lebesgue&#xff09;积分&#xff1a; 背景&#xff1a;勒贝格积分是在勒贝格测度论的基础上建立起来的&#xff0c;这一理论可以统一处理函数有界、无界的情形&#xff0c;且函数也可以定义在更一般的点集&#xff08;不一定是&#xff09;上&#xff…

python三阶魔方_三阶魔方还原公式

1. 第二层棱块归位&#xff1a; 2. 顶层十字 3. 顶层棱中间块归位 这一步的目的是使顶层的4个棱中间块全部归位。 转动顶层(U)&#xff0c;若可以使一个棱中间块归位(如下图左&#xff0c;这里以[红-黄]块为例)&#xff0c;而其他3个都不能归位&#xff0c;则将[红-黄]所在这一…

QA和QC到底是什么区别?

QA和QC到底是什么区别? 发现迄今为止,仍然有很多工程师,甚至很多的企业对QA和QC的概念仍然非常的模糊不清.两个概念也经常性的混淆,特别是在互联网公司,那么今天小编这里就对QA和QC到底有什么区别,展开一下讨论. 在讲到软件工程体系中的时候,我们不仅要延伸到从最早通过简单…

生产追溯系统-IQC来料检验

相信大家都知道&#xff0c;任何一家工厂都有自己的仓库&#xff0c;用来存储采购回来的物料&#xff0c;那么在供应商将我们采购的物料送到工厂之后&#xff0c;我们都需要一个检验动作&#xff0c;也就是>IQC来料检验&#xff0c;这个检验动作是非常重要的一个环节&#x…

质量控制之室内质控(IQC)和室间质评(EQA)

检验医学——中华检验医学网旗下微信公众平台。您的随身微杂志。 很多人都有过这样的经历&#xff1a;拿着做过的医疗检查单换一家医院看病&#xff0c;所有的检查还得重做。对患者来说&#xff0c;过多的医疗检查也是造成看病难、看病贵的因素之一。为贯彻落实国务院办公厅《关…