[计算机数值分析]四阶龙格-库塔经典格式解常微分方程的初值问题

龙格-库塔方法的设计思想:

在这里插入图片描述

四阶龙格-库塔方法的经典格式:

在这里插入图片描述
程序设计框图:

在这里插入图片描述
例:设取步长h=0.2,从x=0到x=1用四阶经典格式解决以下常微分方程的初值问题。

在这里插入图片描述

  • 运行示例:

在这里插入图片描述

  • 源码:
#include<iostream>
#include<iomanip>
double f(double x, double y);   
double f1(double x);

using namespace std;

int main(void)
{
    
    
	double x0, y0, h;   //x0,y0为初值;h为步长
	double x1, y1;   //步进后的新值
	double K1, K2, K3, K4;   //四阶经典格式中的斜率
	int N;   //N为步数

	cout << "请输入初值:";
	cin >> x0 >> y0;

	cout << "请输入步长:";
	cin >> h;

	cout << "请输入步数:";
	cin >> N;

	//输出提示信息
	int i = 1;
	cout << "\t" << setw(10) << "xn" << "\t" << setw(10) << "yn" << "\t" << setw(10) << "y(xn)" << endl;

	for (i; i <= N; i++)
	{
    
    
		x1 = x0 + h;   //离散点
		//求斜率
		K1 = f(x0, y0);
		K2 = f(x0 + h / 2, y0 + h / 2 * K1);
		K3 = f(x0 + h / 2, y0 + h / 2 * K2);
		K4 = f(x1, y0 + h * K3);
		//求新值
		y1 = y0 + h / 6 * (K1 + 2 * K2 + 2 * K3 + K4);
		//输出本次步进后的离散点数据
		cout << i << "\t" << setw(10) << x1 << "\t" << setw(10) << y1 << "\t" << setw(10) << f1(x1) << endl;
		//把新的值赋给旧值,开启下一趟循环
		x0 = x1;
		y0 = y1;
	}

	return 0;
}

double f(double x, double y)   //欧拉格式中的x,y的函数关系式,即f(xn,yn)
{
    
    
	double result;

	result = y - 2 * x / y;

	return result;
}

double f1(double x)   //实际函数解析式
{
    
    
	double result;

	result = sqrt(1 + 2 * x);

	return result;
}

猜你喜欢

转载自blog.csdn.net/weixin_51008866/article/details/116082430