C语言-用矩形法和梯形法求定积分
- 格式:doc
- 大小:31.00 KB
- 文档页数:2
定积分的近似计算方法定积分近似计算方法指的是利用数值计算方法来估算给定函数在一定区间上的积分值。
这些方法常常用于当函数在该区间内无法求得解析式时,或者解析式难以求得的情况下。
下面将介绍常用的数值积分近似计算方法。
一、矩形法矩形法即将积分区间等分为若干小区间,然后在每个小区间中选择一个代表点,将函数在该点的函数值作为近似积分的值。
具体可以分为左矩形法、右矩形法和中矩形法。
1.左矩形法左矩形法即取每个小区间的左端点作为代表点,近似积分的值为:∫[a, b]f(x)dx ≈ Δx * [f(a) +f(a+Δx) + … + f(a+(n-1)Δx)]其中,Δx=(b-a)/n,n为区间的等分数。
2.右矩形法右矩形法即取每个小区间的右端点作为代表点,近似积分的值为:∫[a, b]f(x)dx ≈ Δx * [f(a+Δx) + f(a+2Δx) + … +f(a+nΔx)]其中,Δx=(b-a)/n,n为区间的等分数。
3.中矩形法中矩形法即取每个小区间的中点作为代表点,近似积分的值为:∫[a, b]f(x)dx ≈ Δx * [f(a+Δx/2) + f(a+3Δx/2) + … +f(a+(2n-1)Δx/2)]其中,Δx=(b-a)/n,n为区间的等分数。
二、梯形法梯形法是通过将积分区间上的曲线拟合为多个梯形来近似计算定积分的方法。
将积分区间[a,b]等分为n个小区间,然后在每个小区间上用两个端点处的函数值拟合成一个梯形,然后将这些梯形的面积加起来即可得到近似的定积分的值。
具体计算公式为:∫[a, b]f(x)dx ≈ Δx/2 * [f(a) + 2f(a+Δx) + 2f(a+2Δx)+ … + 2f(a+(n-1)Δx) + f(b)]其中,Δx=(b-a)/n,n为区间的等分数。
三、辛普森法辛普森法是通过将积分区间上的曲线拟合为多个二次多项式的方法。
将积分区间[a,b]等分为n个小区间,每两个相邻区间拟合成一个二次多项式。
编程实现数值积分的几种--方法c语言数值计算2010-11-05 09:52:43 阅读385 评论1 字号:大中小订阅复化梯形公式在区间不大时, 用梯形公式、辛卜生公式计算定积分是简单实用的, 但当区间较大时, 用梯形公式、辛卜生公式计算定积分达不到精确度要求 . 为了提高计算的精确度,我们将[a,b] 区间n等分,在每个小区间上应用梯形公式、辛卜生公式计算定积分,然后将其结果相加,这样就得到了复化梯形公式和复化辛卜生公式。
1. 复化梯形公式将积分区间等分, 设, 则节点为对每个小区间上应用梯形公式, 然后将其结果相加,则得(3.14)称(3.14) 式为复化梯形公式 .当在[a,b] 上有连续的二阶导数时,则复化梯形公式(3.14) 的余项推导如下:因为所以在区间[a,b] 上公式(3.14) 的误差为又因为在区间[a,b] 上连续,由连续函数的性质知,在区间[a,b] 上存在一点,于是( 3.15 )复化梯形公式,复化抛物线公式和Romberg求积法的算法程序:以下程序均定义误差限为1*10^-5;1)复化梯形公式:#include <stdio.h>#include <math.h>#define e 1e-5#define a 0 //积分下限a#define b 1 //积分上限b#define f(x) (4/(1+(x*x))) //被积函数f(x)int main(){int i,n;double h,t0,t,g;n=1; //赋初值h=(double)(b-a)/2;t=h*(f(a)+f(b));do{t0=t;g=0;for (i=1;i<=n;i++)g+=f((a+(2*i-1)*h));t=(t0/2)+(h*g); //复化梯形公式n*=2;h/=2;}while (fabs(t-t0)>e); //自定义误差限e printf("%.8lf",t); //输出积分的近似值return 0;}2)复化抛物线公式:#include <stdio.h>#include <math.h>#define e 1e-5#define a 0 //积分下限a#define b 1 //积分上限b#define f(x) (4/(1+(x*x))) //被积函数f(x)int main(){int i,n;double f1,f2,f3,h,s0,s;f1=f(a)+f(b); //赋初值f2=f(((double)(b+a)/2));f3=0;s=((double)(b-a)/6)*(f1+4*f2);n=2;h=(double)(b-a)/4;do //复化抛物线算法{f2+=f3;s0=s;f3=0;for (i=1;i<=n;i++)f3+=f((a+(2*i-1)*h));s=(h/3)*(f1+2*f2+4*f3);n*=2;h/=2;}while (fabs(s-s0)>e); //自定义误差限printf("%.8lf",s);return 0;}3)Romberg求积法:#include <stdio.h>#include <math.h>#define e 1e-5#define a 0 //积分下限a#define b 1 //积分上限b#define f(x) (4/(1+(x*x))) //被积函数f(x)double t[100][100];int main(){int n,k,i,m;double h,g,p;h=(double)(b-a)/2;t[0][0]=h*(f(a)+f(b));k=1;n=1;do //Romberg算法{g=0;for (i=1;i<=n;i++)g+=f((a+((2*i-1)*h)));t[k][0]=(t[k-1][0]/2)+(h*g);for (m=1;m<=k;m++){p=pow(4,(double)(m));t[k-m][m]=(p*t[k-m+1][m-1]-t[k-m][m-1])/(p-1);}m-=1;h/=2;n*=2;k+=1;}while (fabs(t[0][m]-t[0][m-1])>e); //自定义误差限eprintf("%.8lf",t[0][m]);return 0;}给定精度,定义误差限为1*10^-5,分别求出步长的先验估计值:用复化梯形公式计算,要求h<0. 007746。
淮北师范大学2010届学士学位论文C语言求解定积分系别、专业数学科学学院信息与计算科学研究方向计算机学生姓名谢贵龙学号06114303068指导教师姓名罗婷婷指导教师职称讲师2010年4月20日C语言求解定积分谢贵龙(淮北师范大学,数学科学学院,淮北,235000)摘要本文以连续函数在闭区间上的定积分为研究的出发点。
在简单介绍定积分、连续函数等相关定义后,论述了两种算法思想,并利用C语言编写相应的程序。
通过函数举例验证了算法的合理性和正确性,并讨论了这两种算法在适用范围及精确度上的略微差异。
最后通过本文的论述推广到其它求定积分的算法的实现。
关键词C语言,定积分,编程C Language to Solve Definite IntegralXie Guilong(School of Mathematical Science, Huaibei Normal University,huaibei,235000)AbstractIn this thesis, definite integral of a continuous function in the closed interval starting point for research.After a brief introduction of definite integral and continuous function definition,I discussed the ideas of two algorithms and used the corresponding program written in C.And then I verified through the example Function algorithm is correct and reasonable,discussed the scope of the two algorithms and the accuracy of the slight difference.Finally, the request will be extended to other points of the algorithm, through the discussion of this thesis.Keywords C Language, definite integral, programming目录引言 (1)一、C语言实现定积分计算的算法 (1)1.1定积分 (1)1.2C语言实现定积分计算的算法 (2)二、模块构成和各模块功能 (3)2.1关于算法一的模块构成和各模块功能 (3)2.2关于算法二的模块构成和各模块功能 (4)三、C语言求解定积分的具体程序 (4)3.1程序一(复合梯形公式求解定积分) (4)3.2程序二(辛甫生公式求解定积分) (5)四、程序编译运行及调试情况 (6)4.1程序一的编译运行及调试情况 (6)4.2程序二的编译运行及调试情况 (9)4.3程序简单分析 (11)参考文献 (12)致谢 (13)引言随着计算机的普及,计算机越来越多的运用于数学领域,但在早期,计算机实现的数学作用仅仅是四则运算、统计计算等简单的功能。
八、常用算法(一)考核知识要点1.交换、累加、累乘、求最大(小)值2.穷举3.排序(冒泡、插入、选择)4.查找(顺序、折半)5.级数计算(递推法)6.一元方程求解(牛顿迭代法、二分法)7.矩阵(转置)8.定积分计算(矩形法、梯形法)9.辗转相除法求最大公约数、判断素数10.数制转换(二)重点、难点精解教材中给出的算法就不再赘述了。
1.基本操作:交换、累加、累乘1)交换交换算法的要领是“借助第三者”(如同交换两个杯子里的饮料,必须借助第三个空杯子)。
例如,交换两个整型变量里的数值:int a=7,b=9,t;t=a; a=b; b=t;(不借助第三者,也能交换两个整型变量里的数值,但不通用,只是一个题目而已。
例如:int a=7,b=9; a=a+b; b=a-b; a=a-b;)2)累加累加算法的要领是形如“s=s+A”的累加式,此式必须出现在循环中才能被反复执行,从而实现累加功能。
“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为0。
3)累乘累乘算法的要领是形如“s=s*A”的累乘式,此式必须出现在循环中才能被反复执行,从而实现累乘功能。
“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为1。
2.非数值计算常用经典算法1)穷举法也称为“枚举法”,即将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现。
例如,用穷举法输出“将1元人民币兑换成1分、2分、5分硬币”的所有方法。
main(){int y,e,w;for(y=0;y<=100;y++)for(e=0;e<=50;e++)for(w=0;w<=20;w++)if(1*y+2*e+5*w==100)printf("%d,%d,%d\n",y,e,w);}2)有序序列的插入算法就是将某数据插入到一个有序序列后,该序列仍然有序。
以下给出用数组描述该算法的例子:将x插入一升序数列后,数列仍为升序排列。
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++ 矩形法梯形法抛物线法求定积分矩形法、梯形法和抛物线法都是数值积分的常见方法,用于计算定积分的近似值。
矩形法(Rectangle Method)是最简单的数值积分方法之一。
它将积分区间等分为若干个小矩形,然后计算这些小矩形的面积之和作为整个区间上的定积分的近似值。
矩形法有两种常见的计算方式:左矩形法和右矩形法。
左矩形法(Left Rectangle Method)在每个子区间上选择区间左端点的函数值来计算小矩形的面积。
具体计算方法如下:```def left_rectangle(f, a, b, n):h = (b - a) / n # 子区间的宽度result = 0for i in range(n):x = a + i * h # 子区间的左端点result += f(x) * h # 计算小矩形的面积并累加return result```右矩形法(Right Rectangle Method)则选择区间右端点的函数值计算小矩形的面积:```def right_rectangle(f, a, b, n):h = (b - a) / n # 子区间的宽度result = 0for i in range(1, n + 1):x = a + i * h # 子区间的右端点result += f(x) * h # 计算小矩形的面积并累加return result```梯形法(Trapezoid Method)是一种稍微复杂一些的数值积分方法,它通过用梯形来逼近曲线下面积来计算定积分的近似值。
具体计算方法如下:```def trapezoid(f, a, b, n):h = (b - a) / n # 子区间的宽度result = (f(a) + f(b)) / 2 # 首先加上首尾两个端点的函数值for i in range(1, n):x = a + i * h # 子区间的点result += f(x) # 加上子区间内的函数值result *= h # 乘以子区间宽度return result```抛物线法(Parabolic Method)则采用二次插值的方式来逼近曲线下面积,计算定积分的近似值。
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;}。
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语言__用六种方法求定积分C语言是一种广泛应用于科学计算、算法设计和系统编程的程序设计语言。
虽然C语言本身并没有提供内置的定积分计算函数,但可以通过使用不同的方法来近似计算定积分。
以下将介绍六种常见的数值积分方法:矩形法、梯形法、辛普森法、龙贝格法、高斯-勒让德法和自适应辛普森法。
1. 矩形法(Reimann Sum):将积分区间等分成若干小区间,然后在每个小区间取一个函数值,最后将所有函数值相加,并乘以区间大小。
这相当于将每个小区间上的曲线近似为一个矩形。
2. 梯形法(Trapezoidal Rule):将积分区间分割成若干小区间,并在每个小区间使用梯形面积公式进行近似计算。
梯形的上底和下底分别为相邻两个小区间的函数值,高为小区间的宽度。
3. 辛普森法(Simpson's Rule):将积分区间分割成若干小区间,并在每个小区间使用三点拉格朗日插值多项式近似计算。
辛普森法使用二次多项式来逼近曲线,能够更好地近似曲线的曲率。
4. 龙贝格法(Romberg Method):龙贝格法是一种逐步逼近的方法,将积分区间多次分割,并使用多种精度的梯形法进行计算。
通过不断提高梯形法的精度,最终逼近定积分的值。
5. 高斯-勒让德法(Gauss-Legendre Method):高斯-勒让德法使用一组预先确定的节点和权重,将积分区间变换到[-1,1]上,然后使用插值多项式计算定积分的近似值。
该方法的优点是能够以很高的精度计算积分值。
6. 自适应辛普森法(Adaptive Simpson's Rule):自适应辛普森法根据曲线的变化程度自动调整子区间的大小。
在每个小区间上计算出辛普森值,并与高斯-勒让德法值进行比较,以决定是否需要进一步细分区间。
以上这些方法都可以使用C语言中的循环、条件语句和函数来实现。
具体实现的步骤包括:将积分区间分割成若干小区间,计算每个小区间上的函数值,然后将这些函数值进行加权求和,最后乘以相应的权重或宽度,得到定积分的近似值。