kkkttt 发表于 2005-7-20 08:05

龙格库塔求解微分方程数值解

工程中很多的地方用到龙格库塔求解微分方程的数值解,
龙格库塔是很重要的一种方法,尤其是四阶的,精确度相当的高。

此代码只是演示求一个微分方程
/*y'=y-2x/y,x∈
/*y(0)=1
的解,要求解其它的微分方程,可以自己定义借口函数,退换程序里面的函数:

float f(float , float)即可;

/*
/*编程者:刘艮平
/*完成日期:2004.5.29
/*e.g:y'=y-2x/y,x∈
/*  y(0)=1
/*使用经典四阶龙格-库塔算法进行高精度求解 
/* y(i+1)=yi+( K1+ 2*K2 +2*K3+ K4)/6
/* K1=h*f(xi,yi)
/* K2=h*f(xi+h/2,yi+K1/2)
/* K3=h*f(xi+h/2,yi+K2/2)
/* K4=h*f(xi+h,yi+K3)
*/
#include <stdio.h>
#include <math.h>

float f(float den,float p0)//要求解的微分方程的右部的函数 e.g: y-2x/y
{
        float rus;
//   den=w/(W0+sl);
//   rus=k*A*f/Wp*sqrt(RTp)-(k-1)*.....
        rus=p0-2*den/p0;
        return(rus);
}

//float fden()
//{

//}


void main()
{
        float x0; //范围上限
        int x1;   //范围下限
        float h;//步长
        int n;    //计算出的点的个数
        float k1,k2,k3,k4;
    float y; //用于存放计算出的常微分方程数值解
        int i=0;
        int j;

//以下为函数的接口
        printf("intput x0:");
    scanf("%f",&x0);

        printf("input x1:");
        scanf("%f",&x1);

    printf("input y:");
    scanf("%f",&y);

        printf("input h:");
    scanf("%f",&h);

// 以下为核心程序
    n=((x1-x0)/h);
        n=3;
       
    for(j=0;j<n;j++)
        {   

      k1=h*f(x0,y); //求K1
      k2=h*f((x0+h/2),(y+k1/2)); //求K2
      k3=h*f((x0+h/2),(y+k2/2)); //求K3
      k4=h*f((x0+h),(y+k3)); //求K4

          y=y+((k1+2*k2+2*k3+k4)/6); //求yi+1
          x0+=float(0.2);
      printf("y[%f]=%f\n",x0,y);
      ++i;
       
        }

}

[ 本帖最后由 风花雪月 于 2006-10-11 15:45 编辑 ]

pheigenbau 发表于 2006-6-25 00:51

我想学偏微分方程的数值解法

lihuaifu 发表于 2006-8-11 20:12

谢谢~等我仔细看看有没有关于非线性微分方程组的问题!

yut_o 发表于 2006-10-11 15:20

楼主有没有关于RK解微分方程组的程序啊

风花雪月 发表于 2006-10-11 15:48

原帖由 yut_o 于 2006-10-11 15:20 发表
楼主有没有关于RK解微分方程组的程序啊

这个就是rk法解微分方程的C语言程序
页: [1]
查看完整版本: 龙格库塔求解微分方程数值解