C语言实现变步长求积分算法

  

链接:https://blog.csdn.net/chen_dsir/article/details/71257631  博主详细介绍了复合梯形公式,

链接:https://wenku.baidu.com/view/b300c53deefdc8d376ee3228.html 详细介绍了变步长的目的,以及变换的方式

下面求解如下问题:

C语言实现变步长求积分算法 - 文章图片

1、变步长:

        由于多数情况下,并不知道步长设置为多少合适,所以我们可以设置一个初始步长,求解一次,再把步长变为原来的一半,依次接下去,直到达到我们所需的精度。

2、代码:

#include<stdio.h>
#include<math.h>

#define left 1.0   //左端的值 
#define right 3.0   //右端的值 
#define  precision 0.0001   //定义精度 


double f(double x)
{
	double m=100/(x*x)*sin(10/x);
	return m;
}

int main()
{
	int i;
	int step=100;  //初始化步数
	double stepLength=(right-left)/step; //步长
	double T=f(left)+f(right);   //积分的值 
	for(i=1;i<=step-1;i++) 
	{
		double x=left+i*stepLength;
		T+=2*f(x);
	}
	T=stepLength/2*T;  //符合梯形公式求解结果
	printf("初始步长得到的积分值:%lf   所分的区间个数:%d\n",T,step);
	//下面改变步长,来细化精度
	double T1=T+100;
	double T2=T;
	double H;      //减小步长后得到的积分值 
	while(fabs(T1-T2)>precision/2) 
	{
		T1=T2;
		step=step*2;
		stepLength=(right-left)/step; 
		H=0;
		for(i=1;i<step;i++)
		{
			H+=2*f(left+stepLength*i);
		}
		H=f(left)+f(right)+H;
		H=H*stepLength/2;     
		T2=(T1+H)/2;    //将上次一的积分结果和减小步长后的积分结果求均值 
		
	}	
	printf("初始步长得到的积分值:%lf   所分的区间个数:%d\n",T2,step);
	
	 
	
}

3、结果:

C语言实现变步长求积分算法 - 文章图片

4、验证:

C语言实现变步长求积分算法 - 文章图片

 

相关文章