數值計算——龍格庫塔法—常微分方程的初值問題(附代碼)

1.四階龍格—庫塔法

                                                              \left\{\begin{matrix} y_{n+1}=y_{n}+\frac{h}{6}(k_{1}+2k_{2}+2k_{3}+k_{4})\\ k_{1}=f\left ( x_{n} ,y_{n} \right ) \\ k_{2}=f\left ( x_{n}+\frac{1}{2}h ,y_{n}+\frac{1}{2}k_{1} \right ) \\ k_{3}=f\left ( x_{n}+\frac{1}{2}h ,y_{n}+\frac{1}{2}k_{2} \right )\\ k_{4}=f\left ( x_{n}+h ,y_{n}+hk_{3} \right ) \end{matrix}\right.

2.實例求解

3.輸出結果

4.程序源代碼

//龍格——庫塔法求解初值問題,常微分方程求解,傳染病預測
//開發人員:chenshuai  開發日期:2019.11.5  郵箱:[email protected] 

#include "pch.h"
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
#define  h  0.1  //步長
#define  k  0.000002   //感染別人的人數變化的速率
#define  m  100000     //人口總數
double diff_equation(double x, double y);//聲明微分方程
double diff_equation(double x, double y)
{
	double f;
	f = k * (m - y)*y;
	return f;
}
double Runge_kutta(double x);//聲明龍格——庫塔法求解常微分方程初值問題
double Runge_kutta(double x)
{
	int num;
	double yy=0;
	num =int ( x / h)+1;
	double k1, k2, k3, k4;
	vector<double>y(num);
	vector<double>t(num);
	t[0] = 0;y[0] = 1000;
	for (int i = 0; i < num; i++)
	{
		k1 = diff_equation(t[i], y[i]);
		k2=  diff_equation(t[i]+0.5*h, y[i]+0.5*h*k1);
		k3 = diff_equation(t[i] + 0.5*h, y[i] + 0.5*h*k2);
		k4 = diff_equation(t[i] + h, y[i] + h*k3);
		if (i < num-1)
		{
		y[i + 1] = y[i] + double(1.0 / 6) * h*(k1 + 2 * k2 + 2 * k3 + k4);
		t[i + 1] = t[i] + h;
		}
	}
	return y[num-1];
}
//主函數
int main()
{
	double t = 30,y_t;      //輸入t時刻,y表示輸出感染別人的人口數量
		y_t=Runge_kutta(t);
		cout << "30天結束感染別人的人口數量:" << fixed << setprecision(0) << setw(6) << y_t << endl << endl << endl<<endl<<endl;
}

 

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