编写程序近似计算定积分。

合集下载

[整理]定积分的近似计算

[整理]定积分的近似计算

[整理]定积分的近似计算实验⼆定积分的近似计算⼀、问题背景与实验⽬的利⽤⽜顿—莱布尼兹公式虽然可以精确地计算定积分的值,但它仅适⽤于被积函数的原函数能⽤初等函数表达出来的情形.如果这点办不到或者不容易办到,这就有必要考虑近似计算的⽅法.在定积分的很多应⽤问题中,被积函数甚⾄没有解析表达式,可能只是⼀条实验记录曲线,或者是⼀组离散的采样值,这时只能应⽤近似⽅法去计算相应的定积分.本实验将主要研究定积分的三种近似计算算法:矩形法、梯形法、抛物线法.对于定积分的近似数值计算,Matlab有专门函数可⽤.⼆、相关函数(命令)及简介1.sum(a):求数组a的和.2.format long:长格式,即屏幕显⽰15位有效数字.(注:由于本实验要⽐较近似解法和精确求解间的误差,需要更⾼的精度).3.double():若输⼊的是字符则转化为相应的ASCII码;若输⼊的是整型数值则转化为相应的实型数值.4.quad():抛物线法求数值积分.格式:quad(fun,a,b) ,注意此处的fun是函数,并且为数值形式的,所以使⽤*、/、^等运算时要在其前加上⼩数点,即.*、./、.^等.例:Q = quad('1./(x.^3-2*x-5)',0,2);5.trapz():梯形法求数值积分.格式:trapz(x,y)其中x为带有步长的积分区间;y为数值形式的运算(相当于上⾯介绍的函数fun)例:计算0sin()dx xπx=0:pi/100:pi;y=sin(x);trapz(x,y)6.dblquad():抛物线法求⼆重数值积分.格式:dblquad(fun,xmin,xmax,ymin,ymax),fun可以⽤inline定义,也可以通过某个函数⽂件的句柄传递.例1:Q1 = dblquad(inline('y*sin(x)'), pi, 2*pi, 0, pi)顺便计算下⾯的Q2,通过计算,⽐较Q1 与Q2结果(或加上⼿⼯验算),找出积分变量x、y的上下限的函数代⼊⽅法.Q2 = dblquad(inline('y*sin(x)'), 0, pi, pi, 2*pi)例2:Q3 = dblquad(@integrnd, pi, 2*pi, 0, pi)这时必须存在⼀个函数⽂件integrnd.m:function z = integrnd(x, y)z = y*sin(x);7.fprintf (⽂件地址,格式,写⼊的变量):把数据写⼊指定⽂件.例:x = 0:.1:1;y = [x; exp(x)];fid = fopen('exp.txt','w'); %打开⽂件fprintf(fid,'%6.2f %12.8f\n',y); %写⼊fclose(fid) %关闭⽂件8.syms 变量1 变量2 …:定义变量为符号.9.sym('表达式'):将表达式定义为符号.解释:Matlab 中的符号运算事实上是借⽤了Maple 的软件包,所以当在Matlab 中要对符号进⾏运算时,必须先把要⽤到的变量定义为符号.10.int(f,v,a,b):求f 关于v 积分,积分区间由a 到b .11.subs(f ,'x',a):将 a 的值赋给符号表达式 f 中的 x ,并计算出值.若简单地使⽤subs(f),则将f 的所有符号变量⽤可能的数值代⼊,并计算出值.三、实验内容1.矩形法根据定积分的定义,每⼀个积分和都可以看作是定积分的⼀个近似值,即1()d ()nbi i a i f x x f x ?==?∑?在⼏何意义上,这是⽤⼀系列⼩矩形⾯积近似⼩曲边梯形的结果,所以把这个近似计算⽅法称为矩形法.不过,只有当积分区间被分割得很细时,矩形法才有⼀定的精确度.针对不同i ?的取法,计算结果会有不同,我们以 120d 1x x +?为例(取100=n ),(1)左点法:对等分区间b x i na b a x x a x n i =<<-+=<<<= 10,在区间],[1i i x x -上取左端点,即取1-=i i x ?,12 01d ()1n i i i x f x x ?==?≈+∑?0.78789399673078,理论值 12 0d 14x x π=+?,此时计算的相对误差 0.7878939967307840.0031784ππ-=≈(2)右点法:同(1)中划分区间,在区间],[1i i x x -上取右端点,即取i i x =?,12 01d ()1n i i i x f x x ?==?≈+∑0.78289399673078,理论值 12 0d 14x x π=+?,此时计算的相对误差 0.7828939967307840.0031884ππ-=≈(3)中点法:同(1)中划分区间,在区间1[,]i i x x -上取中点,即取12i i i x x ?-+=, 12 01d ()1n i i i x f x x ?==?≈+∑0.78540024673078,理论值 12 0d 14x x π=+?,此时计算的相对误差 60.785400246730784 2.653104ππ--=≈? 如果在分割的每个⼩区间上采⽤⼀次或⼆次多项式来近似代替被积函数,那么可以期望得到⽐矩形法效果好得多的近似计算公式.下⾯介绍的梯形法和抛物线法就是这⼀指导思想的产物.2.梯形法等分区间b x i n a b a x x a x n i =<<-+=<<<= 10,na b x -=? 相应函数值为n y y y ,,,10 (n i x f y i i ,,1,0),( ==).曲线)(x f y =上相应的点为n P P P ,,,10 (n i y x P i i i ,,1,0),,( ==)将曲线的每⼀段弧i i P P 1-⽤过点1-i P ,i P 的弦i i P P 1-(线性函数)来代替,这使得每个],[1i i x x -上的曲边梯形成为真正的梯形,其⾯积为x y y i i ??+-21,n i ,,2,1 =.于是各个⼩梯形⾯积之和就是曲边梯形⾯积的近似值,11 11()d ()22n n b i i i i a i i y y x f x x x y y --==+?≈??=+∑∑?,即 011 ()d ()22bn n a y y b a f x x y y n --≈++++?,称此式为梯形公式.仍⽤ 120d 1x x +?的近似计算为例,取100=n , 10112 0d ()122n n y y x b a y y x n --≈++++=+?0.78539399673078,理论值 12 0d 14x x π=+?,此时计算的相对误差 60.785393996730784 5.305104ππ--=≈? 很显然,这个误差要⽐简单的矩形左点法和右点法的计算误差⼩得多.3.抛物线法由梯形法求近似值,当)(x f y =为凹曲线时,它就偏⼩;当)(x f y =为凸曲线时,它就偏⼤.若每段改⽤与它凸性相接近的抛物线来近似时,就可减少上述缺点,这就是抛物线法.将积分区间],[b a 作n 2等分,分点依次为b x i n a b a x x a x n i =<<-+=<<<=2102 ,na b x 2-=?,对应函数值为n y y y 210,,, (n i x f y i i 2,,1,0),( ==),曲线上相应点为n P P P 210,,, (n i y x P i i i 2,,1,0),,( ==).现把区间],[20x x 上的曲线段)(x f y =⽤通过三点),(000y x P ,),(111y x P ,),(222y x P 的抛物线)(12x p x x y =++=γβα来近似代替,然后求函数)(1x p 从0x 到2x 的定积分:20 1 ()d x x p x x =?20 2 ()d x x x x x αβγ++=?)()(2)(30220223032x x x x x x -+-+-γβα]4)(2)()()[(62022022202002γβαγβαγβα++++++++++-=x x x x x x x x x x 由于2201x x x +=,代⼊上式整理后得 20 1 ()d x x p x x ?)](4)()[(612122202002γβαγβαγβα++++++++-=x x x x x x x x )4(621002y y y x x ++-=)4(6210y y y na b ++-= 同样也有 42 2 ()d x x p x x ?)4(6432y y y na b ++-=……222 ()d n n x n x p x x -?)4(621222n n n y y y na b ++-=-- 将这n 个积分相加即得原来所要计算的定积分的近似值: 222 22212 11()d ()d (4)6i i n n b x i i i i a x i i b a f x x p x x y y y n ---==-≈=++∑∑?,即021******* ()d [4()2()]6b n n n a b a f x x y y y y y y y y n---≈++++++++? 这就是抛物线法公式,也称为⾟⼘⽣(Simpson )公式.仍⽤ 120d 1x x +?的近似计算为例,取100=n , 102132124222 0d [4()2()]16n n n x b a y y y y y y y y x n ---≈+++++++++?=0.78539816339745,理论值 12 0d 14x x π=+?,此时计算的相对误差 160.785398163397454 2.827104ππ--=≈?4. 直接应⽤Matlab 命令计算结果(1)数值计算 120d .1x x +? ⽅法1:int('1/(1+x^2)','x',0,1) (符号求积分)⽅法2:quad('1./(1+x.^2)',0,1) (抛物线法求数值积分)⽅法3:x=0:0.001:1;y=1./(1+x.^2);trapz(x,y) (梯形法求数值积分)(2)数值计算 2 12 0 1d d x x y y -+?? ⽅法1:int(int('x+y^2','y',-1,1),'x',0,2) (符号求积分)⽅法2:dblquad(inline('x+y^2'),0,2,-1,1) (抛物线法⼆重数值积分)四、⾃⼰动⼿1.实现实验内容中的例⼦,即分别采⽤矩形法、梯形法、抛物线法计算 12 0d 1x x +?,取258=n ,并⽐较三种⽅法的精确程度.2.分别⽤梯形法与抛物线法,计算 2 1d x x,取120=n .并尝试直接使⽤函数trapz()、quad()进⾏计算求解,⽐较结果的差异.3.试计算定积分 0sin d x x x+∞?.(注意:可以运⽤trapz()、quad()或附录程序求解吗?为什么?)4.将 120d 1x x +?的近似计算结果与Matlab 中各命令的计算结果相⽐较,试猜测Matlab 中的数值积分命令最可能采⽤了哪⼀种近似计算⽅法?并找出其他例⼦⽀持你的观点.5.通过整个实验内容及练习,你能否作出⼀些理论上的⼩结,即针对什么类型的函数(具有某种单调特性或凹凸特性),⽤某种近似计算⽅法所得结果更接近于实际值?6.学习fulu2sum.m 的程序设计⽅法,尝试⽤函数 sum 改写附录1和附录3的程序,避免for 循环.五、附录附录1:矩形法(左点法、右点法、中点法)(fulu1.m )format longn=100;a=0;b=1;inum1=0;inum2=0;inum3=0;syms x fxfx=1/(1+x^2);for i=1:nxj=a+(i-1)*(b-a)/n; %左点xi=a+i*(b-a)/n; %右点fxj=subs(fx,'x',xj); %左点值fxi=subs(fx,'x',xi); %右点值fxij=subs(fx,'x',(xi+xj)/2); %中点值inum1=inum1+fxj*(b-a)/n;inum2=inum2+fxi*(b-a)/n;inum3=inum3+fxij*(b-a)/n;endinum1inum2inum3integrate=int(fx,0,1)integrate=double(integrate)fprintf('The relative error between inum1 and real-value is about: %d\n\n',...abs((inum1-integrate)/integrate))fprintf('The relative error between inum2 and real-value is about: %d\n\n',...abs((inum2-integrate)/integrate))fprintf('The relative error between inum3 and real-value is about: %d\n\n',...abs((inum3-integrate)/integrate))附录2:梯形法(fulu2.m)format longn=100;a=0;b=1;inum=0;syms x fxfx=1/(1+x^2);for i=1:nxj=a+(i-1)*(b-a)/n;xi=a+i*(b-a)/n;fxj=subs(fx,'x',xj);fxi=subs(fx,'x',xi);inum=inum+(fxj+fxi)*(b-a)/(2*n);endinumintegrate=int(fx,0,1)integrate=double(integrate)fprintf('The relative error between inum and real-value is about: %d\n\n',... abs((inum-integrate)/integrate))附录2sum:梯形法(fulu2sum.m),利⽤求和函数,避免for 循环format long n=100;a=0;b=1;syms x fxfx=1/(1+x^2);i=1:n;xj=a+(i-1)*(b-a)/n; %所有左点的数组xi=a+i*(b-a)/n; %所有右点的数组fxj=subs(fx,'x',xj); %所有左点值fxi=subs(fx,'x',xi); %所有右点值f=(fxi+fxj)/2*(b-a)/n; %梯形⾯积inum=sum(f) %加和梯形⾯积求解integrate=int(fx,0,1)integrate=double(integrate)fprintf('The relative error between inum and real-value is about: %d\n\n',... abs((inum-integrate)/integrate))附录3:抛物线法(fulu3.m)format longn=100;a=0;b=1;inum=0;syms x fxfx=1/(1+x^2);for i=1:nxj=a+(i-1)*(b-a)/n; %左点xi=a+i*(b-a)/n; %右点xk=(xi+xj)/2; %中点fxj=subs(fx,'x',xj);fxi=subs(fx,'x',xi);fxk=subs(fx,'x',xk);inum=inum+(fxj+4*fxk+fxi)*(b-a)/(6*n);endinumintegrate=int(fx,0,1)integrate=double(integrate)fprintf('The relative error between inum and real-value is about: %d\n\n',...。

C语言实现定积分求解方法

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语言实现定积分求解方法

C语言实现定积分求解方法

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;}。

python编程通过蒙特卡洛法计算定积分详解

python编程通过蒙特卡洛法计算定积分详解

python编程通过蒙特卡洛法计算定积分详解想当初,考研的时候要是知道有这么个好东西,计算定积分。

开玩笑,那时候计算定积分根本没有这么简单的。

但这确实给我打开了⼀种思路,⽤编程语⾔去解决更多更复杂的数学问题。

下⾯进⼊正题。

如上图所⽰,计算区间[a b]上f(x)的积分即求曲线与X轴围成红⾊区域的⾯积。

下⾯使⽤蒙特卡洛法计算区间[2 3]上的定积分:∫(x2+4*x*sin(x))dx# -*- coding: utf-8 -*-import numpy as npimport matplotlib.pyplot as pltdef f(x):return x**2 + 4*x*np.sin(x)def intf(x):return x**3/3.0+4.0*np.sin(x) - 4.0*x*np.cos(x)a = 2;b = 3;# use N drawsN= 10000X = np.random.uniform(low=a, high=b, size=N) # N values uniformly drawn from a to bY =f(X) # CALCULATE THE f(x)# 蒙特卡洛法计算定积分:⾯积=宽度*平均⾼度Imc= (b-a) * np.sum(Y)/ N;exactval=intf(b)-intf(a)print "Monte Carlo estimation=",Imc, "Exact number=", intf(b)-intf(a)# --How does the accuracy depends on the number of points(samples)? Lets try the same 1-D integral# The Monte Carlo methods yield approximate answers whose accuracy depends on the number of draws.Imc=np.zeros(1000)Na = np.linspace(0,1000,1000)exactval= intf(b)-intf(a)for N in np.arange(0,1000):X = np.random.uniform(low=a, high=b, size=N) # N values uniformly drawn from a to bY =f(X) # CALCULATE THE f(x)Imc[N]= (b-a) * np.sum(Y)/ N;plt.plot(Na[10:],np.sqrt((Imc[10:]-exactval)**2), alpha=0.7)plt.plot(Na[10:], 1/np.sqrt(Na[10:]), 'r')plt.xlabel("N")plt.ylabel("sqrt((Imc-ExactValue)$^2$)")plt.show()>>>Monte Carlo estimation= 11.8181144118 Exact number= 11.8113589251从上图可以看出,随着采样点数的增加,计算误差逐渐减⼩。

数值分析方法计算定积分

数值分析方法计算定积分

数值分析⽅法计算定积分⽤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 }测试结果:。

python求定积分程序

python求定积分程序

python求定积分程序Python是一种功能强大且易于使用的编程语言,它可以用于解决各种数学问题,包括求定积分。

本文将介绍如何使用Python编写一个求定积分的程序。

定积分是微积分中的一个重要概念,用于计算曲线下面的面积。

在数学上,定积分可以通过数值积分的方法进行近似计算。

而在Python中,我们可以利用数值积分的方法来编写一个求定积分的程序。

我们需要明确一下要求解的定积分函数。

假设我们要求解的函数是f(x),下限是a,上限是b。

我们可以使用Python中的数值积分库来实现定积分的计算。

在Python中,有许多数值积分库可供选择,例如SciPy库中的quad函数。

接下来,我们需要导入相应的库并定义我们要求解的函数。

在本例中,我们假设要求解的函数是f(x) = x^2。

```import scipy.integrate as spidef f(x):return x**2```然后,我们可以使用quad函数来计算定积分的值。

quad函数的第一个参数是要求解的函数,第二个参数是积分的下限,第三个参数是积分的上限。

```result, error = spi.quad(f, a, b)```我们可以将结果输出并进行相应的处理。

在本例中,我们可以将结果打印出来。

```print("The result of the definite integral is:", result)```至此,我们已经完成了一个简单的求定积分的程序。

完整的代码如下:```import scipy.integrate as spidef f(x):return x**2a = 0b = 1result, error = spi.quad(f, a, b)print("The result of the definite integral is:", result)```通过运行以上代码,我们可以得到函数f(x) = x^2在0到1之间的定积分的结果。

实验二:定积分的近似计算

实验二:定积分的近似计算

实验二:定积分的近似计算实验目标:1、 熟悉MATLAB 的程序设计方法;2、 熟悉MATLAB 下命令文件和函数文件的建立和使用;3、 学习定积分的三种近似计算方法:矩形法、梯形法、辛普生法;4、 理解数值计算的误差分析。

问题背景:求定积分的近似值的数值方法就是用被积函数的有限个抽样值的离散或加权平均近似值代替定积分的值。

求某函数的定积分时,在多数情况下,被积函数的原函数很难用初等函数表达出来, 因此能够借助牛顿-莱布尼兹公式计算定积分的机会是不多的。

另外,许多实际问题中的被积函数往往是列表函数或其他形式的非连续函数,对这类函数的定积分,也不能用不定积分方法求解。

由于以上原因,数值积分的理论与方法一直是计算数学研究的基本课题。

定积分的近似解的简单方法包括:矩形公式、梯形公式和辛普生公式。

根据定积分的定义,每个积分和都可以看做是定积分的近似值,即⎰∑=∆=ba ni i i x f dx x f 1)()(ζ在几何意义上,这是用一系列小块区域的面积近似小曲边梯形的面积。

当然,只有当积分区间被分割的很细时,计算结果才具有一定的精确度。

● 矩形法:设积分区间被等分为若干份,第i 份是由][1+i i x x 表示,则该小块区域面积为:)(*1i i i x f x x -+ 或)(*11++-i i i x f x x 或)(*211++-i i i x f x x● 梯形法:设积分区间被等分为若干份,第i 份是由][1+i i x x 表示,取)(i x f 和)(1+i x f 的加权平均值作为平均高度)(i f ζ,则该小块区域面积为:2)()(*11+++-i i i i x f x f x x ● 辛普生法:设积分区间被等分为若干份,第i 份是由][1+i i x x 表示,中点为21+i x ,取函数)(x f 在i x ,1+i x ,21+i x 这是三点的函数值的加权平均值作为平均高度的近似值,则该小块区域面积为:6)()(4)(*1211+++++-i i i i i x f x f x f x x实验内容:1、 试推导定积分的三种近似计算方法的迭代公式(矩形法、梯形法、辛普生法)。

定积分近似计算方法

定积分近似计算方法

定积分的近似计算方法摘要 本文主要讨论了一元函数常见的数值积分方法,例如插值型求积公式、龙贝格求积公式、高斯求积公式等近似计算方法,在用这些方法计算定积分时,会产生一些误差,为了减少误差, 可以利用复化求积公式、复化高斯公式等.本文围绕这些方法,系统介绍它们的计算公式以及截断误差,并用例题分析它们产生误差的大小、计算量等.关键词 插值型积分 龙贝格积分 高斯积分 误差分析 近似计算1引言在计算定积分的值()b aI f x dx =⎰时,常常根据微积分学基本定理求出)(x f 的一个原函数)(x F ,再用牛顿-莱布尼茨公式求的积分,()()()baI f x dx F b F a ==-⎰.但在实际应用中,这种方法只限于解决一小部分定积分的求值问题.当函数没有具体表达式,只是一些实验测得数据形成的表格或图形或者是()F x 无法用初等函数表示,例如,2bx ae dx ⎰,2sin ba x dx ⎰等等,这就需要我们用一些近似方法求的积分值.与数值积分一样,把积分区间细分,在每个小区间上,找到简单函数)(x ϕ来近似代替()f x ,且()bax dx ϕ⎰的值容易求的.这样就把计算复杂的()baf x dx ⎰转化为求简单的积分值()bax dx ϕ⎰.因此,定积分的近似计算实质上是就是被积函数的近似计算问题.2常见数值方法 2.1牛顿-科茨数值方法牛顿-科茨求积公式是求积节点等距离分布的插值型求积公式.利用插值多项式来构造数值积分公式是最常用、最基本的方法,具体做法是:给定区间[,]a b 上一组节点01...n a x x x b =<<<=,以及节点处函数()(0,1,2,i f x i n =,作()f x 的n 次拉格朗日多项式()()()nn i i i x f x l x ϕ==∑,其中 011011()()()()()()()()()i i n i i i i i i i n x x L x x x x L x x l x x x L x x x x L x x -+-+----=----,将插值公式(1)1()()()()(1)!n n n f f x x x n ξϕω++=++. 其中 1012()()()()()n n x xx x xx x L x x ω+=----,[,]a b ξ∈,依赖于变量x , 上式积分得(1)1()()()()(1)!n bb bn n aa af f x dx x dx x dx n ξϕω++=++⎰⎰⎰(1)(1)0()()()()(1)!n nb biiin aai f f x l x dx x dx n ξω++==++∑⎰⎰(1)(1)0()()()()(1)!n nb bi i n aai f f x b l x dx x dxn ξω++==++∑⎰⎰若记 (),(0,1,2,bi ia A l x dx i ==⎰….. )n (1)(1)1()[]()(1)!n bn af R f x dxn ξω++=+⎰, (2)则有()()[]nbi i ai f x dx A f x R f ==+∑⎰(3)称式(3)为插值求型公式,其中(0,1,2,i A i =…. )n 与()f x 无关,叫求积系数, i x 为求积节点,[]R f 为求积公式余项,其中求积系数由(1)决定.2.1.1梯形求积公式1梯形公式当插值节点01,x x 分别选取区间端点,a b 时,由式(3)分别求出求积系数10012bb aa x x xb b aA dx dx x x a b ---===--⎰⎰,01102bb aa x x x ab a A dx dx x x b a ---===--⎰⎰.从而的求积公式()[()()]2bab af x dx f a f b -≈+⎰. (4) 称求积公式(4)为梯形求积公式,简称梯形公式.2梯形公式截断误差: 3*()[](),12b a R f f ξ-''=- *[,]a b ξ∈. (5) 3梯形求积公式的代数精度:1 当()1f x =时,式(5)中 1(1)2bab adx b a x b a -=-=+=-⎰. 精确成立.2.1.2 辛普森求积公式1辛普森求积公式当选取节点为012,,2a bx a x x b +===时,由式(1)求下列求积系数 1200102()()()()2()()6()()2b b a a a b x x b x x x x b a A dx dx a b x x x x a a b +-----===+----⎰⎰,0211002()()()()2()()()3()()22bb aa x x x x x a xb b a A dx dx a b a b x x x x a b -----===++----⎰⎰.0122021()()()()2()()6()()22b b a a a bx a x x x x x b a A dx dx a b a b x x x x a b +-----===++----⎰⎰ .从而求积公式()[()4()()]62bab a a bf x dx f a f f b -+≈++⎰. (6)称式(6)为抛物线积分公式或辛普森积分公式.2抛物线求积公式误差估计定理1.若()f x 在[,]a b 上有四阶连续导数,则抛物线公式(6)的余项为:5(4)**()[](),[,]2880b a R f f a b ξξ--=∈. (7) 3抛物线公式的代数精度为3.易验证,当23()1,,,f x x x x =时,式(6)精确成立,而当4()f x x =时,式(6)不能精确成立.2.1.3 牛顿-科茨公式1牛顿-科茨公式在等距离节点i x a ih =+下,其中(0,1,2b ah i n-==…. )n .作为变量替换x a th =+,那么由求积公式(1),得系数:10(1)(1)(1)()!(1)(1)!ni n t t t i t i t n A h dt i n ---+---==--⎰10(1)(1)...(1)(1)...()(0,1,2,...)!(1)!n nb a t t t i t i t n dt i n n i n -----+---=-⎰ (8)则 ()()n i iA b a C =- (9)于是差值求积公式为:()0()()()[]nbn i i ai f x dx b a C f x R f ==-+∑⎰(10)称公式(10)为牛顿-科茨求积公式,其中()n iC 称为科茨系数.显然,科茨系数与被积函数()f x 及积分区间[,]a b 无关,它指依赖于n ,且为多项式积分.因此,只要给出n ,就能看出i A ,并写出相应地牛顿-科茨公式.2牛顿-科茨公式的截断误差与代数精度.当1n =与2n =情况分析牛顿-科茨公式的截断误差为(1)()[]()()()(1)!n b b bn aaaf R f f x dx x dx x dxn ξϕω+=-=+⎰⎰⎰牛顿-科茨公式的截断误差还可以写成(2)*1()[]()((2)!n bn a f R f x dx n n ξω++=+⎰为偶数)(1)*1()[]()(1)!n bn af R f x dx n ξω++=+⎰ (n 为奇数) (11) 其中*[,]a b ξ∈,且不依赖于x ,101()()()...()n n x x x x x x x ω+=---,对()f x 为任何并不超过n 次多项式,均有(1)()0n fx +≡,因而[]0R f ≡,即0()()nbi i ai f x dx A f x ==∑⎰精确成立,也就是说,牛顿-科茨公式的代数精度至少为n ,牛顿-科茨公式在n 为偶数时,至少具有1n +次代数精度,在n 为奇数情况时,至少具有n 次代数精度.2.1.4复化梯形求积公式将区间[,]a b 等分,节点为i x a ih =+ (步长b ah n-=),0,1,2...,i n =)在每个小区间1[,]i i x x -上采用梯形公式(4)得11111()()[(()()]2ii nnbx i i i i ax i i x x f x dx f x dx f x f x ---==-=≈+=∑∑⎰⎰11[()()]2ni i i hf x f x +=+=∑11[()2()()]2n i n i hf a f x f b T -=++=∑ (12)称式(12)为复化梯形公式. 复化梯形公式余项为()2()()()12i n b a R f h f η-''=-(13) 2.1.5复化辛普森求积公式在每个小区间],[1+i i x x 上,辛普森公式(6)得11102()[()4()()]6n bi i ai i hf x dx f x f x f x -++==++∑⎰(14)111012[()4()2((6)]6n n i i i i hf a f x f x f --+===+++∑∑记 )]()(2)(4)([6111021b f x f x f a f hS n i i n i i n +++=∑∑-=-=+ (15)式中,21+i x为],[1+i i x x 的中点,即h x x i i 2121+=+.式(15)称为复化辛普森公式,其余项为∑-=-=-=10)4(4)()2(180)()(n i i n n f h h S f I f R η, 1(,).i i i x x η+∈ 故 ),(),()2(180)(R )4(4b a f h a b f n ∈--=ηη (16) 为复化辛普森的截断误差. 2.1.6复化科茨求积公式将区间[,]a b n 等分, 4n m =,m 为正整数,在每个子区间444[,]k k x x -上用科茨求积公式得到复化求积公式:412()[7()7()32()45mbk ak hf x dx f a f b f x -≈++∑⎰14241411112()32()14()mmm k k k N k k k f xf x f x C ---===+++=∑∑∑ (17)其中 4b a b ah n m--==, k x a kh =+ 其截断误差为6(6)2()[,](),()945n b a R f C h f a b ηη-=-<. 2.1.7 变步长复化求积方法复化求积公式虽然计算简单,也达到了提高精度的目的,但为了满足精度要求必须顾及误差,利用误差公式往往很困难,因为误差表达式中含有未知函数的导数,而估计各阶导数的最大值不太容易.我们可以采取把积分的区间[,]a b 细分的办法,在计算积分时将步长逐步折半,利用前后两次结果进行误差估计,如此继续,直到相邻两次结果相差不大,取最小的步长算出的结果为积分值,这种方法称为变步长积分法.以复化梯形公式为例,把区间[,]a b 分成n 等分,设复化梯形公式的近似值为n T ,原积分值为I ,由复化梯形公式误差公式(14)知:2"11()()()n b a b a I T f a b N N ηη--=-<<再把区间[,]a b 分成2n 等分,得近似值2n T ,则2222()()()122k b a b a I T f a b nηη--''=-<< 假定()f x ''在[,]a b 上变化不大,既有12()()f f ηη''''≈. 由上式得 .24kkI T I T -≈-于是 222211()()341n n n n n n I T T T T T T ≈+-=+-- (18) 式(18)表明若用2n T 作为I 的近似值,其截断误差约为2()3n n T T - (19)2.2 龙贝格求积公式龙贝格积分法的基本思想是采用复化梯形求积方法不断折半步长过程中,在积分结果中加入时候误差估计值进行补偿,使积分计算的收敛性加速,就可以加工出,,,...n n n S C R 精度较高的积分结果.由式(19), 2n T 的误差大致为23n nT T -,因此,可用这个误差值作为2n T 的一种补偿,加到2n T 上,则可得到积分准确值I ,比2n T 的更好近似值~T .222141()333n n n n nT T T T T T =+-=-2221(2)21n n T T =-- (20)式(20)左端1n =时 记122121141()333S T T T T T =+-=- 112()()332a b T b a f +=+- [()4()()]62b a a b f a f f b -+=++恰好为[,]a b 上应用辛普生公式(16)的结果.在每个小区间应用辛普生公式:11[()2()()]2n n k k hT f a f x f b -==++∑121()112[()2()()2()]4n n n k k k k hT f a f x f b f x --===+++∑∑代入式(20)的左端得11111[()2()()2()32n nk k k k h f a f x f b f x -==+++--∑∑ 11[()2()()]2n k k h f a f x f b -++∑11111[()4()2()()]62n n k k k k f a f x f x f b -===+-++∑∑nS =从而复化辛普森公式与复化梯形公式公式有以下关系式2441n nn T T S -=- (21)类似也可以推证,在辛普森序列基础上,利用以下关系式22242161151541n n n n n S S C S S -=-=- (22)可以造出收敛速度更快的科茨序列12,...,...n C C C 将此推行下去,在科茨序列基础上,通过243431n nn C C R -=- (23)构造出收敛速度比科茨序列更快的龙贝格序列12,,......n R R R .以上这种通过逐步构造龙贝格序列的积分近似值法就称为龙贝格积分法.2.3高斯求积公式由定理()()()baf x F b F a =-⎰知,插值型求积公式的代数精度与求积节点的个数有关,具有1n +个节点的插值型求积公式至少具有n 次代数精度.不仅如此,代数精度与节点的选取有关,在构造牛顿-科茨求积公式时,为了简化处理过程,限定用等分节点作为求积节点,这样做,虽然公式确实得到简化,但同时也限制了公式的代数精度. 设积分,1,1=-=b a 本段讨论如下求积公式11()()ni i i f x A f x -==∑⎰(24)对任意积分区间[,]a b ,通过变 22ba t ab x ++-= 可以转换到区间]1,1[-上,这时11()()222bab a b a a bf x dx f t dt ---+=+⎰⎰ 此时,求积公式写为0()()222n bii ai b a a b b af x dx A f t =-+-=+∑⎰若一组节点]1,1[.....,10-∈n x x x 使插值型求积公式(24)具有21n +次代数精度,则称此组节点为高斯点,并称相应求积公式(24)为高斯求积公式.2.3.1 高斯求积公式的余项(2)2()[]()()()(22)!n nbb k k aa k f R f f x dx A f x x dx n ηω+==-=+∑⎰⎰ 其中 01()()()...(),[,]n x x x x x x x ab ωη=---∈,且不依赖于x .2.3.2 复化高斯求积公式复化高斯求积公式的基本思想是:将积分区间[,]a b 分成n个等长小区间1[,](1,...)i i t t i m -=,然后在低阶(2n =)高斯求积公式算出近似值,最后将他们相加的积分()baf t dt ⎰的近似值m G ,即11111111()()[]222ii mmbt i i i i i i at i i t t t t t t f t dt f t dt dt -----==-+-==+∑∑⎰⎰⎰1111[()]222m i h ha i h x dx-==+-+∑⎰101[()]222m n j j mi j h hA f a i h x G ==≈+-+≈∑∑ (25)其中mab h -=,j A 与(0,1,2,...,)j t j n =可由书中表中查出. 3 应用3.1插值型积分的应用例1 用牛顿-科茨公式(1,2,4n =)计算积分12211I x =+⎰. 解 1n =时2210112[]0.4512101()2I -≈+=++2n =时22211112[4]0.463725116101()1()42I -≈++=+++4n =时2222111112[7321232]0.46363311390101()1()1()848I =++++≈++++例2 利用复化梯形求积公式计算积分 12211I dx x =+⎰解 设211)(xx f +=,分点个数为n =1,2,4,5时,求出相应积分n T , 111[(()())],21,2(),.n n i i i i i T f a f b f h b a h n n f x f x a ih ih -=⎧=++⎪⎪-⎪==⎨⎪=⎪⎪=+=⎩∑列表如下:n =1的计算结果见表1-1所列 n h0x 1x 0f1f1T10.50.00.51.0 0.8 0.45n =2的表格如下 n hx1x2xf1f2f2T20.250.00 0.25 0.50 1.00 0.941765 0.80 0.460294n =4时计算结果如下表 n h 0x1x2x3x4x40.1250.00 0.125 0.25 0.375 0.50f1f2f3f4f4T1.00 0.9846154 0.9411765 0.876712 0.80 0.462813n = 5时计算结果如下 n hx1x2x3x4x5x50.10.0 0.1 0.2 0.3 0.40.5f1f2f3f4f5f5T1.0 0.990099 0.9615385 0.91743 0.862069 0.80.463114例3 利用复化求积公式120x e dx ⎰,问积分区间为多少等分才能得证有5位有效数字?解 由式(14)知322()[],()()1212n b a b a R f h f n f n n--''''=-=- 有1(),(),2x x f x e f x e b a ''==-=,当]21,0[∈x 时,在12|()|f x e ''≤,所以122|[]|96n eR f n≤ 由于120x e dx ⎰的准确值具有一位整数,所以要使近似值具有5位有效数字,n 必须满足4242211048,102196⨯≥⨯≤-e n n e 或 取对数有 19=n .即将区间]21,0[19等分可满足给定的精度要求.例4 利用复化抛物线求积公式计算 120211I dx x =+⎰. 解 设11)(2+=x x f ,取m =1,2, 3时,公式()⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎨⎧++=+=====-=+++=+---=-=+∑∑.)12(,2),(),(),(,,242[31221212221111,1222h i a x ih a x x f f x f f b f f a f f m a b n f f f f h S i i i i i i b a m i m i i b a m当m =1,2,3时结果如下表所示 当m =1时m h(0.0)f )25.0(f )5.0(f2S1 0.25 1.0 0.9411765 0.80 0.463725当m =2时mh(0.0)f(0.125)f (0.025)f (0.35)f )5.0(f4S20.125 1.0 0.9846154 0.9411765 0.8767123 0.80 0.463653当m =3时mh(0.0)f(0.08333)f (0.16667)f (0.35)f(0.33333)f (0.14166667)f )5.0(f4S30.83331.00.99310340.9729730.9411760.90.852070.80.4636例5 用复化梯形公式,辛普森公式和科茨公式计算积分10sin xdx x ⎰的近似值.解按精度要求确定]1,0[分多少等分,即确定步长,要使6441021)1(28801|],[|-⨯≤≤M m S f R n ,只需.4642880102M m ⨯≥令10sin ()cos xf x txdt x==⎰,则1()0sin ()()(cos )k kk k k d xd fx tx dt dx x dx==⎰ 1cos().2k t tx kdt π=+⎰dt ktx t x f k k |)2cos(|max )(|max 10)(π+≤⎰11.1k t d t t≤=+⎰)10(≤≤x (4)1max |()| 5.f x ≤所以只要,9.13831288010264=⨯⨯≥-m 取m =4即可, 当4n =时,在每个子区间上用式(25),或(14),或(17),结果.9460829.0,9460833.0,9456911.0888===C S T3.2 龙贝格积分公式应用例6 用龙贝格算法计算积分1241I dx x=+⎰的近似值,要求误差小于510-. 解 .3,0,14)(2==+=b a x x f 步骤如下:2)1(,4)0()1(==f f 得.3)]1()0([211=+=f f T )2(计算,1.3)]21([21,516)21(12=+==f T T f 由此得301333334121=-=T T S . (3)算出),(43),41(f f 从而,3013118)]43()41([412124=++=f f T T,14157.334242=-=T T S .30142121516121=-=S S C(4)计算),87(),85(),83(),81(f f f f 从而得到:13899.3)]87()85()83()81([812148=++++=f f f f T T ,,14159.334482=-=T T S ,14059.31516242=-=S S C.1458.36364121=-=C C R (5)再计算),1615(),1613(),1611(),169(),167(),165(),163(),161(f f f f f f f f 从而得到: 14094.316=T30141598=S ,,14159.3,14159.324==R C 51210||-≤-R R , 所以12043.14159.1dx x ≈+⎰3.3高斯求积公式的应用例7 用两点复化高斯求积公式计算10,x I e dx =⎰要求允许误差.106-=ε解 在本算法中取21=+n 时,,110==A A 其中;,)(mab h e x f x-== =++--=∑=)22(2201j jj b a x a b f A a b G.87189637800.1][21)32121()32121(=++-eem =2时, h =21, ]4121)21([4120202j i j j x i f A G +⨯-=∑∑==.57182571650.1)(41341333413341333413=+++=++--eeee m =3时, h =31. .37182769352.1]631)21([6130203=+⨯-=∑∑==j i j j x i f A G.101027.71||||56323--<⨯≈+-G G G3.4 几种方法的比较分析例8 计算积分211ln 2dx x =⎰,精确到0.001.(1)利用矩形公式计算, 因为对于x x f 1)(=,有320()2f x x''<=<(如果1<x <2),所以按照公式0)2(S =+-dx ba xb a . 0<n R <2112n . 如果取n =10,则我们公式的余项的余数得31010.84101200R -<<⨯,我们还必须加进由于在计算函数值实行四舍五入所产生的误差的界限相差于0.16⨯310-,为了这个目的只要计算1x的值到四位小数精确到0.00005就够了.我们有1232527292132152172192 1.051.151.251.351.551.651.751.851.95x x x x x x x x x =========5128.05405.05714.06061.06897.07407.08.08696.09524.02192172152132927252321=========y y y y y y y y y和6.928469284.0109284.6= (2) 按照梯形公式作同样的计算,在这种情况下,作公式 210,||6n n R R n<<在这儿也试一试取n =10,虽然此时仅可以证3107.16001||-⨯<<n R ,纵坐标是9.18.17.16.15.14.13.12.11.1987654321=========x x x x x x x x x 5263.05556.05882.06250.06667.07143.07692.08333.09091.0987654321=========y y y y y y y y y和1877.669377.01877.621500101=+)( (3) 用辛普森公式做同样的计算作公式 .0))(()2(180)()4(45<≤≤⨯--=n n R b a f n a b R ξξ 并且n =5时有55104.1||-⨯<R .实行计算到五位数字,精确到0.0000058.16.14.12.14321====x x x x 45636.555556.062500.071429.083333.04321和====y y y y 9.17.15.13.11.12927252321=====x x x x x83820.1352632.058824.066667.076923.090909.029********和=====y y y y y.20.150==x x 50000.150000.060000.150和==y y6931525.083820.345636.550000.1301=++)(. 由此可见,用辛普森公式计算得到的值误差最小,计算量相对一般;而用矩形公式计算得到的值误差较大,计算量也比较大;用梯形公式计算的值误差比用矩形公式得到的值要误差小,计算量也是如此.所以我们计算定积分时用辛普森公式往往得到的值误差小,而对没有要求误差大小的,则可以选择辛普森或者是梯形公式,因为这两种方法计算量相对较小.结 束 语本文只讨论了一些一维数值积分方法及其它们的应用,误差分析等有关内容.其中最常用的方法是插值型积分以及复化方法、龙贝格积分方法和高斯积分方法,并讨论了相关求积方法的代数精度和误差分析,并给出了一些例题,分析各种方法的近似值,得出误差分析最小的近似方法.由于篇幅有限,对于高维数值积分方法本文便不再讨论.参考文献[1] 华东师范大学数学系,数学分析(第一版)[M],北京:高等教育出版社,2001. [2] 李庆阳,关治,白峰杉,数值计算原理(第二版)[M],北京: 清华大学出版社, 2008. [3] 肖筱南,现代数值计算方法(第一版)[M],北京: 北京大学出版社, 1999.[4] 菲赫金格尔茨,微积分学教程(第三版)[M],北京: 高等教育出版社, 2005. [5] 裴礼文,数学分析中的典型问题与方法(第一版)[M] ,北京: 北京大学出版社,2004. [6] 李桂成,计算方法(第三版)[M],北京: 高等教育出版社,2010.[7] Yin Y uezhu ,Yang Zhonglian.Calculating Skillfully the Curve Integral and Surface Integral Type 2 bySymmetry, SCIENCE & TECHNOLOGY INFORMATION ,2008(30)The Approximate Numerical Method of the Definite IntegralAbstract This paper mainly discusses common numerical methods of unary function, such as approximate calculation method of interpolation integral, Lebesgue integral and Gauss integration. With these methods in calculating the integral, it will produce some error. In order to reduce the error, we can use after the formula for product and after the Gauss formula. This paper focus on these methods introducing formula of introduction and truncation errors .In addition they can provide examples to analysis size of the error and computation.Keywords interpolation integral Lebesgue integral Gauss integral error analysis approximate computation。

C语言求定积分的通用函数

C语言求定积分的通用函数
C 语言求定积分的通用函数
对于一重定积分来说其求解可以使用梯形法进行求解,计算公式如下所示:
其中,f(x)为被积函数,为横坐标的两点间的间隔,越小,则计算出的结果 越精确。对于求解此类问题可以使用 C 语言中的回调函数编写通用的计算函数, 代码如下:
#include <stdio.h> #include <stdlib.h> #include<math.h>
//功能:返回 f(x)在积分区间[a,b]的值
//参数:FunCallBack 指向用于计算 f(x)的函数
//
a 积分区间的起始值
//
b 积分区间的结束值
//
dx 横坐标的间隔数,越小计算结果越准确
Байду номын сангаас
double Calculate(double (*FunCallBack)(double x), double a,double b,double dx)
return x*x; }
double f(double x) {
return x; }
double f3(double x) {
return x*x*x ; }
int main() {
double total; total = (Calculate(f, 2, 3, 0.000001)); printf("total = %lf\n", total);
其中,函数 f,f2,f3 为自行编写的关于 x 的被积函数。
运行结果:
total = 2.500000 total = 6.333331 total = 16.249991
total = (Calculate(f2, 2, 3, 0.000001)); printf("total = %lf\n", total);

C语言__用六种方法求定积分

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语言中的循环、条件语句和函数来实现。

具体实现的步骤包括:将积分区间分割成若干小区间,计算每个小区间上的函数值,然后将这些函数值进行加权求和,最后乘以相应的权重或宽度,得到定积分的近似值。

综合实验一 定积分的近似计算

综合实验一 定积分的近似计算

a
f ( x )dx ≈ ∑ f ( xi )xi = h ∑ f ( xi )
i =1 i =1
n
中点法:
b
a
f ( x )dx ≈ ∑
i =1
n
n xi 1 + xi xi 1 + xi f( )xi = h ∑ f ( ) 2 2 i =1
矩形法举例
数学实验
例:用不同的矩形法计算下面的定积分 ( 取 n=100 ), 并比较这三种方法的相对误差.
解: a=0, b=1, n=100 ==> h =1/100=0.01, xi = i*h,
dx ≈ h f ( x ) = h 1 左点法:∫0 ∑ i1 ∑ 1 + x 2i1 1 + x2 i =1 i =1
1
1 n
dx ∫0 1 + x 2
1
n
n
(i = 0,1,2,...,100)
dx ≈ h ∑ f ( xi ) ≈ 0.78289399673078 右点法: ∫0 2 1+ x i =1
二重积分的计算
抛物线法计算二重积分: dblquad
数学实验
dblquad(f,a,b,c,d,tol)
∫∫
a
b
ห้องสมุดไป่ตู้
d
c
f ( x, y )dxdy
tol 为计算精度,若不指定,则缺省精度为 10-6 f(x,y) 可以由 inline 定义,或通过一个函数句柄传递 [a,b] 是第一积分变量的积分区间,[c,d] 是第二积分变量 的积分区间 按字母顺序,大写字母排在小写字母的前面
实验二, 实验二,定积分的近似计算
矩形法

C语言实现求定积分的方法

C语言实现求定积分的方法

C语⾔实现求定积分的⽅法本⽂实例讲述了C语⾔实现求定积分的⽅法。

分享给⼤家供⼤家参考。

具体实现⽅法如下:复制代码代码如下:#include <cmath>#include <cstdio>#define ACC 1000float solve(float (*p)(float),float up,float down,int acc);float fun_exp(float x);float fun_qua(float x);void main(){char selection;float up,down;while(printf("请选择被积函数:\n"),printf("1、exp(x) 2、x+1 \n"),scanf("%c",&selection),selection != '#'){ printf("请输⼊积分上下限: ");scanf("%f,%f",&up,&down);switch(selection){case '1':printf("结果是: %4.4f\n",solve(fun_exp,up,down,ACC));break;case '2':printf("结果是: %4.4f\n",solve(fun_qua,up,down,ACC));break;}}}float solve(float (*p)(float),float up,float down,int acc){float sum,base,area;area = 0;sum = 0;base = (up-down)/acc;for(int i=0; iarea = base*((*p)(down+i*base));sum+=area;}return sum;}float fun_exp(float x){return exp(x);}float fun_qua(float x){ //⼀元⼆次⽅程 quadraticsreturn x+1;}希望本⽂所述对⼤家的C语⾔程序设计有所帮助。

matlab梯形法求定积分

matlab梯形法求定积分

matlab梯形法求定积分Matlab是一种强大的数学计算软件,广泛应用于各个领域的科学研究和工程计算中。

其中,梯形法是一种常用的数值积分方法,用于近似计算定积分的值。

梯形法的基本思想是将被积函数在积分区间上的图像划分为若干个小梯形,然后计算这些梯形的面积之和。

通过增加小梯形的数量,可以提高计算结果的精度。

具体而言,梯形法的步骤如下:1. 将积分区间[a, b]均匀划分为n个子区间,其中n为任意正整数。

每个子区间的长度为h=(b-a)/n。

2. 在每个子区间上,选取两个端点对应的函数值,即f(a), f(b),作为梯形的两个底边。

3. 计算每个子区间上的梯形面积,即S=(f(a)+f(b))*h/2。

4. 将所有子区间上的梯形面积相加,得到整个积分区间上的近似积分值。

在Matlab中,可以通过编写函数来实现梯形法的计算。

下面是一个简单的示例代码:```matlabfunction result = trapezoidal(f, a, b, n)h = (b - a) / n;x = a:h:b;y = f(x);result = (sum(y) - (y(1) + y(end)) / 2) * h;end```在这个示例代码中,`f`表示被积函数,`a`和`b`表示积分区间的上下限,`n`表示子区间的数量。

函数首先计算出每个子区间的长度`h`,然后生成一个等差数列`x`,用于表示各个子区间的起始点。

接下来,通过调用被积函数`f`,计算出每个子区间上的函数值`y`。

最后,根据梯形法的公式,将所有子区间上的梯形面积相加,并乘以子区间长度`h`,得到近似积分值。

使用这个函数,我们可以计算任意函数在给定积分区间上的定积分。

例如,我们可以计算函数f(x) = x^2在区间[0, 1]上的定积分,代码如下:```matlabf = @(x) x.^2;a = 0;b = 1;n = 1000;result = trapezoidal(f, a, b, n);disp(result);```运行这段代码,我们可以得到近似积分值为1/3。

矩形法求定积分c语言

矩形法求定积分c语言

矩形法求定积分c语言矩形法是一种求定积分的数值计算方法,可以用C语言来实现。

具体实现步骤如下:1. 定义被积函数,计算被积分区间的起点和终点。

```double f(double x) {return x*x; // 假设被积函数为 y=x^2}double a = 0; // 积分区间起点double b = 1; // 积分区间终点```2. 定义矩形法的参数:分割数和矩形宽度。

```int n = 100; // 分割数double h = (b-a)/n; // 矩形宽度```3. 计算定积分,即对被积函数在积分区间上进行矩形面积的累加。

```double sum = 0;for (int i=0; i<n; i++) {double x = a + i*h; // 计算矩形左边界sum += f(x)*h; // 累加矩形面积}printf("定积分的近似值为:%.6f", sum);```完整代码如下:```#include <stdio.h>double f(double x) {return x*x; // 假设被积函数为 y=x^2}int main() {double a = 0; // 积分区间起点double b = 1; // 积分区间终点int n = 100; // 分割数double h = (b-a)/n; // 矩形宽度double sum = 0;for (int i=0; i<n; i++) {double x = a + i*h; // 计算矩形左边界sum += f(x)*h; // 累加矩形面积}printf("定积分的近似值为:%.6f", sum);return 0;}```。

定积分计算实验报告(3篇)

定积分计算实验报告(3篇)

第1篇一、实验目的1. 理解定积分的概念,掌握定积分的计算方法。

2. 熟悉数值积分的方法,提高数值计算能力。

3. 通过实验,验证定积分的计算结果,加深对定积分理论的理解。

二、实验原理定积分是数学分析中的一个基本概念,它表示函数在某一区间上的累积效果。

对于给定的函数f(x),在区间[a, b]上的定积分可以表示为:∫[a, b] f(x) dx其中,dx表示无穷小的区间宽度。

在实际计算中,定积分往往采用数值积分的方法进行近似计算。

三、实验仪器与软件1. 仪器:计算机2. 软件:MATLAB四、实验步骤1. 输入函数表达式:在MATLAB中输入待积分函数的表达式,例如f(x) = x^2。

2. 设置积分区间:设定积分的上下限a和b。

3. 选择数值积分方法:MATLAB提供了多种数值积分方法,如梯形法、辛普森法、高斯法等。

根据需要选择合适的方法。

4. 进行数值积分计算:调用MATLAB的数值积分函数,如quad函数,进行积分计算。

5. 结果分析:观察计算结果,与理论值进行对比,分析误差来源。

五、实验数据及结果1. 函数表达式:f(x) = x^22. 积分区间:[0, 1]3. 数值积分方法:辛普森法4. 计算结果:I ≈ 1.1666666667六、误差分析1. 理论值:∫[0, 1] x^2 dx = [x^3/3] |[0, 1] = 1/32. 误差来源:a. 数值积分方法的误差:由于数值积分方法是一种近似计算方法,其计算结果与真实值存在一定的误差。

b. 计算过程中的舍入误差:在计算过程中,由于计算机的浮点数表示,可能导致舍入误差。

3. 误差分析:计算结果与理论值相差较大,说明数值积分方法的误差较大。

在实际应用中,可以根据需要选择合适的数值积分方法,以减小误差。

七、实验结论1. 通过本次实验,掌握了定积分的计算方法,了解了数值积分的方法及其优缺点。

2. 了解了数值积分方法在计算过程中的误差来源,为实际应用提供了参考。

编程MATLAB程序实现复化梯形和辛普森数值积分

编程MATLAB程序实现复化梯形和辛普森数值积分

编程MATLAB程序实现复化梯形和辛普森数值积分MATLAB是一种高级编程语言和计算环境,适用于各种科学和工程应用。

在MATLAB中,可以使用数值积分的方法来近似计算函数的定积分。

本文将介绍如何使用MATLAB编程实现复化梯形和辛普森数值积分。

首先,我们来介绍复化梯形法。

复化梯形法是一种基本的积分数值方法,它将定积分区间等分为若干个小的子区间,然后在每个子区间上应用梯形公式进行近似计算。

下面是复化梯形法的MATLAB代码:``` matlabh=(b-a)/N;x=a:h:b;y=f(x);I = h * (sum(y) - (y(1) + y(end)) / 2);end```在上述代码中,`f`是积分的函数,`a`和`b`是积分的上下限,`N`是子区间的数量。

首先,我们计算出每个子区间的步长`h`,然后生成一个数组`x`,其中包含了每个子区间的起始点和终止点。

接下来,根据积分函数`f`计算出在每个子区间上的函数值,并将这些函数值存储在数组`y`中。

最后,使用梯形公式计算出近似积分结果`I`。

下面是使用复化梯形法进行数值积分的示例:``` matlaba=0;b = pi;N=100;disp(I);```接下来,我们来介绍辛普森法。

辛普森法是一种更精确的数值积分方法,它将定积分区间等分为若干个小的子区间,然后在每个子区间上应用辛普森公式进行近似计算。

下面是辛普森法的MATLAB代码:``` matlabh=(b-a)/(2*N);x=a:h:b;y=f(x);I = h / 3 * (y(1) + y(end) + 4 * sum(y(2:2:end-1)) + 2 * sum(y(3:2:end-2)));end```在上述代码中,`f`是积分的函数,`a`和`b`是积分的上下限,`N`是子区间的数量。

首先,我们计算出每个子区间的步长`h`,然后生成一个数组`x`,其中包含了每个子区间的起始点和终止点。

python求定积分程序

python求定积分程序

python求定积分程序Python是一种功能强大的编程语言,它不仅可以用于编写各种应用程序,还可以用于数学计算。

在数学中,定积分是一个重要的概念,它可以用来计算曲线与坐标轴之间的面积。

本文将介绍如何使用Python编写一个求定积分的程序。

定积分是微积分中的一个重要概念,它可以用来计算曲线与坐标轴之间的面积。

在数学上,定积分可以表示为∫f(x)dx,其中f(x)是要求积分的函数,dx表示积分的变量。

定积分可以分为不定积分和定积分,其中不定积分表示函数的原函数,而定积分则表示函数在某个区间上的面积。

要求定积分的程序,首先需要确定要求积分的函数f(x)和积分的区间[a, b]。

然后,可以使用Python中的数值积分方法来计算定积分的近似值。

常用的数值积分方法有矩形法、梯形法和辛普森法。

这些方法将积分区间分成若干小区间,然后分别计算每个小区间上的面积,最后将这些面积相加得到定积分的近似值。

下面我们以求函数f(x)=x^2在区间[0, 1]上的定积分为例来介绍如何使用Python编写一个求定积分的程序。

首先,我们可以使用Python中的数值积分函数来计算定积分的近似值。

在Python中,可以使用SciPy库中的quad函数来计算定积分的近似值。

```pythonfrom scipy import integratedef f(x):return x**2result, error = integrate.quad(f, 0, 1)print("定积分的近似值为:", result)```在上面的代码中,我们首先定义了要求积分的函数f(x),然后使用integrate.quad函数来计算函数f(x)在区间[0, 1]上的定积分的近似值。

最后,我们使用print函数将定积分的近似值输出到屏幕上。

运行上面的代码,我们可以得到函数f(x)=x^2在区间[0, 1]上的定积分的近似值为0.33333333333333337。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档