如下图变步长的算法框图,其中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;
}