从定积分定义到代码,详解矩形法求解定积分

题目:
写一个函数用矩形求定积分的通用函数,分别别F(0,1) sinx dx,F(-1,1) cosx dx,F(0,2) exp(x) dx的定积分.(F(0,1)表示定积分的范围)
说明:sin,cos,exp已在系统的数学函数库中.

首先解释一下为什么可以用矩形法求定积分:
在这里插入图片描述
可以先看一下公式定义:
一般定义为:求定积分范围为(a,b)求f(x)的积分,本质是按图片式子求解的.
特殊情况就是a=0,b=1的时候可以简化式子.
在这里插入图片描述
再来看一下直观的几何图形,数形结合感受一下. (图片引用百度百科)
在这里插入图片描述
在这里插入图片描述
可以看出求(a,b)的定积分就是求函数曲线和x轴在(a,b)范围的面积.这个面积等于n个小矩形面积的和.并且这些小矩形都是宽度相等,高度不同的矩形. 矩形的高取决于f(x)中x的值. 所以又可以利用矩形等距得到横坐标.x = a+i×h(i=0,1,2…n)
如果每个小矩形划分的越小就越接近真实面积. 代码体现为 h = (b-a)/n.因为每份矩形的宽度是等距的所以h相同,所以f(x)的纵坐标可以表示为y = f(a+i*h),i表示有几个矩形的宽度.所以n的值越大,划分的矩形越多结果越精确.

//核心代码
for(i=1;i<=n;i++) //这个n表示有多少个小矩形
  {x=x+h; //x表示的是横坐标的位置
   s=s+(*p)(x)*h; //*p的* 为指针   *h的*为乘号 
   //(*p)(x)表示将x传入p所指向的函数(sinx,cosx...等)
  //s表示(a,b)中每个小矩形面积的累加
  }
#include<stdio.h>
#include<math.h>
//float(*)(float) 表示 这个指向形参为float类型,返回值为float类型的指针
//			通过打印被调用函数的地址可以自行验证一下
//float integral(float(*)(float),float,float,int);是表示调用哪个函数,积分的上下限是啥,由于函数中调用了函数,所以用到了函数指针.


int main()
{float integral(float(*)(float),float,float,int);//对integarl函数的声明
float fsin(float);          //对fsin函数的声明
float fcos(float);          //对fcos函数的声明
float fexp(float);          //对fexp函数的声明
float a1,b1,a2,b2,a3,b3,c,(*p)(float);
int n=20; 
printf("input a1,b1:");
scanf("%f,%f",&a1,&b1);
printf("input a2,b2:");
scanf("%f,%f",&a2,&b2);
printf("input a3,b3:");
scanf("%f,%f",&a3,&b3);
p=fsin;
c=integral(p,a1,b1,n);
printf("The integral of sin(x) is:%f\n",c);
p=fcos;
c=integral(p,a2,b2,n);
printf("The integral of cos(x) is:%f\n",c);
p=fexp;
c=integral(p,a3,b3,n);
printf("The integral of exp(x) is:%f\n",c);
return 0;
}

float integral(float(*p)(float),float a,float b,int n)
{int i;
 float x,h,s;
 h=(b-a)/n;
 x=a;
 s=0;
 for(i=1;i<=n;i++)
  {x=x+h;
   s=s+(*p)(x)*h; //*p的* 为指针   *h的*为乘号 
  }
  return(s);
}
  float fsin(float x)
    {return sin(x);}
  float fcos(float x)
    {return cos(x);}
  float fexp(float x)
    {return exp(x);}

原创文章 36 获赞 8 访问量 2776

猜你喜欢

转载自blog.csdn.net/qq_41398619/article/details/105428734