[计算机数值分析]复化梯形的递推公式的变步长算法求积分

在这里插入图片描述

如下图变步长的算法框图,其中T1和T2分别代表二分前后的积分值。
在这里插入图片描述

  • 问题描述:

在这里插入图片描述

  • 运行示例:

在这里插入图片描述

  • 源码:
#include<iostream>
#include<cmath>
double f(double x);   //自定义函数

using namespace std;

int main(void)
{
    
    
	double a, b, accuracy;   //a为区间下限,b为区间上限,accuracy为精度

	cout << "请输入积分区间:";   //输入提示
	cin >> a >> b;

	cout << "请输入精度:";   //输入提示
	cin >> accuracy;

	double h, T1, T2;   //h为步长,T1为步长二分前的积分值,T2为步长二分后的积分值
	int i = 0;  //记录步长二分次数

	h = b - a;   //初始步长为整个区间
	T1 = h / 2 * (1 + f(b));    //根据梯形复化求积公式求得T1

	do
	{
    
    
		printf("第%d次二分步长,二分后的积分值T2 = %.7f\n", i, T1);

		double sum = 0;   //sum为各分点的函数值的和
		double x = a + h / 2;   //分点的值

		while (x < b)  //未到区间上限
		{
    
    
			sum += f(x);   //将分点往后区间范围内的分点函数值求和
			x += h;   //分点往后移动(在区间上限范围内)
		}

		T2 = T1 / 2 + h / 2 * sum;   //求得步长二分后的积分值

		//cout << "第" << i << "次二分步长,二分后的积分值T2 = " << T2 << endl;

		if (abs(T2 - T1) >= accuracy)   //如果精度不符合要求,步长再次二分,修改T1的值为T2,继续递推
		{
    
    
			h /= 2;
			double temp;
			temp = T1;
			T1 = T2;
			T2 = temp;
			i++;   //步长二分次数自增1
		}

	} while (abs(T2 - T1) >= accuracy);

	return 0;
}

double f(double x)   //自定义被积函数
{
    
    
	double result;

	result = sin(x) / x;

	return result;
}

猜你喜欢

转载自blog.csdn.net/weixin_51008866/article/details/116075805
今日推荐