1. 程式人生 > >C語言實現變步長求積分演算法

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、結果:

4、驗證: