矩形法求定积分问题
代码实现:
#include<stdio.h>
#include<math.h>
float fsin(float x);
float func(float (*p)(float),float a,float b,int n);
int main(){
float a,b; //积分上下限
int n; //将积分区域划分为n个格(n越大,精确度越高)
printf("请输入积分下限、上限:");
scanf("%f %f",&a,&b);
printf("请输入n:");
scanf("%d",&n);
float result=func(fsin,a,b,n);
printf("积分结果为:%f\n",result);
return 0;
}
float func(float (*p)(float),float a,float b,int n){
float sum=0;
float dis=(a-b)/n;//n越大,精确度越高
float x=a;
for(int i=0;i<n;i++){
sum+=(*p)(x+(i-1)*dis+dis/2)*dis;
}
return sum;
}
float fsin(float x){
return sin(x);
}
代码注解:
- 求解定积分的原理其实和数学里面极限的思想是一样的,将积分区域分为很多的非常小的区域,这样这些区域就可以近似的看成一个点,然后用这个区域的长度乘以它对应的这点的函数值,最后进行累加就可以解决。
- n的值越大,分的区域越多,精度越高。
- 矩形法: S ( i ) = f ( a + i − 1 h + h 2 ) 其 中 ( h = b − a 2 ) S(i)=f(a+\frac{i-1}{h}+\frac{h}{2}) 其中(h=\frac{b-a}{2}) S(i)=f(a+hi−1+2h)其中(h=2b−a)
- 同理,梯形法求积分:
- 第一个: S 1 = f ( a ) + f ( a + h ) 2 ∗ h S_1=\frac{f(a)+f(a+h)}{2}*h S1=2f(a)+f(a+h)∗h
- 第 i i i 个: S i = f ( a + ( i − 1 ) ∗ h ) + f ( a + i h ) 2 ∗ h S_i=\frac{f(a+(i-1)*h)+f(a+ih)}{2}*h Si=2f(a+(i−1)∗h)+f(a+ih)∗h