数值计算方法实验三

1.用变步长梯形法求下列积分,使精确度达到10-4。

要求:

(1) 精度ε和区间端点ab的信息从键盘终端输入;

(2) 打印输出每一步的计算结果。

源代码:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
	double x,a,s,b,e,h,T1,T2;
	cout<<"请输入区间端点a,b和精度e:"<<endl; 
	cin>>a>>b>>e;
	cout<<endl;
	h = b-a;
	T1 = (h/2)*(4/(1+pow(a,2))+4/(1+(pow(b,2))));
	int count=0;
	cout<<"K    "<<"  T1   "<<"     T2  "<<endl;
	do{
		if(count!=0){
			h  = h/2;
			T1 = T2;
		}
		count++;
		s = 0;
		x = a + h/2;
		do{
			s = s + (4/(1+pow(x,2)));
			x = x + h;
		}while(x<b);
		T2 = (T1/2)+h*s/2;
		printf("%d:  %.6lf   %.6lf\n",count,T1,T2); 
	}while(abs(T2-T1)>=e);
	cout<<endl;
	printf("最后结果为:%.4lf",T2);
	return 0;
}

2. 用龙贝格算法计算下列积分值,使精确度达到10-4。

要求:

(1) 绘制龙贝格算法的实现框图;

(2) 精度ε和区间端点ab的信息从键盘终端输入;

(3) 按照龙贝格算法的计算顺序按列依次打印输出梯形序列、辛普森序列、柯特斯序列和龙贝格序列的计算结果,如下所示;

扫描二维码关注公众号,回复: 6745415 查看本文章

k

区间等分数

n=2k

梯形序列

T2k

辛普森序列

S2k-1

柯特斯序列

C2k-2

龙贝格序列

R2k-3

0

1

T1

 

 

 

1

2

T2

S1

 

 

2

4

T4

S2

C1

 

3

8

T8

S4

C2

R1

4

16

T16

S8

C4

R2

5

32

T32

S16

C8

R4

 

(4) 输出最终满足精度要求的积分近似值。

 

算法框图

#include<iostream>
#include<cmath>
using namespace std;
int main(){
	double x,a,s,b,e,h,T1,T2;
	cin>>a>>b>>e;
	double q[7][7];
	double T[100] = {0}; 
	h = b-a;
	int d=0;
	int i,j;
	for(i=0;i<7;i++){
		for(j=0;j<7;j++){
			if(j == 0){
				q[i][j] = pow(2,i);
			}
			else{
				q[i][j] = 0;
			}
		}
	}
    T1 = (h/2)*(sin(b)+sin(a));
	int count=-1,k=0;
	do{
		if(count!=-1){
			h  = h/2;
			T1 = T2;
		}
		count = pow(2,k);
		k++;
		s = 0;
		x = a + h/2;
		do{
          s = s + sin(x);
			x = x + h;
		}while(x<b);
		T2 = (T1/2)+h*s/2;
		T[count] = T1;
		q[d++][1] =  T[count];
	}while(abs(T2-T1)>=e);
	cout<<endl;
	double S[100] = {0};
	double C[100] = {0};
	double R[100] = {0};
	d = 1;
	for(int i=1;i<=count/2;i=i*2){
		S[i] = (4.00/3)*T[2*i]-(1.00/3)*T[i];
		q[d++][2] = S[i];
	}
	cout<<endl;
	d = 2;
	for(int i=1;i<=count/4;i=i*2){
		C[i] = (16.00/15)*S[2*i]-(1.00/15)*S[i];
		q[d++][3] = C[i];
	}
	cout<<endl;
	d = 3;
	for(int i=1;i<=count/8;i=i*2){
		R[i] = (64.00/63)*C[2*i]-(1.00/63)*C[i];
		q[d++][4] = R[i];
	}
	cout<<"n"<<"   梯形序列  "<<"  辛普森序列  "<<" 科特斯序列  "<<"  龙贝格序列 "<<endl; 
	for(i=0;i<6;i++){
		for(j=0;j<5;j++){
			if(q[i][j] == 0){
				printf("     ");
			}
			else{
				if(j==0){
					printf("%.0lf ",q[i][j]);
					if(q[i][j]<=8) printf(" ");
				}
				else{
					printf("%.8lf   ",q[i][j]);
				}
			}
		}
		printf("\n");
	}
	printf("\n最后结果为: %.4lf",q[3][4]); 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41106517/article/details/94720408