经典四阶龙格库塔法

龙格库塔法

分类: GSL-GNU scientific Library 178人阅读 评论(0) 收藏 举报

目录(?)[+]

龙格库塔法

经典四阶龙格库塔法

龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法,经常被称为“RK4”或者就是“龙格库塔法”。

初值问题表述如下。

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

其中:

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

 

RK4计算程序如下:

复制代码
//visualsan@yahoo.cn
#include <iostream>
using namespace std;

#include <vector>
#include <math.h>
using namespace std;
class RK  
{
public:
    class DiffFunc
    {
    public:
        double operator()(double x,double y)
        {
            // y'=cos(x)
            return cos(x);
            // y'=x*y-1
            //    return x*y-1;
        }
    } m_df;
    
    RK(double xend,double x0,double y0,double h=1e-3)
    {
        m_max_x = xend;
        m_x0 = x0;
        m_y0 = y0;
        m_h = h;
        m_half_h=h/2.0;
    }
    
    void Solve()
    {
        double yn=m_y0,xstart=m_x0;
        while( xstart<m_max_x)
        {
            double y=yn+K(xstart,yn)*m_h;//y(n+1)=y(n)+h*y'
            m_x.push_back(xstart);
            m_y.push_back(yn);
            cout<<xstart<<""<<yn<<endl;
            yn=y;
            xstart+=m_h;
        }    
    }
    //求解后的点
    std::vector<double> m_x,m_y;
    //步长h
    double m_h;
    //初始点x0,y0
    double m_x0,m_y0;
    //x范围
    double m_max_x;
    private:
        double m_half_h;
        double m_ptx,m_pty;
        double  K1(double x,double y)
        {
            double v=m_df(x,y);
            m_ptx=x;
            m_pty=y;
            return v;
        }
        double  K2(double _k1)
        {
            double v=m_df(m_ptx+m_half_h,m_pty+m_half_h*_k1);
            return v;
        }
        double  K3(double _k2)
        {
            
            double v=m_df(m_ptx+m_half_h,m_pty+m_half_h*_k2);
            return v;
        }
        double  K4(double _k3)
        {
            double v=m_df(m_ptx+m_h,m_pty+m_h*_k3);
            return v;
        }
        double  K(double x,double y)
        {
            double _k1=K1(x,y),_k2=K2(_k1),_k3=K3(_k2),_k4=K4(_k3);
            return  (_k1+2.0*_k2+2.0*_k3+_k4)/6.0;
        }
        
};

main()
{
    RK s1(1,0,0);
    s1.Solve();
}
复制代码

 

计算实例:

y'=cos(x)   y(0)=0,   ->   solution  y=sin(x)

 

y'=x*cos(x)   y(0)=0

 

y'=1.0/sqrt(x*x+y*y),y(0)=0.1

经典四阶龙格库塔法是一种常用的数值方,用于求解一阶微分方程组。它是通过将微分方程组离散化为一系列的递推关系,从而得到数值解。 四阶龙格库塔法的基本思想是根据微分方程组的初始条件,逐步逼近解的值。它通过计算多个中间值和加权平均来得到每一步的数值解。具体步骤如下: 1. 给定一阶微分方程组的初始条件。 2. 计算一系列的中间值,使用以下公式: k1 = h * f(tn, yn) k2 = h * f(tn + h/2, yn + k1/2) k3 = h * f(tn + h/2, yn + k2/2) k4 = h * f(tn + h, yn + k3) 其中,h是步长,tn是当前时间点,yn是当前解的值,f是微分方程组的右侧函数。 3. 计算当前时间点的解的值,使用以下公式: yn+1 = yn + (k1 + 2k2 + 2k3 + k4)/6 4. 重复步骤2和步骤3,直到达到所需的时间点或满足停止准则。 通过这样的迭代过程,经典四阶龙格库塔法可以得到一阶微分方程组的数值解。它具有较高的计算精度和较好的收敛性,在工程上被广泛应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [四阶龙格库塔求解一次常微分方程组](https://blog.csdn.net/HelloWorldTM/article/details/112915551)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [四阶龙格库塔法解一阶二元微分方程](https://download.csdn.net/download/tb_dojdo_1/10249898)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值