定步长,可以在稍微修改之后变为变步长形式,代码如下:

void rkf78c( double h, double& T, vxd& X, double& err)
{
    int N = X.size();

    vxd X1(N);
    ;
    vxd Y0(N), Y1(N), Y2(N), Y3(N), Y4(N), Y5(N), Y6(N), Y7(N), Y8(N), Y9(N), Y10(N), Y11(N), Y12(N);

    ; i != N ; i++)
    {
        X1[i] = X[i];
    }
    T1 = T;
    dxdt(T1, X1, Y0);

    ; i != N ; i++)
    {
        X1[i] = X[i] + h*2.0/27.0*Y0[i];
    }
    T1 = T + h*2.0/27.0;
    dxdt(T1, X1, Y1);

    ; i != N ; i++)
    {
        X1[i] = X[i] + h*(Y0[i]+3.0*Y1[i])/36.0;
    }
    T1 = T + h*1.0/9.0;
    dxdt(T1, X1, Y2);

    ; i != N ; i++)
    {
        X1[i] = X[i] + h*(Y0[i]+3.0*Y2[i])/24.0;
    }
    T1 = T + h*1.0/6.0;
    dxdt(T1, X1, Y3);

    ; i != N ; i++)
    {
        X1[i] = X[i] + h*(Y0[i]*20.0+(-Y2[i]+Y3[i])*75.0)/48.0;
    }
    T1 = T + h*5.0/12.0;
    dxdt(T1, X1, Y4);

    ; i != N ; i++)
    {
        X1[i] = X[i] + h*(Y0[i]+Y3[i]*5.0+Y4[i]*4.0)/20.0;
    }
    T1 = T + h*1.0/2.0;
    dxdt(T1, X1, Y5);

    ; i != N ; i++)
    {
        X1[i] = X[i] + h*(-Y0[i]*25.0+Y3[i]*125.0-Y4[i]*260.0+Y5[i]*250.0)/108.0;
    }
    T1 = T + h*5.0/6.0;
    dxdt(T1, X1, Y6);

    ; i != N ; i++)
    {
        X1[i] = X[i] + h*(Y0[i]*93.0+Y4[i]*244.0-Y5[i]*200.0+Y6[i]*13.0)/900.0;
    }
    T1 = T + h*1.0/6.0;
    dxdt(T1, X1, Y7);

    ; i != N ; i++)
    {
        X1[i] = X[i] + h*(Y0[i]*180.0-Y3[i]*795.0+Y4[i]*1408.0-Y5[i]*1070.0+Y6[i]*67.0+Y7[i]*270.0)/90.0;
    }
    T1 = T + h*2.0/3.0;
    dxdt(T1, X1, Y8);

    ; i != N ; i++)
    {
        X1[i] = X[i] + h*(-Y0[i]*455.0+Y3[i]*115.0-Y4[i]*3904.0+Y5[i]*3110.0-Y6[i]*171.0+Y7[i]*1530.0-Y8[i]*45.0)/540.0;
    }
    T1 = T + h*1.0/3.0;
    dxdt(T1, X1, Y9);

    ; i != N ; i++)
    {
        X1[i] = X[i] + h*(Y0[i]*2383.0-Y3[i]*8525.0+Y4[i]*17984.0-Y5[i]*15050.0+Y6[i]*2133.0+Y7[i]*2250.0+Y8[i]*1125.0+Y9[i]*1800.0)/4100.0;
    }
    T1 = T + h;
    dxdt(T1, X1, Y10);

    ; i != N ; i++)
    {
        X1[i] = X[i] + h*(Y0[i]*60.0-Y5[i]*600.0-Y6[i]*60.0+(Y8[i] -Y7[i] +2.0*Y9[i])*300.0)/4100.0;
    }
    T1 = T;
    dxdt(T1, X1, Y11);

    ; i != N ; i++)
    {
        X1[i] = X[i] + h*(-Y0[i]*1777.0-Y3[i]*8525.0+Y4[i]*17984.0-Y5[i]*14450.0+Y6[i]*2193.0+Y7[i]*2550.0+Y8[i]*825.0+Y9[i]*1200.0+Y11[i]*4100.0)/4100.0;
    }
    T1 = T + h;
    dxdt(T1, X1, Y12);

    err = 0.0;
    ; i != X.size(); i++)
    {
        X[i] += h*(Y5[i]*272.0+(Y6[i]+Y7[i])*216.0+(Y8[i]+Y9[i])*27.0+(Y11[i]+Y12[i])*41.0)/840.0;
        err += fabs((Y0[i]+Y10[i]-Y11[i]-Y12[i])*h*41.0/840.0);
    }
    T += h;
}

定步长的龙格库塔7(8)阶C++程序(RKF78)的更多相关文章

  1. MATLAB常微分方程数值解——欧拉法、改进的欧拉法与四阶龙格库塔方法

    MATLAB常微分方程数值解 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1.一阶常微分方程初值问题 2.欧拉法 3.改进的欧拉法 4.四阶龙格库塔 ...

  2. 用python面向对象的方法实现欧拉算法和龙格库塔算法

    #!/bin/python3 # -*-coding:utf-8 -*- import math import numpy as np #定义一个欧拉算法的类,从而实现不同步长的引用 class Eu ...

  3. 【C/C++】龙格库塔+亚当姆斯求解数值微分初值问题

    /* 解数值微分初值问题: 龙格-库塔法求前k个初值 + 亚当姆斯法 */ #include<bits/stdc++.h> using namespace std; double f(do ...

  4. 龙格-库塔法解常微分方程(c++)

    用龙格库塔法计算 #include <iostream> #include<iomanip> #include <cmath> using namespace st ...

  5. MATLAB学习笔记(七)——MATLAB解方程与函数极值

    (一)线性方程组求解 包含n个未知数,由n个方程构成的线性方程组为: 其矩阵表示形式为: 其中 一.直接求解法 1.左除法 x=A\b; 如果A是奇异的,或者接近奇异的.MATLAB会发出警告信息的. ...

  6. 软件推荐-国内参数优化软件:1stOpt - First Optimizationg

    首页:http://www.7d-soft.com/index.htm 4.0新功能 (预定2010年8月6日): 1:支持复数拟合.复数方程组计算: 2:支持微分方程拟合求解: 3:通用全局优化求解 ...

  7. 相机IMU融合四部曲(二):误差状态四元数详细解读

    相机IMU融合四部曲(二):误差状态四元数详细解读 极品巧克力 前言 上一篇文章,<D-LG-EKF详细解读>中,讲了理论上的SE3上相机和IMU融合的思想.但是,还没有涉及到实际的操作, ...

  8. MATLAB数学实验总结

    L1 MATLAB 基础知识 P6 表1-3 数据显示格式 format rat format long P20 表2-5 常用的矩阵函数 zeros(m,n) %零阵 eye(n) %单位阵 one ...

  9. 多重网格法简介(Multi Grid)

    原文链接 多重网格法是一种用于求解方程组的方法,可用于插值.解微分方程等. 从专业角度讲多重网格法实际上是一种多分辨率的算法,由于直接在高分辨率(用于求解的间隔小)上进行求解时对于低频部分收敛较慢,与 ...

随机推荐

  1. Linux对于录音

    一.原理简介 在Linux下,记录--从dsp读取数据.播放--至dsp设备写入数据. 开发板採用声卡UDA1341实现音频编解码,完毕A/D和D/A转换,芯片UDA1341与CPU的连接图例如以下: ...

  2. 基于注释配置bean和装饰bean

    1.组件扫描 Spring容器能够从classpath(类路径)下自动扫描.侦测和实例化具有特定注释的组件. 2.特定注释组件 –@Component: 基本注解, 标识了一个受 Spring 管理的 ...

  3. Swift——(两)Swift访问元组

    在Swift在,获取元组的值到一个位置,通过三种方法: 1.使用元组变量/常量     @Author: twlkyao转载或者引用请保留此行. let http404Error = (404, &q ...

  4. css 鼠标提示样式预览表[转]

    语法: cursor : auto | all-scroll | col-resize| crosshair | default | hand | move | help | no-drop | no ...

  5. XMLHttpRequest创建对象

    首先,介绍一下XMLHttpRequest对象,我们都知道Ajax这不是一个简单的技术,但一些技术的融合.XMLHttpRequest这是Ajax中最为核心的技术.假设没有XMLHttpRequest ...

  6. 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)

    原文:各种加密解密函数(URL加密解密.sha1加密解密.des加密解密) 普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语 ...

  7. hdu 4864 Task(贪婪啊)

    主题链接:pid=4864">http://acm.hdu.edu.cn/showproblem.php?pid=4864 Task Time Limit: 4000/2000 MS ...

  8. 【百度地图API】如何进行地址解析与反地址解析?——模糊地址能搜索到精确地理信息!

    原文:[百度地图API]如何进行地址解析与反地址解析?--模糊地址能搜索到精确地理信息! 摘要: 什么是地址解析? 什么是反地址解析? 如何运用地址解析,和反地址解析? 可以同时运用地址解析,和反地址 ...

  9. PHP_零基础学php

    现在学习php的工具有很多,所以一般没必要去搭建环境,我用的工具是phpstudy,IDE是Eclipse 1,用php输出一段文字 <html> <head> <tit ...

  10. SSAS系列——【03】多维数据(多维数据集对象)

    原文:SSAS系列--[03]多维数据(多维数据集对象) 1.什么是Cube? 简单 Cube 对象由基本信息.维度和度量值组组成. 基本信息包括多维数据集的名称.多维数据集的默认度量值.数据源和存储 ...