【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无比接近了,

这与的结果是相符的。

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值