c++实现龙格库塔经典四阶算法

  • 1. 龙格-库塔(Runge-Kutta)方法简介
    • 经典四阶法
  • 2. 原文章中使用的是matlab直接转换出来的c语言代码,拷贝到编译器后会出现很多error,所以索性用c++重写,顺便做个记录

1. 龙格-库塔(Runge-Kutta)方法简介

经典四阶法

在各种龙格-库塔法当中有一个方法十分常用,以至于经常被称为“RK4”或者就是“龙格-库塔法”。该方法主要是在已知方程导数和初值信息,利用计算机仿真时应用,省去求解微分方程的复杂过程。令初值问题表述如下。

对于该问题的RK4由如下方程给出:

其中

这样,下一个值(yn+1)由现在的值(yn)加上时间间隔(h)和一个估算的斜率的乘积所决定。该斜率是以下斜率的加权平均:

k1是时间段开始时的斜率;

k2是时间段中点的斜率,通过欧拉法采用斜率k1来决定y在点tn+h/2的值;

k3也是中点的斜率,但是这次采用斜率k2决定y值;

k4是时间段终点的斜率,其y值用k3决定。

当四个斜率取平均时,中点的斜率有更大的权值:

RK4法是四阶方法,也就是说每步的误差是h阶,而总积累误差为h阶。

注意上述公式对于标量或者向量函数(y可以是向量)都适用。

以上内容来自链接:https://www.jianshu.com/p/e4aa9a688959


2. 原文章中使用的是matlab直接转换出来的c语言代码,拷贝到编译器后会出现很多error,所以索性用c++重写,顺便做个记录

  1. 代码参照原文,对其中的一些变量和算法中的过程做了简单注释
  2. 对容易崩溃的指针操作点进行了使用前检查
#include <iostream>double dEPS = 1.0e-16; //精度
//---------------------网上的例子--------------------------
double* Func_aa(double* R, int R_size, double* const dRdt) {std::fill(dRdt, dRdt + R_size, 0.0);if (R_size <= 0) return dRdt;dRdt[0] = R[1];      /*y0'=y1*/dRdt[1] = -R[0];     /*y1'=y0*/dRdt[2] = -R[2];     /*y2'=y2*/return dRdt;
}//---------------------下面是龙格库塔函数---------------------
using Func_xx = double* (*)(double* R, int R_size, double* const dRdt);/* 参数说明
* param_num:微分方程中未知数的个数
* step:     积分的步数(包括这一步)
* start_t   积分的起点
* steplength:积分的步长
* R0:       方程Func_xx的初始值入参
* z[]:      二维数组,体积为 param_num * step , 返回step个积分点上的param_num个函数值
*/
void RKT(const int& param_num, int step, double start_t, double steplength,
double* R0, double* z, Func_xx myFunc)
{double* inparam_buf = nullptr;        //输入参数的缓存double* inparam = nullptr;            //当前输入参数double* valueOut = nullptr;        //myFunc的结果if (param_num < 1){std::cout << "error:积分参数个数为0" << std::endl;return;}int bufsize = param_num * sizeof(double);valueOut = (double*)malloc(bufsize);inparam_buf = (double*)malloc(bufsize);inparam = (double*)malloc(bufsize);if (inparam_buf == nullptr|| inparam == nullptr|| valueOut == nullptr){std::cout << "内存分配失败" << std::endl;return;}double a[3] = { 0 };// 初始化龙格库塔公式中的系数    a[0] = steplength / 2.0;       //这是用来求k2的时候用的 1/2a[1] = steplength / 2.0;     //k2的系数 a[2] = steplength;             //k3的系数 a[3] = steplength;             //k4的系数memcpy(inparam, R0, bufsize);    // 输入初始化// 二维数组初始化for(size_t i = 0 ; i < param_num ; ++i){z[i] = inparam[i]; //使用第一组参数初始化第一次的结果}for (size_t w = 1; w < step; ++w){myFunc(inparam, param_num, valueOut);for (size_t p_index=0; p_index < param_num; ++p_index ){inparam_buf[p_index] = inparam[p_index]; //初值}for (size_t f = 0; f < 3; ++f){for (size_t yi = 0 ; yi < param_num ; ++yi){//  y(tn) = yn; //yn + +a[i] * k1inparam[yi] = z[(w - 1) * param_num + yi] + a[f] * valueOut[yi];  //yn+1 = yn + h/6(k1+k2+k3+k4)inparam_buf[yi] = inparam_buf[yi] + a[f + 1] * valueOut[yi] / 3.0;}myFunc(inparam, param_num, valueOut);}for (size_t i = 0 ; i < param_num ; ++i){//最后的加上k4/6,因为前三次只有k1+k2+k3的合inparam[i] = inparam_buf[i]  + steplength * valueOut[i] / 6.0;}for (size_t i= 0 ; i<param_num ; ++i){z[w * param_num + i] = inparam[i];            //保存每次的结果}start_t = start_t + steplength;                 // tn = tn-1 + steplength}free(inparam_buf);free(inparam);free(valueOut);valueOut = NULL;inparam_buf = NULL;inparam = NULL;
}// main.cpp
int main()
{double end_t = 0.0001;double start_t = 0.0;const int step = 512;const int paramnum = 3;double R[3] = { 2,3,4 };double dRdt[3] = { 0 };double* z = new double[step * paramnum];RKT(paramnum, step, start_t, end_t / step, R, z, Func_aa);double zz[step][paramnum] = { 0 };memcpy(zz, z, sizeof(double) * paramnum*step); //zz[i]表示每次的结果数组一共512组数据system("pause");
}

结果如图:

c++实现 龙格库塔经典4阶算法相关推荐

  1. [计算机数值分析]四阶龙格-库塔经典格式解常微分方程的初值问题

    龙格-库塔方法的设计思想: 四阶龙格-库塔方法的经典格式: 程序设计框图: 例:设取步长h=0.2,从x=0到x=1用四阶经典格式解决以下常微分方程的初值问题. 运行示例: 源码: #include& ...

  2. 4阶经典龙格库塔格式

    %用途:4阶经典龙格库塔格式解常微分方程组y'=f(x,y),y(x0)=y0 %格式:[x,y]=marunge4s(dyfun,xspan,y0,h) %dyfun为向量函数f(x,y),xspa ...

  3. Ode45以及龙格-库塔算法

    Ode45及龙格-库塔算法 ODE45 ODE45函数描述: 求解非刚性微分方程 - 中阶方 ODE是Matlab专门用于解微分方程的功能函数.该求解器有变步长(variable-step)和定步长( ...

  4. 捷联惯导基础知识之一(姿态更新的毕卡算法、龙格库塔算法、及精确数值解法)

    一.介绍旋转矢量以及由旋转矢量更新四元数 等效旋转矢量微分方程(Bortz方程): 经过理论和近似推导: 单位四元数与旋转矢量关系: 单位四元数与三角函数的关系: 四元数更新方程:利用旋转矢量,考虑了 ...

  5. 四阶龙格库塔c语言,四阶龙格库塔算法的C语言实现

    解微分方程 2001年3月焦作大学学报 JOURNALOFJIAOZUOUNIVERSITY№ 1Mar.2001第1期 四阶龙格一库塔算法的C语言实现 毋玉芝 (焦作财会学校) 摘要本文叙述了四阶龙 ...

  6. 四阶龙格库塔算法用MATLAB写

    四阶龙格-库塔算法可以使用 MATLAB 进行编写.您可以使用 MATLAB 的数值解法工具箱来解决常微分方程组,并使用相应的函数(例如 ode45)来实现四阶龙格-库塔算法.在编写代码时,您需要根据 ...

  7. matlab:使用4阶龙格库塔方法求解常微分方程组

    %书籍:常用数值算法及其matlab实现 %第10章 常微分方程初值问题的数值解法,例10.14使用 %四阶龙格库塔方法 function [t,z] = rk4symeq(fun, t0, tf, ...

  8. matlab:使用4阶龙格库塔方法求微分方程组的值

    参考书目:<数值分析(matlab版)>  作者:周璐 翻译 %调用龙格库塔方法求解微分方程组,P399,9.7 微分方程组 function [t,z] = my_rk4b(f, t0, ...

  9. 龙格-库塔(Runge-Kutta)方法数学原理及实现

    参考:https://blog.csdn.net/u013007900/article/details/45922331 龙格-库塔(Runge-Kutta)方法 龙格-库塔(Runge-Kutta) ...

  10. 龙格-库塔(Runge-Kutta)法解微分方程

    龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法.由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂.该算法是构建在数学支持的基础之上的. 对于一阶精度的欧 ...

最新文章

  1. js之浅拷贝和深拷贝
  2. Nagios 监控实例部署
  3. 应用内评分_游戏评分低,怎么办?
  4. sketch软件_Sketch又又又又卡了,设计师你的电脑总是卡怎么办?
  5. PMCAFF产品经理第一课 | 杭州站 现场集锦
  6. 关于npm和yarn 安装vue脚手架
  7. 每日一笑 | 史上最贴心的骗子
  8. pandas数据分析选则接近数值的最接优方案
  9. Science子刊:喝酒脸红的人,患胃癌风险大增,他们都有同一个基因突变
  10. mysql page directory_【innodb】page directory的二分查找问题
  11. 传智Python视频_基础班+就业班
  12. linux 卸载系统服务,Linux卸载系统自带的httpd的方法
  13. 学习web前端历程(十七)
  14. VMware安装最新版CentOS7图文教程
  15. 茴香豆的“茴”有几种写法?单例模式你知道有几种写法?
  16. Qgis教程09:高程栅格数据
  17. 计算机内存和外存的作用,内存和外存的主要区别之处竟是在这里!
  18. 什么是5G消息?有什么应用价值?如何开通服务?
  19. POI和EasyExcel实现Excel数据批量读取到数据库
  20. Hbook笔记 - 免费、简约、大方的Markdown笔记

热门文章

  1. codesys 轴程序
  2. 软件开发流程:软件运维流程
  3. 我对数据分析的几点感悟
  4. vue 中基于drag drop拖放实现左菜单和右画布的功能
  5. 山东法律学校97级二班计算机班,关于表彰全国三好学生、全国优秀学生干部和全国先进班集体及其标兵的决定...
  6. 服务器cpu天梯图_2019年CPU单核跑分天梯图
  7. python 赚钱 知乎_2020年,小红书、知乎与B站谁能赚钱?
  8. 山大软件项目管理复习整理
  9. SpringBoot 整合 kaptcha + redis 实现 图形验证码登录
  10. 鸿蒙应用开发 | 时间选择器(TimePicker)的功能和用法