数值计算——龙格库塔法—常微分方程的初值问题(附代码)

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.实例求解

数值计算——龙格库塔法—常微分方程的初值问题(附代码)_第1张图片

3.输出结果

数值计算——龙格库塔法—常微分方程的初值问题(附代码)_第2张图片

4.程序源代码

//龙格——库塔法求解初值问题,常微分方程求解,传染病预测
//开发人员:chenshuai  开发日期:2019.11.5  邮箱:[email protected] 

#include "pch.h"
#include 
#include 
#include 
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;
	vectory(num);
	vectort(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<

 

你可能感兴趣的:(数值计算,研究生数学,c++)