数值积分方法:欧拉积分、中点积分和龙格-库塔法积分
目录
- 写在前面
- 原理
- 代码
- 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=exy=e^xy=ex的积分,y(0)=e(0)=1,y′(0)=e(0)=1y(0)=e^{(0)}=1, y'(0)=e^{(0)}=1y(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
参考
文中已列出
完
如有错漏,敬请指正
数值积分方法:欧拉积分、中点积分和龙格-库塔法积分相关推荐
- 【数值积分(欧拉积分、Velet积分与蛙跳积分)】
数值积分(欧拉积分.Velet积分与蛙跳积分) 数值积分 级数展开与积分 Velet积分 蛙跳积分 数值积分 我们使用的各种数值积分方法都是对积分做近似,近似的本质类似于泰勒级数展开式.在实际模拟中, ...
- 计算机方法欧拉,欧拉方法详解
高中牛顿力学回顾 有一个具有一定速度在运动的物体: 当我们需要对其进行模拟时,自然会想起高中的 位移 = 速度 * 时间,即: $$s = v * t$$ 而当该物体具有恒定加速度(恒力)时: 我们可 ...
- 求互质数对的两种方法:欧拉函数和容斥原理
1.HDU4135 首先,我们可以先求出1 ~ a - 1内与n互质的数,再求出1 ~ b内与n互质的数.最后利用前缀和算出来即可. #include <iostream> #includ ...
- 常见的数值积分方法_欧拉积分/中值积分/龙格-库塔积分
参考:常见的数值积分方法 (欧拉.中值.龙格-库塔,[常用于IMU中]) 1. 积分基本概念 设F(x)为函数f(x)的一个原函数,我们把函数f(x)的所有原函数F(x)+C(C为任意常数)叫做函数f ...
- 6.1 欧拉方法与改进欧拉方法
6.1.1 欧拉方法 欧拉方法是一种数值解常微分方程(ODE)的方法,可以用于近似求解给定的初值问题.它是以欧拉命名的瑞士数学家莱昂哈德·欧拉所发明的,因此得名. 欧拉方法的基本思路是将连续的常微分方 ...
- 欧拉编程c语言作业数值分析,数值分析作业 欧拉 龙格库塔
<数值分析作业 欧拉 龙格库塔>由会员分享,可在线阅读,更多相关<数值分析作业 欧拉 龙格库塔(5页珍藏版)>请在人人文库网上搜索. 1.9.2对初值问题试用欧拉方法取步长h= ...
- 一阶欧拉近似matlab,MATLAB改进欧拉法与四阶龙格-库塔求解一阶常微分方程.doc
MATLAB改进欧拉法与四阶龙格-库塔求解一阶常微分方程 姓名:樊元君 学号:2012200902 日期:2012.11.06 一.实验目的 掌握改进欧拉法与四阶龙格-库塔求解一阶常微分方程的初值问题 ...
- VIO-SLAM中的欧拉积分、中点积分与龙格-库塔积分
在 SLAM 系统中经常用到各种不同的数值积分方法,工程上最常见的有三种:欧拉积分(Euler method).中点积分(Midpoint method)和龙格-库塔法积分(Runge–Kutta m ...
- 常用的积分方法讨论(数学表达与代码整理)(龙格-库塔、中值积分、欧拉积分)
积分方法讨论(数学表达与代码整理) 数学原理 1.1 四元数与角速度的关系 在无人机或无人车的导航系统中常常采用四元数代替欧拉角来表示机体的旋转,因为欧拉角在计算过程中容易产生奇异,这与欧拉角的计算需 ...
最新文章
- 物联网是怎样把世界联系起来的
- linux 内核打印函数 printk 用法
- 封装运动框架多个属性
- python优秀程序员条件_Python 条件语句
- rocksdb学习笔记
- SharePoint上传循环添加label并获取上传文件名字的扩展名和文件大小(Session[demo] = new ListLabel();方法实现)...
- 推荐Chrome一款大气典雅神秘的主题 - 黑色系
- gradle 命令行_Gradle命令行便利
- Java中操作Excel的3种方法,太好用了!
- 分享几个大数据相关岗位的职责和面试问题
- linux: 命令行运行php Run PHP from the command line
- 问题记录 | 配置ubuntu18.04+cuda9.0+cudnn服务器tensorflow-gpu深度学习环境
- CTU Open Contest 2019 J Beer Vison
- Windows2008 Server r2 64位显示桌面图标的方法
- spring boot区分生产环境和开发环境
- android真机调试
- Java的PDF分页操作:分页读取、分页拆分
- python 批量更改扩展名
- 2020年9月份英语六级翻译-西游记
- PC端打不开微信公众号文章、微信图片加载超缓慢的处理方法(最全的解决方法)
热门文章
- linux 文件夹同步备份软件下载,rsync从linux到linux的文件同步备份方法_rsync在linux下同步备份教程_飞翔教程...
- 新手入门前端与后端交互案例(HTML+Java+Axios)
- 2021年行业主流的苹果手表充电器芯片及方案
- vim编辑器 底色阴影解除
- int8_t int16_t int32_t等数据类型的定义
- python画星空的程序_Python Tkinter 应用程序窗口
- 从零开始搭建Kafka+SpringBoot分布式消息系统
- 关于initrd和initramfs
- Sqlserver数据从服务器备份到本地
- 数字化转型的5个支柱6个趋势