C语言__用六种方法求定积分
- 格式:doc
- 大小:407.49 KB
- 文档页数:13
总结定积分的求解方法定积分是微积分中的一个重要概念,它是对函数在一个闭区间上的积分运算。
在实际问题中,我们经常需要求解定积分,因此掌握定积分的求解方法是非常重要的。
一、基本思想定积分的基本思想是将区间分割成若干个小区间,然后对每个小区间进行近似计算,最后将这些近似值相加得到最终结果。
具体而言,定积分可以通过以下几种方法来求解。
二、几何意义定积分的几何意义是曲线与坐标轴所围成的面积。
当函数为正时,定积分表示曲线所在区间上方的面积;当函数为负时,定积分表示曲线所在区间下方的面积。
因此,定积分可以用来求解曲线所围成的面积问题。
三、定积分的求解方法1. 利用定积分的定义公式根据定积分的定义公式,可以直接计算出定积分的值。
定积分的定义公式为:∫[a,b] f(x)dx = lim(n→∞) ∑[i=1,n] f(xi)Δx其中,[a,b]表示积分区间,f(x)表示被积函数,dx表示微元,xi表示小区间的中点,Δx表示小区间的长度。
通过将区间进行分割,计算每个小区间上的函数值与长度的乘积,再将这些乘积相加,即可得到定积分的近似值。
2. 利用定积分的性质定积分具有一些重要的性质,利用这些性质可以简化定积分的求解过程。
常见的定积分性质有:(1)线性性质:∫[a,b] (f(x)+g(x))dx = ∫[a,b] f(x)dx + ∫[a,b] g(x)dx(2)积分区间的可加性:∫[a,b] f(x)dx = ∫[a,c] f(x)dx + ∫[c,b] f(x)dx(3)定积分的换元法:∫[a,b] f(g(x))g'(x)dx = ∫[g(a),g(b)] f(u)du通过利用这些性质,我们可以将复杂的定积分转化为简单的定积分,从而简化计算过程。
3. 利用定积分的常用公式对于一些常见的函数,存在一些常用的定积分公式,可以直接使用这些公式来求解定积分。
例如,对于幂函数,可以使用幂函数的积分公式来求解;对于三角函数,可以使用三角函数的积分公式来求解。
定积分的求解方法及其应用摘要:在数学分析这门课程里,定积分是最普遍而又重要的内容之一,同时也是数学研究中的重要工具,随着数学在生活中的广泛应用,定积分的相关解法和应用所蕴藏的巨大潜力越来越引起人们的关注.本论文从定积分的基本理论出发,系统阐述了牛顿莱布尼茨公式、换元法、分部积分法、凑微分法等几种常见的求解方法,并列举了相关的例子,更直观的了解求解定积分的方法的精髓.另外本文又介绍了定积分在数学、物理学和经济学当中的应用,实现了定积分在实际生活中的应用.通过这一系列的总结,可以进一步提升对定积分的认识,为以后的学习奠定了基础.关键词:定积分;求解方法;应用一、定积分的求解方法1.1 定积分概念定义1 不妨设在闭区间[m ,n ]中,不包含两个端点,共有1-k 个点,按照大小分别为m =0x <1x <2x <…<1-k x <k x =n ,这些点将闭区间[m ,n ]分割为大小不一的子区间,共有k 个,用i ∆表示这些子区间,即i ∆=[1-i x ,i x ],i =1,2, …,k 。
可以将k x x x ......,10点或[]n i xi x i i ......12,,1==∆-子区间视为分割了闭区间[m ,n ],令集合=A {0x ,1x ,…,k x }或{1∆,2∆,…,k ∆}.定义2 假设函数g 的定义域为 [m ,n ]。
将区间[m ,n ]分割为k 个,得分割区间的集合=A {1∆,2∆,…,k ∆},在区间i ∆上随意取点i ψ,即i ψ∈i ∆,i =1,2, …,k ,将该点函数值与自变量之差做乘积,累次相加得()iki ix g ∆∑=1ψ,该式是函数g 在定义域[m ,n ]上的积分和.定义3 假设函数g 的定义域为 [m ,n ],S 是给定的实数。
假如总能找到某个的正数θ,以及任何正数σ,在定义域 [m ,n ]进行任意大小的分割A ,并且在分割出来的区间中随意选择一个点组成集合{i φ},当A <θ时,存在σφ<-∆∑=S xg ni ii1)(,则函数g在定义域[m ,n ]上可积,即⎰=nmdx x g S )(。
1.定积分近似计算:/*梯形法*/double integral(double a,double b,long n) { long i;double s,h,x;h=(b-a)/n;s=h*(f(a)+f(b))/2;x=a;for(i=1;i<n;i++){x+=h;s+=h*f(x) ;}return(s);}/*矩形法*/double integral(double a,double b,long n) { long i;double t=0,h,x;h=(b-a)/n;x=a;for(i=0;i<n;i++){t+=h*f(x);x+=h;}return(t);}2. 生成斐波那契数列:/*直接计算*/int fib(int n){ int i,f1=1,f2=1,f;for(i=3;i<=n;i++){f=f1+f2;f1=f2;f2=f;}if(n==1||n==2) return 1;else return f;}/*递归调用*/void fib(int n,int*s){ int f1,f2;if(n==1||n==2) *s=1;else{ fib(n-1,&f1);fib(n-2,&f2);*s=f1+f2;}}3.素数的判断:/*方法一*/for (t=1,i=2;i<n; i++)if(n%i==0) t=0;if(t) printf("%d is prime",n);/*方法二*/for (t=1,i=2;i<n&&t; i++)if(n%i==0) t=0;if(t) printf("%d is prime",n);/*方法三*/for (i=2;i<n; i++)if(n%i==0) break;if(i==n) printf("%d is prime",n); /*方法四*/for(t=1,i=2; i<=(int)sqrt(n); i++)if(n%i==0){t=0;break;}if(t) printf("%d is prime",n);4.反序数:/*求反序数*/long fan(long n){ long k;for(k=0;n>0;n/=10)k=10*k+n%10;return k;}/*求回文数*/int f(long n){ long k,m=n;for(k=0;n>0;n/=10)k=10*k+n%10;if(m==k) return 1;return 0;}/*求整数位数*/int f(long n){ int count;for(count=0;n>0;n/=10)count++;return count;}5.求最大公约数:/*方法一*/int gcd(int x,int y){ int z;z=x<y?x:y;while(!(x%z==0&&y%z==0))/*x%z||y%z*/ z--;return z;}/*方法二*/int gcd(int x,int y){int r;while((r=x%y)!=0){x=y;y=r;}return y;}/*方法三*/int gcd(int a ,int b){ int r ;if((r=a%b)==0)return b;elsereturn gcd(b,r);}6.数组常用算法:查找:/*线性查找*/int find(int num,int x[],int key){ int i,m=-1;for(i=0;i<num;i++)if(x[i]==key){m=i;break;}return m;}/*折半查找*/int find(int x[],int num,int key){ int m=-1,low=0,high=num-1,mid;while(low<=high){mid=(low+high)/2;if(x[mid]==key){m=mid;break;}else if(x[mid]>key) high=mid-1;else low=mid+1;}return m;}/*折半查找(递归)*/int b_search(int x[ ],int low,int high,int key) {int mid;mid=(low+high)/2;if(x[mid]==key) return mid;if(low>=high) return -1;else if(key<x[mid])return b_search(x,low,mid-1,key);elsereturn b_search(x,mid+1,high,key); }/*寻找子串*/int find(char *s1,char *s2){ int i,k=0;while(s1[i]==s2[i]) i++;if(s2[i]==0) return k;s1++;k++;return -1;}分词:/*方法一*/void fen(char s[][10],char str){ int i,j,k;for(i=0,j=0,k=0;str[i]!=0;i++)if(isalpha(a[i]))s[j][k++]=str[i];else {s[j][k]=0;k=0;j++;}}}/*方法二*/#include<stdio.h>#include<string.h>void main(){ int i=0,n=0;char s[80],*p;strcpy(s,"It is a book.");for(p=s;p!='\0';p++)if(*p=='')i=0;elseif(i==0){n++;i=1;}printf("%d\n",n);getch();}排序:/*插入法排序*/void sort(int a[],int n){ int i,j,t;for(i=1;i<n;i++){t=a[i];for(j=i-1;j>=0&&t<a[j];j--)a[j+1]=a[j];a[j]=t;}}/*归并排序*/#define x 10#define y 10void com(int *a,int *b,int *c){ int i,j,k;for(i=0,j=0,k=0;i<=x&&j<=y;){if(a[i]<b[j]){c[k++]=a[i];i++;}else{c[k++]=b[j];j++;}}if(i<x) for(k=k-1;i<x;i++)c[k++]=a[i];if(j<x) for(k=k-1;j<y;j++)c[k++]=a[j]; }/*交换法排序1 冒泡排序*/void sort(int a[],int n){ int i,j,t,flag;for(i=0;i<n-1;i++){flag=1;for(j=0;j<n-1-i;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;flag=0;}if(flag) break;}}/*交换法排序2*/void sort(int a[],int n){ int i,j,t;for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;}}/*选择法排序*/void sort(int a[],int n){ int i,j,point,t;for(i=0;i<n-1;i++){point=i;for(j=i+1;j<n;j++)if(a[point]<a[j]) point=j;if(point!=i){t=a[point];a[point]=a[i];a[i]=t;}}}7.一元非线性方程求根:/*牛顿迭代法求函数跟*/#include <stdio.h>#include <math.h>int main(void){ double x,x1,eps=1e-6,f,f1; /*误差为eps*/x=1.0; /*x=1.0是初值*/do{x1=x;f=6-x1*(5-x1*(4-3*x1)); /*f为f(x)函数*/f1=-5+x1*(8-9*x1); /*f1为f(x)的导函数*/x=x1-f/f1;f=6-x*(5-x*(4-3*x));}while(fabs(f)>=eps &&fabs(x-x1)>=eps);printf("x=%f",x);}/*二分法求函数跟*/#include <stdio.h>#include <math.h>double f(double x){ return 6-x*(5-x*(4-3*x)); /*f(x)函数*/}int main(void){ double a,b,c,x,eps=1e-6;do{scanf("%lf%lf",&a,&b);}while(f(a)*f(b)>0);if(fabs(f(a))<1e-6)x=a;else if (fabs(f(b))<1e-6)x=b;else {c=(b+a)/2;while(fabs(f(c))>eps&&fabs(b-a)>eps){if(f(a)*f(c)<0)b=c;elsea=c;c=(b+a)/2;}x=c;}printf("x=%f",x);}/*弦截法求函数跟*/c=(a*f(b)-b*f(a))/ (f(b)-f(a));while(fabs(f(c))>eps){if(f(a)*f(c)<0)b=c;elsea=c;c=(a*f(b)-b*f(a))/ (f(b)-f(a));}#include <stdio.h>void f();int main(void){ int x, loop=0;do{for(x=1;x<5;x++) {int x=2;printf("%d",x);}printf("%d ",x);f();loop++;}while(loop<1);getch();}void f(){ printf("%d",x++); }8.汉诺塔:#include<stdio.h>void Hanoi(int n, char A, char B, char C){if(n==1)printf("\n move %d from %c to %c",n,A,C);else{Hanoi(n-1,A,C,B);printf("\nmove %d from %c to %c",n,A,C);Hanoi(n-1,B, A, C);}}int main(void){ Hanoi(3,'A','B','C');getch();}9.建立链表:NODE *creat(void) /* void表示无参函数*/{NODE *head=NULL,*p1=NULL,*p2=NULL;long num;unsigned score;int n=0;do{scanf(“%ld%u”,&num,&score);if(num==0) break;n++;p1=(NODE *)malloc(sizeof(NODE));p1->data.num=num,p1->data.score=score;p1->next=NULL;if(n==1)head=p2=p1;else{p2->next=p1;p2=p1;}}while(1);return head;}10.级数的近似计算:#include <stdio.h>#include <math.h>int main(void){ double s=1,a=1,x,eps,f;int n,m;printf("input x and eps:");scanf ("%lf%lf",&x,&eps);for(n=1;fabs(a)>eps; n++){for(f=1,m=1;m<=n;m++)f*=m;a=pow(x,n)/f;s+=a;}printf("%f",s);}。
C语言用六种方法求定积分C语言中求定积分的方法主要有以下六种:基本公式法、数值积分法、Laplace变换法、微积分概念法、数值积分法和Monte Carlo方法。
下面将详细介绍每种方法的原理和实现。
1.基本公式法:基本公式法是求解定积分的最基本方法,根据不同函数的特点和性质,利用已知的积分公式进行求解。
例如,对于一次函数和常数函数,可以使用基本公式法求解。
2.数值积分法:数值积分法是通过将定积分转化为数值计算问题来求解。
常用的数值积分方法有矩形法、梯形法和辛普森法等。
这些方法基于将求积分区间分割成若干个小区间,然后在每个小区间上近似计算出函数的积分值,再将这些积分值加总得到最终结果。
3. Laplace变换法:Laplace变换法是一种利用Laplace变换求解微分方程的方法,也可以用来求解定积分。
通过将被积函数进行Laplace变换,然后利用Laplace变换公式求解积分,最后再求出反变换得到结果。
4.微积分概念法:微积分概念法是通过将定积分定义为函数曲线下的面积来求解。
具体做法是将被积函数图像与坐标轴围成的面积分为若干个小的矩形、梯形或曲线段以及一个小的区域。
然后根据图形的几何性质进行近似计算,将这些小面积相加得到最终结果。
5.数值积分法:数值积分法也是一种基于数值计算的方法,但与前面提到的数值积分法不同,它通过构造一系列特定形式的插值函数对被积函数进行逼近,然后计算插值函数的积分值来近似求解定积分。
常用的数值积分法有牛顿-科特斯公式和高斯-勒让德公式。
6. Monte Carlo方法:Monte Carlo方法是一种基于统计随机性的数值积分方法,它通过随机抽样来进行数值求解。
具体做法是在被积函数图像下随机抽取一系列点,根据这些随机点的坐标和函数值来估计函数的积分值。
通过对多次随机抽样的结果取平均可以得到定积分的近似值。
以上六种方法都可以用C语言来实现,具体的实现方法可以根据具体问题的特点和要求选择合适的算法和数据结构,然后编写相应的代码实现。
C语言实现定积分求解方法C语言可以通过数值积分的方法来实现定积分的求解,主要有矩形法、梯形法和辛普森法等几种常见的求解方法。
矩形法是最简单的一种数值积分方法,它将定积分区间等分成若干个小区间,然后在每个小区间上取一个点,将积分区间分成若干个小矩形,对每个小矩形的面积进行求和,即可得到近似的定积分值。
以下是使用矩形法实现定积分求解的C语言代码:```c#include<stdio.h>#include<math.h>double f(double x)//定义需要求解的函数return sqrt(1-x*x);double integrate(double a, double b, int n)//a:积分下限,b:积分上限,n:划分的矩形个数double dx = (b-a)/n; // 求解每个小矩形的宽度double sum = 0.0; // 求和变量int i;for(i=0; i<n; i++)double x = a + i*dx + dx/2; // 计算每个小矩形的横坐标中点sum += f(x)*dx; // 计算每个小矩形的面积并求和}return sum;int maindouble a = 0.0; // 积分下限double b = 1.0; // 积分上限int n = 1000; // 划分的矩形个数double result = integrate(a, b, n); // 求解定积分printf("The definite integral is: %.6f\n", result);return 0;```梯形法是一种比矩形法更精确的数值积分方法,它将积分区间等分成若干个小区间,然后将每个小区间上的函数图像近似为一个梯形,对每个梯形的面积进行求和,即可得到近似的定积分值。
以下是使用梯形法实现定积分求解的C语言代码:```c#include<stdio.h>#include<math.h>double f(double x)//定义需要求解的函数return sqrt(1-x*x);double integrate(double a, double b, int n)//a:积分下限,b:积分上限,n:划分的梯形个数double dx = (b-a)/n; // 求解每个小梯形的底边宽度double sum = 0.0; // 求和变量int i;for(i=0; i<n; i++)double x1 = a + i*dx; // 计算每个小梯形的左边横坐标double x2 = a + (i+1)*dx; // 计算每个小梯形的右边横坐标sum += (f(x1)+f(x2))*dx/2; // 计算每个小梯形的面积并求和}return sum;int maindouble a = 0.0; // 积分下限double b = 1.0; // 积分上限int n = 1000; // 划分的梯形个数double result = integrate(a, b, n); // 求解定积分printf("The definite integral is: %.6f\n", result);return 0;```辛普森法是一种更为精确的数值积分方法,它将积分区间等分成若干个小区间,然后在每个小区间上使用二次多项式来逼近积分函数的曲线,对每个小区间的积分值进行加权求和,即可得到近似的定积分值。
C语⾔实现定积分求解⽅法求定积分的⽅法有很多种,下⾯是我总结的⼏种⽐较常⽤的⽅法。
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <time.h>#define N 3double fun(double x){double y;y = sqrt(4-(x)*(x));//y = sin(x);return y;}/*随机点法求定积分*/double Darts(int n){double x, y;time_t t;int i = 0;int count = 0;srand((unsigned)time(&t));for (i=0; i<n; i++){x = rand()%100/100.0;y = rand()%100/100.0;if (y <= 1-pow(x,2)){count++;}}return (double)count/(double)n;}/*左矩形法求定积分*/double LeftRect(double down, double up, int n){double h, s;int i;/*计算步长*/h = (up-down)/n;s = fun(down)*h;for (i=1; i<n; i++){s = s + fun(down+i*h)*h;}return s;}/*梯形公式求定积分*/double Trape(double down, double up, int n){double h, s;int i = 0;/*计算步长*/h = (up-down)/n;s = 0.5*(fun(down)+fun(down+h))*h;for (i=1; i<n; i++){s = s + 0.5 * (fun(down+i*h) + fun(down+(i+1)*h))*h;}return s;}/*复合梯形公式*/double T(double x, double y, int z){double h, Tn;int i = 0;h = (y-x)/z;Tn = (fun(x)+fun(y))/2;for (i=0; i<z; i++){Tn = Tn+fun(x+i*h);}Tn = Tn*h;return Tn;}/*⾟普⽣公式求定积分,公式为:S[n]=(4*T[2*n]-T[n])/3,其中T[2n],T[n]为梯形公式计算结果*/ double Simposn(double down, double up, int n){double s;/*⾟普⽣公式*/s = (4*T(down, up, 2*n) - T(down, up, n))/3;return s;}/*⾼斯公式求定积分*/double Gass(double (*func)(double x), double a, double b, int n){int i = 0;//⾼斯点及其求积系数列表float x1[1]={0.0};float A1[1]={2};float x2[2]={-0.5573503,0.5573503};float A2[2]={1,1};float x3[3]={-0.7745967,0.0,0.7745967};float A3[3]={0.555556,0.888889,0.555556};float x4[4]={0.3399810,-0.3399810,0.8611363,-0.8611363};float A4[4]={0.6521452,0.6521452,0.3478548,0.3478548};float x5[5]={0.0,0.5384693,-0.5384693,0.9061799,-0.9061799};float A5[5]={0.5688889,0.4786287,0.4786287,0.2369269,0.2369269};float *p, *t;switch (n){case 1:p = x1;t = A1;break;case 2:p = x2;t = A2;break;case 3:p = x3;t = A3;break;case 4:p = x4;t = A4;break;case 5:p = x5;t = A5;break;default :printf("intput wrong!");}float g = 0;for (i=0; i<n; i++){g += (*func)((b-a)*p[i]/2+(a+b)/2)*t[i];}g *= (b-a)/2;return g;}int main(int argc, char *argv[]){printf("随机点法积分值%f\n", Darts(10000)); double down, up;int n;double sum = 0;printf("积分下限:\n");scanf("%lf", &down);printf("积分上限:\n");scanf("%lf", &up);printf("分隔数⽬:\n");scanf("%d", &n);sum = LeftRect(down, up, n);printf("左矩形法积分值为:%f\n", sum);sum = Trape(down, up, n);printf("梯形公式积分值为:%f\n", sum);sum = Simposn(down, up, n);printf("⾟普⽣公式积分值为:%f\n", sum);sum = Gass(fun, down, up, N);printf("⾼斯公式积分值为:%f\n", sum);return 0;}。
1. 描述问题利用①左矩形公式,②中矩形公式,③右矩形公式 ,④梯形公式,⑤simpson 公式,⑥Gauss 积分公式求解定积分。
2. 分析问题2.1定积分21.1定积分的定义定积分就是求函数()f x 在区间[],a b 中图线下包围的面积。
即()0,,,y x a x b y f x ====所包围的面积。
这个图形称为曲边梯形,特例是曲边梯形。
如下图:(图1)设一元函数()y f x =,在区间[],a b 内有定义。
将区间[],a b 分成n 个小区间[][][][]00112,,,,,......,i a x x x x x x b 。
设1i i i x x x -∆=-,取区间i x ∆中曲线上任意一点记做()i f ξ,作和式:()1lim n n i f i xi ξ→+∞=⎛⎫∆ ⎪⎝⎭∑ 若记λ为这些小区间中的最长者。
当0λ→时,若此和式的极限存在,则称这个和式是函数()f x 在区间[],a b 上的定积分。
记作:()ba f x dx ⎰其中称a 为积分下限,b 为积分上限,()f x 为被积函数,()f x dx 为被积式,∫ 为积分号。
之所以称其为定积分,是因为它积分后得出的值是确定的,是一个数,而不是一个函数。
21.2定积分的几何意义[1]它是介于x 轴、函数f(x)的图形及两条直线x=a ,x=b 之间的各个部分面积的代数和。
在x 轴上方的面积取正号;在x 轴下方的面积取负号。
如图2.2言实现定积分计算的算法22.1利用复合梯形公式实现定积分的计算假设被积函数为()f x ,积分区间为[],a b ,把区间[],a b 等分成n 个小区间,各个区间的长度为h ,即()/h b a n =-,称之为“步长”。
根据定积分的定义及几何意义,定积分就是求函数()f x 在区间[],a b 中图线下包围的面积。
将积分区间n 等分,各子区间的面积近似等于梯形的面积,面积的计算运用梯形公式求解,再累加各区间的面积,所得的和近似等于被积函数的积分值,n 越大,所得结果越精确。
c语言表示积分积分是微积分的重要概念之一,用于求函数在某个区间上的总量或者累积变化量。
在C语言中,我们可以使用不同的方法来实现积分的计算。
一、定积分的计算方法定积分是指在某个区间上求函数与x轴之间的面积,可以用面积与区间长度的乘积来表示。
在C语言中,可以通过数值积分方法来近似计算定积分。
1.矩形法:矩形法是一种最简单的数值积分方法,它将区间划分为多个小矩形,然后用矩形面积的和来近似表示函数的总面积。
具体步骤如下:a.将区间[a, b]等分为n个小区间,每个小区间的宽度为h=(b-a)/n。
b.在每个小区间的右边选择一个点xi(i=0,1,2,...,n-1),计算出该点对应的函数值f(xi)。
c.将每个小矩形的面积f(xi)*h累加起来,得到总面积。
2.梯形法:梯形法是另一种常用的数值积分方法,它将区间划分为多个小梯形,然后用梯形面积的和来近似表示函数的总面积。
具体步骤如下:a.将区间[a, b]等分为n个小区间,每个小区间的宽度为h=(b-a)/n。
b.在每个小区间的两个端点上计算函数值,得到f(xi)和f(xi+1)。
c.将每个小梯形的面积[(f(xi)+f(xi+1))/2]*h累加起来,得到总面积。
二、代码示例下面是使用C语言实现上述两种数值积分方法的代码示例:1.矩形法代码示例:```c#include <stdio.h>double f(double x) {//定义被积函数return x*x;}double integral_rectangle(double a, double b, int n) { //计算矩形法近似积分double h = (b - a) / n;double sum = 0.0;for (int i = 0; i < n; i++) {double x = a + i * h;sum += f(x);}return sum * h;}int main() {double a = 0.0; //积分下限double b = 1.0; //积分上限int n = 100; //小区间个数double result = integral_rectangle(a, b, n); printf("矩形法求积分的结果为:%lf\n", result); return 0;}```2.梯形法代码示例:```c#include <stdio.h>double f(double x) {//定义被积函数return x*x;}double integral_trapezoid(double a, double b, int n) { //计算梯形法近似积分double h = (b - a) / n;double sum = 0.0;for (int i = 0; i < n; i++) {double x1 = a + i * h;double x2 = a + (i+1) * h;sum += (f(x1) + f(x2)) / 2;}return sum * h;}int main() {double a = 0.0; //积分下限double b = 1.0; //积分上限int n = 100; //小区间个数double result = integral_trapezoid(a, b, n);printf("梯形法求积分的结果为:%lf\n", result);return 0;}```三、总结以上是使用C语言实现数值积分的两种方法,定积分是微积分中的重要概念,可以通过数值积分方法来近似计算定积分的值。
数值分析⽅法计算定积分⽤C语⾔实现⼏种常⽤的数值分析⽅法计算定积分,代码如下:1 #include <stdio.h>2 #include <string.h>3 #include <stdlib.h>4 #include <math.h>56#define EPS 1.0E-14 //计算精度7#define DIV 1000 //分割区间,值越⼤,精确值越⾼8#define ITERATE 20 //⼆分区间迭代次数,区间分割为2^n,初始化应该⼩⼀点,否则会溢出910#define RECTANGLE 0 //矩形近似11#define TRAPEZOID 1 //梯形近似12#define TRAPEZOID_FORMULA 2 //递推梯形公式13#define SIMPSON_FORMULA 3 //⾟普森公式14#define BOOL_FORMULA 4 //布尔公式1516double function1(double);17double function2(double);18double function3(double);19void Integral(int, double f(double), double, double); //矩形, 梯形逼近求定积分公式20void Trapezoid_Formula(double f(double), double a, double b); //递推梯形公式21void Simpson_Formula(double f(double), double a, double b); //⾟普森公式22void Bool_Formula(double f(double), double a, double b); //布尔公式23void Formula(int, double f(double), double, double);2425double function1(double x)26 {27double y;28 y = cos(x);29return y;30 }3132double function2(double x)33 {34double y;35 y=1/x;36// y = 2+sin(2 * sqrt(x));37return y;38 }3940double function3(double x)41 {42double y;43 y = exp(x);44return y;45 }4647int main()48 {49 printf("y=cos(x) , x=[0, 1]\n");50 printf("Rectangle : "); Integral(RECTANGLE, function1, 0, 1);51 printf("Trapezoid : "); Integral(TRAPEZOID, function1, 0, 1);52 Formula(TRAPEZOID_FORMULA, function1, 0, 1);53 Formula(SIMPSON_FORMULA, function1, 0, 1);54 Formula(BOOL_FORMULA, function1, 0, 1);55 printf("\n");5657 printf("y=1/x , x=[1, 5]\n");58 printf("Rectangle : "); Integral(RECTANGLE, function2, 1, 5);59 printf("Trapezoid : "); Integral(TRAPEZOID, function2, 1, 5);60 Formula(TRAPEZOID_FORMULA, function2, 1, 5);61 Formula(SIMPSON_FORMULA, function2, 1, 5);62 Formula(BOOL_FORMULA, function2, 1, 5);63 printf("\n");6465 printf("y=exp(x) , x=[0, 1]\n");66 printf("Rectangle : "); Integral(RECTANGLE, function3, 0, 1);67 printf("Trapezoid : "); Integral(TRAPEZOID, function3, 0, 1);68 Formula(TRAPEZOID_FORMULA, function3, 0, 1);69 Formula(SIMPSON_FORMULA, function3, 0, 1);70 Formula(BOOL_FORMULA, function3, 0, 1);7172return0;73 }74//积分:分割-近似-求和-取极限75//利⽤黎曼和求解定积分76void Integral(int method, double f(double),double a,double b) //f(double),f(x), double a,float b,区间两点77 {79double x;80double sum = 0; //矩形总⾯积81double h; //矩形宽度82double t = 0; //单个矩形⾯积8384 h = (b-a) / DIV;8586for(i=1; i <= DIV; i++)87 {88 x = a + h * i;89switch(method)90 {91case RECTANGLE :92 t = f(x) * h;93break;94case TRAPEZOID :95 t = (f(x) + f(x - h)) * h / 2;96break;97default:98break;99 }100 sum = sum + t; //各个矩形⾯积相加101 }102103 printf("the value of function is %.10f\n", sum);104 }105106//递推梯形公式107void Trapezoid_Formula(double f(double), double a, double b)//递推梯形公式108 {109 unsigned int i, j, M, J=1;110double h;111double F_2k_1 = 0;112double T[32];113double res = 0;114115 T[0] = (f(a) + f(b)) * (b-a)/2;116for(i=0; i<ITERATE; i++)117 {118 F_2k_1 = 0;119 J = 1;120121for(j=0; j<=i; j++) //区间划分122 J <<= 1; //2^J123 h = (b - a) /J; //步长124//M = J/2; //2M表⽰将积分区域划分的块数125for(j=1; j <= J; j += 2) //126 {127 F_2k_1 += f(a + j*h); //f(2k-1)累加和128 }129 T[i+1] = T[i]/2 + h * F_2k_1; //递推公式130 res = T[i+1];131132if(fabs(T[i+1] - T[i]) < EPS)133if(i < 3) continue;134else break;135 }136137 printf("Trapezoid_Formula : the value of function is %.10f\n", res);138//return res;139 }140//⾟普森公式141void Simpson_Formula(double f(double), double a, double b) //⾟普森公式142 {143 unsigned int i, j, M, J=1;144double h;145double F_2k_1 = 0;146double T[32], S[32];147double res_T = 0, res_S = 0;148149 T[0] = (f(a) + f(b)) * (b-a)/2;150for(i=0; i<ITERATE; i++)151 {152 F_2k_1 = 0;153 J = 1;154155for(j=0; j<=i; j++) //区间划分156 J <<= 1; //2^J157 h = (b - a) /J; //步长158//M = J/2; //2M表⽰将积分区域划分的块数159for(j=1; j <= J; j += 2) //160 {161 F_2k_1 += f(a + j*h); //f(2k-1)累加和163 T[i+1] = T[i]/2 + h * F_2k_1; //递推梯形公式164 res_T = T[i+1];165166if(fabs(T[i+1] - T[i]) < EPS)167if(i < 3) continue;168else break;169 }170171for(i=1; i<ITERATE; i++)172 {173 S[i] = (4 * T[i] - T[i-1]) / 3; //递推⾟普森公式174 res_S = S[i];175if(fabs(S[i] - S[i-1]) < EPS)176if(i < 3) continue;177else break;178 }179180 printf("Simpson_Formula : the value of function is %.10f\n", res_S);181//return res_S;182 }183184//布尔公式185void Bool_Formula(double f(double), double a, double b) //布尔公式186 {187 unsigned int i, j, M, J=1;188double h;189double F_2k_1 = 0;190double T[32], S[32], B[32];191double res_T = 0, res_S = 0, res_B;192193 T[0] = (f(a) + f(b)) * (b-a)/2;194for(i=0; i<ITERATE; i++)195 {196 F_2k_1 = 0;197 J = 1;198199for(j=0; j<=i; j++) //区间划分200 J <<= 1; //2^J201 h = (b - a) /J; //步长202//M = J/2; //2M表⽰将积分区域划分的块数203for(j=1; j <= J; j += 2) //204 {205 F_2k_1 += f(a + j*h); //f(2k-1)累加和206 }207 T[i+1] = T[i]/2 + h * F_2k_1; //递推公式208 res_T = T[i+1];209210if(fabs(T[i+1] - T[i]) < EPS)211if(i < 3) continue;212else break;213 }214215for(i=1; i<ITERATE; i++)216 {217 S[i] = (4 * T[i] - T[i-1]) / 3; //递推⾟普森公式218 res_S = S[i];219if(fabs(S[i] - S[i-1]) < EPS)220if(i < 3) continue;221else break;222 }223224for(i=1; i<ITERATE; i++)225 {226 B[i] = (16 * S[i] - S[i-1]) / 15; //递推布尔公式227 res_B = B[i];228if(fabs(B[i] - B[i-1]) < EPS)229if(i < 3) continue;230else break;231 }232233 printf("Bool_Formula : the value of function is %.10f\n", res_B);234//return res_B;235 }236237//采⽤⼆分区间的⽅法迭代,实际运⾏速度很慢238void Formula(int method, double f(double), double a, double b)//递推梯形公式239 {240 unsigned int i, j, M, J=1;241double h;242double F_2k_1 = 0;243double T[32], S[32], B[32];244double res_B = 0, res_S = 0, res_T = 0;247for(i=0; i<ITERATE; i++)248 {249 F_2k_1 = 0;250 J = 1;251252for(j=0; j<=i; j++) //区间划分253 J <<= 1; //2^J254 h = (b - a) /J; //步长255//M = J/2; //2M表⽰将积分区域划分的块数256for(j=1; j <= J; j += 2) //257 {258 F_2k_1 += f(a + j*h); //f(2k-1)累加和259 }260 T[i+1] = T[i]/2 + h * F_2k_1; //递推公式261 res_T = T[i+1];262263if(fabs(T[i+1] - T[i]) < EPS)264if(i < 3) continue;265else break;266 }267268switch(method)269 {270default :271case TRAPEZOID_FORMULA :272 printf("Trapezoid_Formula : the value of function is %.10f\n", res_T); 273//return res_T;274break;275case SIMPSON_FORMULA :276for(i=1; i<ITERATE; i++)277 {278 S[i] = (4 * T[i] - T[i-1]) / 3;279 res_S = S[i];280if(fabs(S[i] - S[i-1]) < EPS)281if(i < 3) continue;282else break;283 }284 printf("Simpson_Formula : the value of function is %.10f\n", res_S); 285//return res_S;286break;287case BOOL_FORMULA :288for(i=1; i<ITERATE; i++)289 {290 S[i] = (4 * T[i] - T[i-1]) / 3;291 res_S = S[i];292if(fabs(S[i] - S[i-1]) < EPS)293if(i < 3) continue;294else break;295 }296for(i=1; i<ITERATE; i++)297 {298 B[i] = (16 * S[i] - S[i-1]) / 15;299 res_B = B[i];300if(fabs(B[i] - B[i-1]) < EPS)301if(i < 3) continue;302else break;303 }304305 printf("Bool_Formula : the value of function is %.10f\n", res_B); 306//return res_B;307break;308 }309310 }测试结果:。
1. 描述问题利用①左矩形公式,②中矩形公式,③右矩形公式 ,④梯形公式,⑤simpson 公式,⑥Gauss 积分公式求解定积分。
2. 分析问题2.1定积分21.1定积分的定义定积分就是求函数()f x 在区间[],a b 中图线下包围的面积。
即()0,,,y x a x b y f x ====所包围的面积。
这个图形称为曲边梯形,特例是曲边梯形。
如下图:(图1)设一元函数()y f x =,在区间[],a b 内有定义。
将区间[],a b 分成n 个小区间[][][][]00112,,,,,......,i a x x x x x x b 。
设1i i i x x x -∆=-,取区间i x ∆中曲线上任意一点记做()i f ξ,作和式:()1lim n n i f i xi ξ→+∞=⎛⎫∆ ⎪⎝⎭∑ 若记λ为这些小区间中的最长者。
当0λ→时,若此和式的极限存在,则称这个和式是函数()f x 在区间[],a b 上的定积分。
记作:()ba f x dx ⎰其中称a 为积分下限,b 为积分上限,()f x 为被积函数,()f x dx 为被积式,∫ 为积分号。
之所以称其为定积分,是因为它积分后得出的值是确定的,是一个数,而不是一个函数。
21.2定积分的几何意义[1]它是介于x 轴、函数f(x)的图形及两条直线x=a ,x=b 之间的各个部分面积的代数和。
在x 轴上方的面积取正号;在x 轴下方的面积取负号。
如图2.2言实现定积分计算的算法22.1利用复合梯形公式实现定积分的计算假设被积函数为()f x ,积分区间为[],a b ,把区间[],a b 等分成n 个小区间,各个区间的长度为h ,即()/h b a n =-,称之为“步长”。
根据定积分的定义及几何意义,定积分就是求函数()f x 在区间[],a b 中图线下包围的面积。
将积分区间n 等分,各子区间的面积近似等于梯形的面积,面积的计算运用梯形公式求解,再累加各区间的面积,所得的和近似等于被积函数的积分值,n 越大,所得结果越精确。
以上就是利用复合梯形公式实现定积分的计算的算法思想。
复合梯形公式:()()()1122n n i i h T f a f x f b -=⎛⎫=++ ⎪⎝⎭∑[2]具体算法如下:算法一1:输入积分区间的端点值a 和b ;2:输入区间的等分个数n (要求n 尽可能大,以保证程序运行结果有较高的精确度);3:计算步长()/h b a n =-;4:对累加和赋初值()/2a b T f f =-; 5:计算累加和()11n i i T f x -==∑6:算出积分值n T T h =⨯; 7:输出积分近似值n T ,完毕。
1.2.2利用Smpson 公式实现定积分的计算假设被积函数为()f x ,积分区间为[],a b ,把区间[],a b 等分成n 个小区间,各个区间的长度为h 。
在复合梯形公式的基础上,构造出一种加速计算积分的方法。
作为一种外推算法, 它在不增加计算量的前提下提高了误差的精度。
具体算法如下:算法二1:输入积分上限b 和下限a ;2:输入区间的等分个数n (要求n 尽可能大,以保证程序运行结果有较高的精确度);3:利用辛甫生公式:[][][]()42/3S n T n T n =⨯-[2],实现对定积分的求解(其中[]2T n ,[]T n 均为梯形公式计算所得的结果,由此可见辛甫生公式是以梯形公式为基础的);4:算出积分值S;n,完毕。
5:输出积分近似值Sn1.2.3利用Guass公式实现定积分计算Guass型求积公式是构造高精度差值积分的最好方法之一。
他是通过让节点和积分系数待定让函数f(x)以此取i=0,1,2....n次多项式使其尽可能多的能够精确成立来求出积分节点和积分系数。
高斯积分的代数精度是2n-1,而且是最高的。
通常运用的是-1---+1的积分节点和积分系数,其他积分域是通过变换x=(b-a)t/2 +(a+b)/2 变换到-1到1之间积分。
算法三1:输入积分上限b和下限a;2:利用Guass公式,求定积分;4:算出积分值Sn,完毕。
5:输出积分近似值Sn3.程序的编写3.1程序一(左矩形公式)3.1.1源程序#include<stdio.h>#include<math.h>void main(){double f(double x);/*f(x)为函数举例,即被积函数*/int i,n;/*n为区间等分的个数,应尽可能大*/double a,b,h,s;/*a为积分下限,b为积分上限,h为步长*/printf("积分下限a:\n");scanf("%lf",&a);printf("积分上限b:\n");scanf("%lf",&b);printf("区间等分个数n :\n");scanf("%d",&n);h=(b-a)/n; /*步长的计算*/s=f(a)*h;for(i=1;i<n;i++){s=s+f(a+i*h)*h;}printf("函数f(x) 的积分值为s=%10.6f\n",s); }/*以下为被积函数的定义,即函数举例*/ double f(double x){double y;y=sqrt(4-x*x);return (y);}3.1.2程序一的编译运行被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:输入0+回车输入2+回车输入1000+回车3.2程序二(中矩形公式)3.2.1源程序#include<stdio.h>#include<math.h>void main(){double f(double x);/*f(x)为函数举例,即被积函数*/int i,n;/*n为区间等分的个数,应尽可能大*/ double a,b,h,s;/*a为积分下限,b为积分上限,h为步长*/ printf("积分下限a:\n");scanf("%lf",&a);printf("积分上限b:\n");scanf("%lf",&b);printf("区间等分个数n :\n");scanf("%d",&n);h=(b-a)/n; /*步长的计算*/s=0.5*(f(a)+f(a+h))*h;for(i=1;i<n;i++){s=s+0.5*(f(a+i*h)+f(a+(i+1)*h))*h;}printf("函数f(x) 的积分值为s=%10.6f\n",s); }/*以下为被积函数的定义,即函数举例*/ double f(double x){double y;y=sqrt(4-x*x);return (y);}3.2.2程序二的编译运行被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:输入0+回车输入2+回车输入1000+回车3.3程序三(右矩形公式)3.3.1源程序#include<stdio.h>#include<math.h>void main(){double f(double x);/*f(x)为函数举例,即被积函数*/int i,n;/*n为区间等分的个数,应尽可能大*/ double a,b,h,s;/*a为积分下限,b为积分上限,h为步长*/ printf("积分下限a:\n");scanf("%lf",&a);printf("积分上限b:\n");scanf("%lf",&b);printf("区间等分个数n :\n");scanf("%d",&n);h=(b-a)/n; /*步长的计算*/s=f(a+h)*h;for(i=1;i<n-1;i++){s=s+f(a+(i+1*h))*h;}printf("函数f(x) 的积分值为s=%10.6f\n",s); }/*以下为被积函数的定义,即函数举例*/ double f(double x){double y;y=sqrt(4-x*x);return (y);}3.3.2程序三的编译运行被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:输入0+回车输入2+回车输入1000+回车3.4程序四(梯形公式)3.4.1源程序#include<stdio.h>#include<math.h>void main(){double f(double x);/*f(x)为函数举例,即被积函数*/int i,n;/*n为区间等分的个数,应尽可能大*/ double a,b,h,s;/*a为积分下限,b为积分上限,h为步长*/ printf("积分下限a:\n");scanf("%lf",&a);printf("积分上限b:\n");scanf("%lf",&b);printf("区间等分个数n :\n");scanf("%d",&n);h=(b-a)/n; /*步长的计算*/s=0.5*(f(a)+f(a+h))*h;for(i=1;i<n;i++){s=s+0.5*(f(a+i*h)+f(a+(i+1)*h))*h;}printf("函数f(x) 的积分值为s=%10.6f\n",s); }/*以下为被积函数的定义,即函数举例*/ double f(double x){double y;y=sqrt(4-x*x);return (y);}3.4.2程序四的编译运行被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:输入0+回车输入2+回车输入1000+回车3.5程序五(Simpson公式)3.5.1源程序#include<stdio.h>#include<math.h>void main(){double T(double x,double y,int z); double a,b,s;int n;printf("积分下限a:\n");scanf("%lf",&a);printf("积分上限b:\n");scanf("%lf",&b);printf("区间等分个数n :\n");scanf("%d",&n);s=(4*T(a,b,2*n)-T(a,b,n))/3;/*利用辛甫生公式求解定积分*/printf("函数f(x) 的积分值为s=%f\n",s); }/*以下为复合梯形公式的定义*/double T(double x,double y,int z) {double h,Tn;int i;double f(double t);h=(y-x)/z;Tn=(f(x)+f(y))/2;for(i=1;i<z;i++)Tn=Tn+f(x+i*h);Tn=Tn*h;return (Tn);}/*以下为被积函数的定义,即函数举例*/ double f(double t){double s;s=sqrt(4-t*t);return (s);}3.5.2程序四的编译运行被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:输入0+回车输入2+回车输入1000+回车3.6程序六(Guass公式)3.6.1源程序#include <stdio.h>#include <math.h>#define N 3float gass_integral(float (*)(float),float,float,int);void main(){float function_name(float);float a,b;printf("请输入积分上限b\n");scanf("%f",&b);printf("请输入积分下限a\n");scanf("%f",&a);float ans;ans=gass_integral(function_name,a,b,N);printf("ans=%f",ans);}//高斯求积:代数精度为2n-1. -1---+1 之间float gass_integral(float (*func)(float x), float a,float b ,int n ) {//高斯点及其求积系数列表-------------------------------------------------------------------------------------------float x1[1]={0.0}; float A1[1]={2};float x2[2]={-0.5573503,0.5573503}; float A2[2]={1,1};float x3[3]={-0.7745967,0.0,0.7745967}; float A3[3]={0.555556,0.888889,0.555556};float x4[4]={0.3399810,-0.3399810,0.8611363,-0.8611363};float A4[4]={0.6521452,0.6521452,0.3478548,0.3478548}; float x5[5]={0.0,0.5384693,-0.5384693,0.9061799,-0.9061799}; floatA5[5]={0.5688889,0.4786287,0.4786287,0.2369269,0.2369269};//----------------------------------------------------------------------------------------------------------------------------------float * p,* t;switch ( n){case 1 : p=x1;t=A1;break;case 2 : p=x2;t=A2;break;case 3 : p=x3;t=A3;break;case 4 : p=x4;t=A4;break;case 5 : p=x5;t=A5;break;default : printf("intput wrong!");}float g=0;for(int i=0;i<n;i++){g+=(*func)((b-a)*p[i]/2+(a+b)/2)*t[i];}g*=(b-a)/2;return g;}float function_name(float x){return (sqrt(4-x*x));}3.6.2程序四的编译运行被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:输入2+回车输入0+回车4误差分析手工计算结果为:3.156173.,左矩形公式误差:0.39%,中矩形公式误差:0.46%,右矩形公式误差:0.52%,梯形公式误差:0.46%,辛普森公式和高斯公式误差几乎等于0,六个程序运行结果对比,在计算相同的函数f(x)=sqrt(4-x*x)的定积分,Simpson公式和Guass公式比矩形和梯形公式更可行,更有效。