C语言实现龙贝格积分

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LuYiXianSheng/article/details/78755463

《数值分析》实验习题2

用Romberg算法求下列积分,允许误差eps=0.00001


/*****************************************************************
《数值分析》实验习题2

机械工程
现代制造技术教育部重点实验室 
*****************************************************************/

#include<stdio.h>
#include<malloc.h>
#include<math.h>
#define PI 3.14159265

typedef struct node  
{
	int num;
    double T;
    double S;
    double C;
    double R;
    struct node *next; 
}ParaList;

double fun(double );
double calT(ParaList* ,double ,double );
double calS(ParaList*);
double calC(ParaList*);
double calR(ParaList*);

int main(){
	double a = 0, b = 3, eps = 0.00001;
	
	//第二题参数 
//	double a = 1, b = 3, eps = 0.00001;

//	printf("请输入积分下限\n");
//	scanf("%lf", &a);
//	printf("请输入积分上限\n");
//	scanf("%lf", &b);
//	printf("请输入eps");
//	scanf("%lf", &eps);
	//算前四行的T,S,C的值并存入参数链表中 
	ParaList *phead, *p;
	int i;
	phead = (ParaList*)malloc(sizeof(ParaList));
	phead->num = 1;
	phead->T = (b - a) / 2 * (fun(a) + fun(b));
	phead->next = p = (ParaList*)malloc(sizeof(ParaList));
	p->num = 2;
	p->T = calT(phead, a, b);
	p->S = calS(phead);
	p->next = (ParaList*)malloc(sizeof(ParaList));
	p->next->num = 3;
	p->next->T = calT(p, a, b);
	p->next->S = calS(p);
	p->next->C = calC(p);
	p = p->next;
	p->next = (ParaList*)malloc(sizeof(ParaList));
	p->next->num = 4;
	p->next->T = calT(p, a, b);
	p->next->S = calS(p);
	p->next->C = calC(p);
	p->next->R = calR(p);
	p = p->next;
	for(i=5; ;i++){
		p->next = (ParaList*)malloc(sizeof(ParaList));
		p->next->num = i;
		p->next->T = calT(p, a, b);
		p->next->S = calS(p);
		p->next->C = calC(p);
		p->next->R = calR(p);
		if(fabs(p->next->R - p->R) < eps){
			printf("计算结果为%.8lf,共进行了%d次迭代", p->next->R, p->next->num);
			break;
		}
	} 
}

//double fun(double x){
//	//第一题函数 
//	double fresult;
//	fresult = x * pow(1 + pow(x, 2), 0.5);
//	return fresult;
//}

double fun(double x){
	//第二题函数 
	double fresult;
	fresult = pow(3, x) * pow(x, 1.4) * (5* x + 7) * sin(pow(x, 2) * PI / 180);
	return fresult;
}

double calT(ParaList* s, double a, double b){
	//传入某一行的指针和积分上下限,用于计算下一行的T值 
	int i;
	double sum = 0, tresult;
	for(i=0; i<pow(2, s->num -1); i++)
		sum += fun(a + (i + 0.5) * (b - a) / pow(2, s->num -1));
	tresult = 0.5 * (s->T + (b - a) / pow(2, s->num -1) * sum);
	return tresult;
}

double calS(ParaList* t){
	//传入某一行的指针,用于计算下一行的S值 
	double sresult;
	sresult =(4 * t->next->T - t->T) / 3;
	return sresult; 
} 

double calC(ParaList* s){
	//传入某一行的指针,用于计算下一行的C值 
	double cresult;
	cresult = (16 * s->next->S - s->S) / 15;
	return cresult;
}

double calR(ParaList* c){
	//传入某一行的指针,用于计算下一行的R值 
	double rresult;
	rresult = (64 * c->next->C - c->C) / 63;
	return rresult;
}




猜你喜欢

转载自blog.csdn.net/LuYiXianSheng/article/details/78755463
今日推荐