题目要求是这样的:编写一个用矩形法求定积分的通用函数,求的定积分,上下限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无比接近了,
这与的结果是相符的。
程序无比简单,关键是思考过程。上面的求解函数,恰恰就是一个求和器。