C++实现经典四阶龙格库塔法解一阶微分方程

算法原理
用在几个不同点的数值加权平均来代替的值,而使截断误差的阶数尽可能高。我们用四个不同点上的函数值的线性组合,将精度提高到四阶就可以得到四阶龙格-库塔公式。四阶龙格-库塔方法(RK4)可模拟N=4的泰勒方法的精度。这种算法可以描述为,自初始点开始进行计算。

求解微分方程组

这里写图片描述

//#include <iostream>
//#include <iomanip>
using namespace std;
void RK4(double(*f)(double t, double x, double y), double(*g)(double t, double x, double y), double initial[3], double resu[3], double h)
//定义函数
{
	double f1, f2, f3, f4, g1, g2, g3, g4, t0, x0, y0, x1, y1;
	t0 = initial[0]; x0 = initial[1]; y0 = initial[2];
	f1 = f(t0, x0, y0);                      g1 = g(t0, x0, y0);
	f2 = f(t0 + h / 2, x0 + h*f1 / 2, y0 + h*g1 / 2);   g2 = g(t0 + h / 2, x0 + h*f1 / 2, y0 + h*g1 / 2);
	f3 = f(t0 + h / 2, x0 + h*f2 / 2, y0 + h*g2 / 2);   g3 = g(t0 + h / 2, x0 + h*f2 / 2, y0 + h*g2 / 2);
	f4 = f(t0 + h, x0 + h*f3, y0 + h*g3);         g4 = g(t0 + h, x0 + h*f3, y0 + h*g3);
	x1 = x0 + h*(f1 + 2 * f2 + 2 * f3 + f4) / 6;         y1 = y0 + h*(g1 + 2 * g2 + 2 * g3 + g4) / 6;
	resu[0] = t0 + h; resu[1] = x1; resu[2] = y1;
}
int main()
{
	double f(double t, double x, double y);   //函数申明
	double g(double t, double x, double y);   //函数申明
	double initial[3], resu[3];
	double a, b, H;
	double step;
	int i;
	cout << "输入所求微分方程组的初值t0,x0,y0:";
	cin >> initial[0] >> initial[1] >> initial[2];
	cout << "输入所求微分方程组的微分区间[a,b]:";
	cin >> a >> b;
	cout << "输入所求微分方程组所分解子区间的个数step:";
	cin >> step;
	cout << setiosflags(ios::right) << setiosflags(ios::fixed) << setprecision(10);
	H = (b - a) / step;
	cout << initial[0] << setw(18) << initial[1] << setw(18) << initial[2] << endl;
	for (i = 0; i < step; i++)
	{
		RK4(f, g, initial, resu, H);
		cout << resu[0] << setw(20) << resu[1] << setw(20) << resu[2] << endl;
		initial[0] = resu[0]; initial[1] = resu[1]; initial[2] = resu[2];
	}
	system("pause");
	return(0);
}
//定义微分方程组
double f(double t, double x, double y)    
{
	double dx;
	dx = x + 2 * y;
	return(dx);
}
double g(double t, double x, double y)
{
	double dy;
	dy = 3 * x + 2 * y;
	return(dy);
}
  • 9
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_长风_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值