編程實現四階龍哥庫塔法解方程

一、題目要求

編程實現龍格庫塔算法求解微分方程,編程語言可選擇C語言或者Matlab。程序輸出爲給定微分方程的圖像。

二、源程序

一、matlab源程序

% program's name :Solving nonhomogeneous equation

% designer       : Lv Shiqi

% date           :2014-03-14

                 

% 創建了一個10*10的矩陣,裏面的數據是以1爲公差的等差數列,從1一直加到99

y=0:99;

% 這裏的hk都可以改變。圖形就可以進行相應改變。

% k是輸入函數的係數,h是時間間隔

h=0.1;

k=2;

dis=h/2.0;

pre=h/6.0;

 

% C語言不同,matlab的數組下標是從1開始的。

for i=1:99

    k1=k-y(i);

    k2=k-(y(i)+dis*k1);

    k3=k-(y(i)+dis*k1);

    k4=k-(y(i)+h*k3);

    y(i+1)=y(i)+(k1+2*k2+2*k3+k4)*pre;

end

% 這裏表示x是以0.2爲公差的等差數列。從0一直加到19.8,一共100個數

x=0:0.1:9.9;

% 繪圖函數plot,只需要將xy值傳入其中即可繪圖。

plot(x,y)

 

二、C源程序

// Program's name :Solving nonhomogeneous equation

// Designer       :Lv Shiqi

// Date           :2014-03-14

// Version    :Ver0.2

 

#include<stdio.h>

 

#define FAILED    -1

// the time interval is 0.1s, it can be changed

#define h  0.1

// the parameters of the output functiong is 2, it canbe changed

#define k  2

 

int main()

{

    int i;

    double k1, k2, k3, k4;

    double y[100] ={0.0};

    double dis =h/2.0;

    double pre =h/6.0;

    FILE   *fp;

 

    // ifdata.txt does not exist, exit the program

    if((fp=fopen("data.txt","w"))==NULL){

       printf("Cannotopen the file!\n");

       returnFAILED;

    }

   

    for(i = 0;i<99; i++){

       k1  = k-y[i];

       k2  = k-(y[i]+dis*k1);

       k3  = k-(y[i]+dis*k2);

       k4  = k-(y[i]+h*k3);

       y[i+1] = y[i]+(k1+2*k2+2*k3+k4)*pre;  // 對應Yn+1=Yn+(K1+2K2+2K3+K4)*(h/6)

    }

   

    for(i = 0;i<100; i++){

       fprintf(fp,"%f\t%f\n",i*h, y[i]);

    }

 

    fclose(fp);

    system("./mysql.sh");

    return 0;

}

三、matlab實現的圖形


四、C語言實現的圖形


五、數據分析

本次程序設計中求解的方程式爲:Ty’(t)+y(t)=Ku(t),其中u(t)是階躍函數。在我的程序中T=1,K=2,y(0)=0。

      通過上部分展現的圖形可以看出,圖形最終會趨近於一個常數,而這個常數就是K,即2,而且,圖像增長的速度是先快後慢。而且,在測試程序的時候我改小了T值,圖像會更陡,改大了T值,圖像會更加平緩。

      而通過人工計算,方程解應該是y(t)=K(1-et/T),通過分析,這個函數的圖像最後會趨近於K,而且T越大,圖像越平緩,T越小,圖像越陡。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章