C++ 实现龙贝格算法

这里以一道例题为例

在这里为了方便计算,直接令

因为格式的原因,许多公式特殊符号复制不过来,成空格了。。

首先定义一个函数fx,方便后续的输入

#include<stdio.h>
#include<iostream>
#include<math.h>
#include <iomanip>
#define e        2.71828182845904523536
#define pi       3.14159265358979323846
using namespace std;

double fx(double  x) {		//令f(x)=	,求f(x)的值
	return 2 * pow(e, -1.0*x) / sqrt(pi);
}

然后,我的思路是先将T_{0}^{(0)} 计算出,然后再据此算出T_{0}^{(k)}

	t[0][0] = h/2.0*(fx(b)+fx(a));
	for (int i = 1; i < 10; i++)
	{
		double f = 0;
		x = a + h / 2.0;
		while (x < b) {
			f = f + fx(x);
			x += h;
		}
		t[0][i] = 0.5 * t[0][i - 1] + h/2 * f;  //递推公式求t(0)0
		h = h / 2.0;
	}

上面已经将t设置为全为0的10×10矩阵,现在只要判断t[i - 1][j - 1] 和 t[i - 1][j] 是否为0就可以知道能否求出t[i][j]的结果,书上的表是这样的:不过根据我的代码,上表T_{1}^{(0)}的位置是t[1][1]而不是t[1][0],以它所在的坐标来表示,代码如下:

for (int i = 1; i < 10; i++) {				//循环求
		for (int j = 1; j < 10; j++) {
			if (t[i - 1][j - 1] != 0 && t[i - 1][j] != 0) {	//判断能否求 的值
				t[i][j] = pow(4, i) / (pow(4, i) - 1) * t[i - 1][j] - t[i - 1][j - 1] / (pow(4, i) - 1);
				if (i == j) {
					if (abs(t[i][j] - t[i - 1][j - 1]) < pow(10, -7)) {	//检测是否达到精度,达到则停止循环并输出解
						cout << "卫星轨道的周长约为" << setprecision(8) << t[i][j]*4*7782.5<< "km" << endl;
						break;
					}
				}
			}
		}
	}

综合起来为:

#include<stdio.h>
#include<iostream>
#include<math.h>
#include <iomanip>
#define e        2.71828182845904523536
#define pi       3.14159265358979323846
using namespace std;

double fx(double  x) {		//令f(x)=	,求f(x)的值
	return 2 * pow(e, -1.0*x) / sqrt(pi);
}

int main()
{
	double t[10][10] = { 0 };			//创建一个二维数组
	double x; double h = 1;
	double a = 0, b = 1;		//a,b为上下限
	t[0][0] = h/2.0*(fx(1.0)+fx(0));		//求
	for (int i = 1; i < 10; i++)
	{
		double f = 0;
		x = a + h / 2.0;
		while (x < b) {
			f = f + fx(x);		//求
			x += h;
		}
		t[0][i] = 0.5 * t[0][i - 1] + h/2 * f;  //递推公式求
		h = h / 2.0;
	}
	for (int i = 1; i < 10; i++) {				//循环求
		for (int j = 1; j < 10; j++) {
			if (t[i - 1][j - 1] != 0 && t[i - 1][j] != 0) {	//判断能否求的值
				t[i][j] = pow(4, i) / (pow(4, i) - 1) * t[i - 1][j] - t[i - 1][j - 1] / (pow(4, i) - 1);
				if (i == j) {
					if (abs(t[i][j] - t[i - 1][j - 1]) < pow(10, -5)) {	
//检测是否达到精度,达到则停止循环并输出解
						cout << setprecision(8) << t[i][j] << "为所求解" << endl;
						break;
					}
				}
			}
		}
	}
}

代码其实是有些问题的,正常答案应该是类似这样的

但实际上这个代码已经从T_{0}^{(0)}算到T_{0}^{(9)} 了,不过最后的结果是一样的。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

韶光换y

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

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

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

打赏作者

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

抵扣说明:

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

余额充值