码迷,mamicode.com
首页 > 其他好文 > 详细

【C】求函数的定积分

时间:2015-08-06 16:57:40      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:c语言   算法   定积分   极限   求和   

题目要求是这样的:编写一个用矩形法求定积分的通用函数,求技术分享的定积分,上下限b,a由用户自行输入。

其中sin函数可以利用math.h。

这题的代码不难,关键是求解的数学思想而并非编程技巧,所谓的“矩形法”求定积分,就是利用定积分的最基本定义。

如下图,在技术分享中,相当于把[a,b]中f(x)与x轴所围成阴影范围切割成n份,当n趋向于无穷的时候,分割出来的形状近似与矩形,n个矩形的面积之和接近于阴影部分的面积。其中,每个矩形的宽度皆为(b-a)/n。

技术分享

对于第0个矩形的面积s:先令x=a,把光标移到x=a处进行分析,矩形于y的高度则为f(a),因此,此矩形的面积则为技术分享

对于第1个矩形的面积s:因为每个矩形的宽度皆为(b-a)/n,所以先把光标移到x= x+(b-a)/n处进行分析,矩形于y的高度则为:f(x+(b-a)/n),那么此矩形的面积则为:技术分享

以此类推,对于第i个矩形的面积s:同样因为每个矩形的宽度皆为(b-a)/n,所以先把光标移到x= x+i*(b-a)/n处进行分析,同理,可以得出相应矩形的面积。

值得注意的是,i从1开始或者从0开始没有任何关系,当被积分的矩形足够多的时候,多一个矩形,少一个矩形对结果的影响是九牛一毛,接近于0的。

所有矩形的面积则为:技术分享

因此,可以得到如下代码段:

#include<stdio.h>
#include<math.h>
#define N 100000//迭代次数,取一个比较大的值,近似于无穷
float calculate(float a,float b){
	float s=0,x=a;
	for(int i=1;i<N+1;i++){//i从0开始从1开始是没有任何印象的
		//以下两条语句的先后顺序可以任意,即取矩形的左边高或者右边的高度
		x=(x+(b-a)/N);
		s=s+sin(x)*((b-a)/N);//被积分的函数sin(x)写在这里
	}
	return s;
}
void main(){
	float lower,upper,result;
	printf("本程序将计算sin(x)的定积分\n");
	printf("请输入积分下限:");
	scanf("%f",&lower);
	printf("请输入积分上限:");
	scanf("%f",&upper);
	result=calculate(lower,upper);
	printf("sin(x)从%g到%g的定积分的结果为:%g",lower,upper,result);
}

运行结果如下:

技术分享

在输入下限0上限3.1415926也就是pi,迭代100000次求解,得到的结果无比接近于2,由于float浮点丢失精度的情况,是不可能达到2,但1.997已经与2无比接近了,

这与技术分享的结果是相符的。

程序无比简单,关键是思考过程。上面的求解函数,恰恰就是一个求和器。

版权声明:本文为博主原创文章,未经博主允许不得转载。

【C】求函数的定积分

标签:c语言   算法   定积分   极限   求和   

原文地址:http://blog.csdn.net/yongh701/article/details/47317337

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!