题目要求是这样的:编写一个用矩形法求定积分的通用函数,求的定积分,上下限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无比接近了,
这与的结果是相符的。
程序无比简单,关键是思考过程。上面的求解函数,恰恰就是一个求和器。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/yongh701/article/details/47317337