复化梯形法 复化矩形法 变步长梯形 变步长辛普森
复化梯形公式,复化辛普森公式,复化柯特斯公式
复化梯形公式,复化辛普森公式,复化柯特斯公式
复化梯形公式、复化辛普森公式和复化柯特斯公式都是用来计算定积分的近似值的方法。
1. 复化梯形公式:将积分区间分成若干个小区间,在每个小区间上用梯形面积近似代替该小区间的曲边梯形面积,然后将这些梯形面积相加,得到积分的近似值。
2. 复化辛普森公式:将积分区间分成若干个等分小区间,在每个小区间上用矩形面积近似代替该小区间的曲边梯形面积,然后将这些矩形面积相加,得到积分的近似值。
3. 复化柯特斯公式:将积分区间分成若干个等分小区间,在每个小区间上用切线段长度近似代替该小区间的曲边梯形面积,然后将这些切线段长度相加,得到积分的近似值。
这三种方法都是通过将积分区间分成若干个小区间,然后在每个小区间上用近似方法计算该小区间的曲边梯形面积,最后将这些近似值相加得到积分的近似值。
它们的精度和误差都与分区间的大小有关。
复化梯形公式和复化辛普生公式
}
void simpson::integration()//实现积分
{
cout<<"输入上限和下限";
cin>>b>>a;
cout<<"输入你要使用simposn法则的数目(即等分数)";
cin>>n;
h=(b-a)/n;
sum_even_terms=0.0;
sum_odd_terms=0.0;
for(k=1;k<n;k++)
{
sum_even_terms+=sine(k*h);
}
for(k=0;k<n;k++)
{
sum_odd_terms+=sine((2*k+1)*h/2);
}
integral=(2.0*sum_even_terms+4.0*sum_odd_terms+sine(b)+1)*h/6.0;
《数值分析》实验报告
姓名
学号
日期
2012.11.20
实验室
设备编号
实验题目
用复化梯形公式和复化辛普生公式求I=∫01sinx/xdx
一实验目的
1.了解复化梯形公式和复化辛普生公式。
2.用复化梯形公式和复化辛普生公式求I=∫01sinx/xdx。
二实验内容
算法:复化梯形公式是Tn=∑h/2[f(xi)+ f(xi+1)]=(b-a)/2n[f(a)+2∑f(xi)+f(b)]记子段[xi,xi+1]的中点为xi+1/2,则复化Simpson公式为Sn=∑h/6[f(xi)+4f(xi+1/2)+ f(xi+1)]=b-a/6n[f(a)+4∑f(xi+1/2)+2f(xi)+f(b)]
复化梯形公式、复化辛卜生公式
复化梯形公式、复化辛卜生公式
一、复化梯形公式及其余项
在区间不大时,用梯形公式、辛卜生公式计算定积分是简单实用的,但当区间较大时, 用梯形公式、辛卜生公式计算定积分达不到精确度要求. 为了提高计算的精确度,我们将 [a,b] 区间n等分,在每个小区间上应用梯形公式、辛卜生公式计算定积分, 然后将其结果相加,这样就得到了复化梯形公式和复化辛卜生公式。
1. 复化梯形公式
将积分区间等分,设, 则节点为
对每个小区间上应用梯形公式, 然后将其结果相加,则得
(3.14)
称(3.14)式为复化梯形公式.
当在[a,b]上有连续的二阶导数时,则复化梯形公式(3.14)的余项推导如下:
因为
所以在区间[a,b]上公式(3.14)的误差为
又因为在区间[a,b]上连续,由连续函数的性质知,在区间[a,b]上存在一点,
于是
(3.15)
称(3.15)式为复化梯形公式的余项。
例1用复化梯形公式计算得
使误差小于
解和公式(3.15), 解不等式
得
即时,用复化梯形公式计算可达到精度要求,则取,用公式(3.14)计算得
而积分的准确值。
复化梯形公式,辛普森公式的matlab程序
复化梯形公式与辛普森公式的matlab程序【程序代码】cclc;disp('1.复化梯形公式求解');disp('2.simpson公式求解');disp('请进行选择:');c=input(' ');if c==1clc;disp('复化梯形公式');disp('请输入积分下限 ');a=input('a=');disp('请输入积分上限 ');b=input('b=');disp('请输入等分的数目 ');n=input('n=');h=(b-a)/n;s1=0;for i=1:n-1s1=s1+fun1(i*h);enddisp('复化梯形公式的结果:');T=h/2*(fun1(a)+2*s1+fun1(b))else if c==2clc;disp('simpson公式');disp('请输入积分下限 ');a=input('a=');disp('请输入积分上限 ');b=input('b=');disp('请输入等分的数目 ');n=input('n=');h=(b-a)/n;s2=0;for i=0:n-1s2=s2+fun1((i+0.5)*h);enddisp('辛普森公式的结果: ');S=h/6*(fun1(a)+4*s2+2*s1+fun1(b))endenddisp('菜单选项');disp('1.继续运算');disp('2.退出程序!');p=input(' ');if p==1(fuhua);else if p==2disp('正在退出,请稍候。
梯形法则和辛普森法则
梯形法则与辛普森法则1. 概述梯形法则和辛普森法则是数值积分中常用的近似方法。
它们通过将曲线或曲面分割成若干个由直线或弧线组成的小区间,并在每个小区间内估计函数值来求解定积分。
这两种方法具有较高的精度和广泛的应用领域,本文将详细介绍这两种方法的原理、应用和优缺点。
2. 梯形法则梯形法则是一种利用梯形来近似曲线下面积的方法。
假设我们要计算函数f(x)在区间[a, b]上的定积分,梯形法则将该区间分成n个小区间,每个小区间的宽度为Δx=(b-a)/n。
然后,我们可以将每个小区间内的函数值连接起来,形成若干个梯形,计算每个梯形的面积,并将它们相加,即可得到函数在整个区间上的近似积分值。
梯形法则的近似积分公式如下:∫[a, b] f(x) dx ≈ Δx/2 * [f(a) + 2f(x1) + 2f(x2) + ... + f(b)]其中,x1, x2, …, xn-1 是分割点。
梯形法则的优点是简单易懂,容易推广到多维积分,适用于一般的函数。
然而,它的缺点是存在一定的误差,特别是在曲线弯曲的区域,误差较大。
3. 辛普森法则辛普森法则是一种利用拟合曲线来近似曲线下面积的方法。
与梯形法则类似,辛普森法则也将函数f(x)在区间[a, b]上分成若干个小区间,每个小区间的宽度为Δx=(b-a)/n,但不同的是,辛普森法则采用二次多项式来拟合每个小区间内的曲线。
辛普森法则的近似积分公式如下:∫[a, b] f(x) dx ≈ Δx/3 * [f(x0) + 4f(x1) + 2f(x2) + 4f(x3) + ... + f(xn)]其中,x0, x1, x2, …, xn 是分割点,且n为偶数。
辛普森法则的优点是相比于梯形法则,它的精度更高,尤其适用于曲线较为平滑的情况。
然而,辛普森法则的缺点是计算量较大,对于需要较高精度的计算而言,分割的区间数需要相对较多。
4. 应用场景梯形法则和辛普森法则在数值计算中有广泛的应用,特别是在求解无法用解析方法求得精确解的积分问题时,这两种方法成为重要的工具。
数值分析复化Simpson积分公式和复化梯形积分公式计算积分的通用程序
数值分析第五次程序作业PB09001057 孙琪【问题】分别编写用复化Simpson 积分公式和复化梯形积分公式计算积分的通用程序;用如上程序计算积分: I (f )=∫sin (x )dx 40取节点x i , i =0,…,N,N 为2k ,k =0,1,…,12,并分析误差;简单分析你得到的数据。
【复化Simpson 积分公式】Simpson 法则:∫f (x )dx ≈b −a 6[f (a )+4f (a +b 2)+f (b )]b a 使用偶数个子区间上的复合Simpson 法则:设n 是偶数,x i =a +ih , h =b−a n ,(0≤i ≤n) 则有∫f (x )dx =∫f (x )dx +∫f (x )dx +⋯+∫f (x )dx =∑∫f (x )dx x 2i x 2i−2n 2i=1x n x n−2x 4x 2x 2x 0b a 将Simpson 法则应用于每一个区间,得到复合Simpson 法则:∫f (x )dx ≈h 3b a [f (x 0)+2∑f (x 2i−2)n 2i=2+4∑f (x 2i−1)n 2i=1+f (x n )] 公式的误差项为:−1180(b −a )h 4f (4)(δ) 其中δ∈(a,b)【复化梯形积分公式】梯形法则:对两个节点相应的积分法则称为梯形法则:∫f (x )dx ≈b −a 2b a [f (a )+f (b )] 如果划分区间[a,b]为:a =x 0<x 1<⋯<x n =b那么在每个区间上可应用梯形法则,此时节点未必是等距的,由此得到复合梯形法则:∫f (x )dx =∑∫f (x )dx x i x i−1n i=1b a ≈12∑(x i −x i−1)[f (x i−1)+f (x i )]ni=1 对等间距h=(b-a)/n 及节点x i =a +ih ,复合梯形法则具有形式:∫f (x )dx ≈h 2[f (a )+2∑f (a +ih )n−1i=1+f (b )]b a 误差项为:−112(b −a )h 2f ′′(δ)【算法分析】复合Simpson 法则和复合梯形法则的算法上述描述中都已介绍了,在此不多做叙述。
复化梯形法 复化矩形法 变步长梯形 变步长辛普森
陕西科技大学机械教改班用C++的积分其实积分的思想就是,微分—>求和—>取极限,如果是用纯手工法那就是先对一个函数微分,再求出它的面积,在取极限,因为我们的计算速度和计算量有限,现在有了计算机这个速度很快的机器,我们可以把微分后的每个小的面积加起来,为了满足精度,我们可以加大分区,即使实现不了微分出无限小的极限情况,我们也至少可以用有限次去接近他,下面我分析了四种不同的积分方法,和一个综合通用程序。
一.积分的基本思想1、思路:微分—>求和—>取极限。
2、Newton —Leibniz 公式 ⎰-=ba a Fb F dx x f )()()( 其中,)(x F 被积函数)(x f的原函数。
3、用计算机积分的思路在积分区间内“微分—>求和—>控制精度”。
因为计算机求和不可以取极限,也就是不可以无限次的加下去,所以要控制精度。
二.现有的理论1、一阶求积公式---梯形公式⎰=+-=b a T b f a f a b dx x f )]()([2)( 他只能精确计算被积函数为0、1次多项式时的积分。
2、二阶求积分公式——牛顿、科特斯公式 ⎰=+++-=ba Sb f a b f a f a b dx x f )]()2(4)([6)(他只能精确计算被积函数为0、1、2、3次多项式时的积分。
三.四种实现方法1.复化矩形法将积分区间[a,b]等分成n 个子区间:],[],[],[],[],[112322110n n n n x x x x x x x x x x ---、、、 则h=(b-a)/n,区间端点值k x =a+kh)hf(x ))f(x x (x I 11121=-=)()()x (22232x hf x f x I =-=............................)()()(111n ---=-=n n n n x hf x f x x I∑==ni i x hf T 1n )(源程序:#include <iostream.h>#include<math.h>double f(double x) //计算被积函数{double y;y=log(1+x)/(1+x*x); //被积函数return y;}double Tn(double a,double b,int n) //求Tn{double t=0.0;double xk; //区间端点值double t1,t2; //用来判断精度do{double h=(b-a)/n;for(int k=1;k<=n-1;k++) //每一小段的矩形叠加 {t1=t;xk=a+k*h;t+=h*f(xk);t2=t;}n++; //如果精度不够就对区间再次细分,直到达到精度要求 }while(fabs(t1-t2)<=1e-7); //判断计算精度return t;}void main(){double a=0.0; //积分下线double b=2.0; //积分上限int n=1024; //把区间分为1024段cout<<Tn(a,b,n)<<endl; //输出积分结果}执行结果:2.复化梯形法方法和复化矩形法类似,只是把原来的矩形小面积变成了梯形小面积,但是精确度明显提高了,也就是说达到同样的精度需要的时间少了。
复化辛浦生公式
n
f ( n 1) ( ) 余项 Rn ( x) n 1 ( x) (n 1)!
其中
lk ( x )
0 j n jk
x xj xk x j
[ a , b]
n 1 ( x) ( x xi )
i 0
n
而
f ( x) Ln ( x) Rn ( x)
假设计算 f ( xk )时有误差 k , 即
n
k f ( xk ) f ( xk )
(n) ( b a ) C 则在实际中用 k f ( xk ) 代替 (b a) k 0
n
C
表 5.1 科特斯系数
n 1 2 3 4 5
Ck( n)
1 1 , 2 2 1 4 1 , , 6 6 6 1 3 3 1 , , , . 8 8 8 8 7 16 2 16 7 , , , , . 90 45 15 45 90 19 25 25 25 25 19 , , , , , . 288 96 144 144 96 288
注: 求积公式具有 m 次代数精确度的充要条件是
2 m f ( x ) 1 , x , x , , x 它对于 都准确成立,而 m 1 对于 f ( x ) x 不准确成立。
2、求积公式的代数精度
容易验证梯形公式,辛浦生公式,科特斯公式 分别具有1,3,5次代数精度。
定理 5.1 含有 n 1 个节点的插值型数值积分公式 的代数精度至少是 n 。
令I I1
对于 f ( x) x3
I
h 0
h x dx 4
3 4
5
4
4 h h4 I1 ah2 [0 3h 2 ] 4 2
复化梯形公式和复化辛普森公式
复化梯形公式和复化辛普森公式1. 引言嘿,大家好!今天我们来聊聊数学里那些看似高深莫测的公式,尤其是复化梯形公式和复化辛普森公式。
这些名字听起来就像是从某部科幻片里蹦出来的角色,但其实它们是我们在数值积分中不可或缺的好帮手。
你知道吗?它们就像是数学世界里的“超能英雄”,让我们轻松搞定积分,简直是妙不可言。
2. 复化梯形公式2.1 你知道什么是梯形吗?首先,咱们得聊聊复化梯形公式。
说白了,就是把一个复杂的积分任务,分解成几个小的梯形来求解。
想象一下,你在河边钓鱼,河水流得可欢了。
为了找一个合适的钓鱼点,你可能得把河分成几段,然后每一段的宽度就是你的小梯形。
你看,这就是复化梯形的魅力所在!2.2 如何运用复化梯形公式?用这个公式的时候,你只需把整个区间分成N个小区间,每个区间的宽度都是一样的。
然后,把每个小区间的函数值拿来加一加,再乘上宽度的一半,最后再把头尾的函数值加上。
这听起来是不是很简单?比如,你想算从0到1的某个函数的积分,只要把这个区间分成若干段,像切蛋糕一样,每一片都求个函数值,然后把结果合起来就行了。
简单得就像吃个冰淇淋,大家都喜欢。
3. 复化辛普森公式3.1 辛普森是谁?接下来,让我们来看看复化辛普森公式。
辛普森这个名字,大家可能都听过,或者说过“这是辛普森家的事儿”。
其实,他是一位牛逼的数学家,专门研究如何让积分变得更加简单。
辛普森公式就像是对梯形公式的一次升级,像换了个新款手机,功能更强大,效果更好。
3.2 如何运用复化辛普森公式?用复化辛普森公式的时候,我们也是把整个区间分成N个小区间,不过这里的N必须是偶数哦!每个小区间的宽度仍然是一样的。
然后,用函数值的加权平均法来计算。
换句话说,你把每个小区间的头尾和中间的函数值都考虑进来,像是为你的冰淇淋加上各种口味的配料。
最后,你的结果就会比单纯用梯形公式得来的要精准多了,仿佛一口下去,味蕾都在舞蹈。
4. 比较与应用4.1 谁更强?说到这儿,很多人就会问,复化梯形公式和复化辛普森公式,谁更厉害呢?其实,这就像问“苹果和橘子,哪个更好吃”。
c.2数值积分中复化simpson公式和变步长梯形法内容
c.2数值积分中复化simpson公式和变步长梯形法内容1. 引言1.1 概述数值积分是数学领域中重要的计算方法之一,广泛应用于工程、物理、经济学等多个学科。
它通过近似求解定积分来解决无法进行解析求解的复杂函数问题。
在数值积分方法中,复化Simpson公式和变步长梯形法都是常见且有效的技术手段。
1.2 文章结构本文将围绕复化Simpson公式和变步长梯形法展开讨论,并对它们进行比较与选择。
文章主要分为引言、复化Simpson公式、变步长梯形法、两者比较与选择以及结论部分。
1.3 目的本文旨在介绍复化Simpson公式和变步长梯形法这两种数值积分方法,探讨它们的基本原理、方法步骤以及在实际应用中的优势和适用场景。
通过对比与选择这两种方法,可以为读者提供更好地理解和运用数值积分技术的指导,并为未来研究方向和改进空间提供一定参考。
2. 复化Simpson公式:2.1 基本原理:复化Simpson公式是一种数值积分方法,用于近似计算定积分的值。
它基于简单的Simpson公式,并将区间等分为若干子区间,在每个子区间上应用Simpson公式来进行积分计算。
2.2 方法步骤:下面是复化Simpson公式的具体步骤:1. 将要积分的区间[a, b]等分为n个子区间,每个子区间宽度为h。
2. 根据Simpson公式,计算每个子区间的积分值。
3. 将所有子区间的积分值相加,得到整个区间[a, b]上的近似积分值。
具体而言,对于每个子区间[x(i-1), x(i)], i从1到n,使用Simpson公式进行积分近似。
即将该子区间均匀地划分为两部分,并以梯形面积和抛物线面积来逼近曲线下面积。
然后将所有n个子区间的近似积分值相加,得到最终的数值积分结果。
2.3 应用和优势:复化Simpson公式在数学和工程领域中广泛应用于需要进行定积分计算的问题。
它的优势包括:1. 相比于简单的Simpson公式,复化Simpson公式可以更准确地近似计算定积分的值。
辛普森求积公式分解
的插值型求积公式
In=(b-a)ckn)f(Xk)
为牛顿一柯特斯(Newton-Cotes)公式,式中ckn)称为柯特斯系数.根据插值型求积公式系数(1-2),引进变换x=a+th,则有
(一1严n
dt=鳥丿昭nn(t-j)dt
nk!(n-k)!0j出
j?k
当n =2时,由上式有
(2)121
C0=4J0(tT)(t-2)dt ="
i二0
这就是数值求积的思想(有效地解决了本章开始提出的问题),权因子A和节点Xi
i=0,1,2,…,n的不同确定方法就对应不同的数值求积公式
§
定义1.1称形如(1-1)式的求积公式为机械求积公式,其中Ai仅节点的选择与
f (x)无关,a =Xo兰X1<X2兰…Xn=b称为求积节点,Ai(20,1,2,…,n)称为求积
1.1基本思想及基本概念
§
由定积分中值定理:
b
=ff (x)dx=f (E)(b -a), a<E<ba
可知:积分可以通过被积函数在©处的值得到.由于积分中值定理仅仅告诉我们匕在 一定条件下是存在的,但并没有给出确定匕的方法.一个很自然的想法就是利用被积
函数f(X)在节点a =Xo<X1<X2Xn=b处函数值的加权平均来替代(近似)f(©),
Rs =
晋(宁)4f(4m,ya,b],f(x)心⑻b]
(1-5)
§
例1.1用辛普森求积公式计算积分
2
4+x
由积分形式可知a =0,b=1,n= 2
用辛普森公式计算有下式
1x1 1
-0^^6[f(O^4f(1^f(1)]
其中f(xV
复化梯形公式和复化Simpson公式
数值计算方法上机题目3一、计算定积分的近似值:221x e xe dx =⎰ 要求:(1)若用复化梯形公式和复化Simpson 公式计算,要求误差限71021-⨯=ε,分别利用他们的余项估计对每种算法做出步长的事前估计;(2)分别利用复化梯形公式和复化Simpson 公式计算定积分;(3)将计算结果与精确解比较,并比较两种算法的计算量。
1.复化梯形公式程序:程序1(求f (x )的n 阶导数:syms xf=x*exp(x) %定义函数f (x )n=input('输入所求导数阶数:')f2=diff(f,x,n) %求f(x)的n 阶导数结果1输入n=2f2 =2*exp(x) + x*exp(x)程序2:clcclearsyms x%定义自变量xf=inline('x*exp(x)','x') %定义函数f(x)=x*exp(x),换函数时只需换该函数表达式即可f2=inline('(2*exp(x) + x*exp(x))','x') %定义f(x)的二阶导数,输入程序1里求出的f2即可。
f3='-(2*exp(x) + x*exp(x))'%因fminbnd()函数求的是表达式的最小值,且要求表达式带引号,故取负号,以便求最大值e=5*10^(-8) %精度要求值a=1 %积分下限b=2 %积分上限x1=fminbnd(f3,1,2) %求负的二阶导数的最小值点,也就是求二阶导数的最大值点对应的x值for n=2:1000000 %求等分数nRn=-(b-a)/12*((b-a)/n)^2*f2(x1) %计算余项if abs(Rn)<e %用余项进行判断break% 符合要求时结束endendh=(b-a)/n %求hTn1=0for k=1:n-1 %求连加和xk=a+k*hTn1=Tn1+f(xk)endTn=h/2*((f(a)+2*Tn1+f(b)))z=exp(2)R=Tn-z %求已知值与计算值的差fprintf('用复化梯形算法计算的结果 Tn=')disp(Tn)fprintf('等分数 n=')disp(n) %输出等分数fprintf('已知值与计算值的误差 R=')disp(R)输出结果显示:用复化梯形算法计算的结果 Tn= 7.3891等分数 n=7019已知值与计算值的误差 R= 2.8300e-0082. Simpson公式程序:程序1:(求f(x)的n阶导数):syms xf=x*exp(x) %定义函数f(x)n=input('输入所求导数阶数:')f2=diff(f,x,n) %求f(x)的n阶导数结果1输入n=4f2 =4*exp(x) + x*exp(x)程序2:clcclearsyms x%定义自变量xf=inline('x*exp(x)','x') %定义函数f(x)=x*exp(x),换函数时只需换该函数表达式即可f2=inline('(4*exp(x) + x*exp(x))','x') %定义f(x)的四阶导数,输入程序1里求出的f2即可f3='-(4*exp(x) + x*exp(x))'%因fminbnd()函数求的是表达式的最小值,且要求表达式带引号,故取负号,一边求最大值e=5*10^(-8) %精度要求值a=1 %积分下限b=2 %积分上限x1=fminbnd(f3,1,2) %求负的四阶导数的最小值点,也就是求四阶导数的最大值点对应的x值for n=2:1000000 %求等分数nRn=-(b-a)/180*((b-a)/(2*n))^4*f2(x1) %计算余项if abs(Rn)<e %用余项进行判断break% 符合要求时结束endendh=(b-a)/n %求hSn1=0Sn2=0for k=0:n-1 %求两组连加和xk=a+k*hxk1=xk+h/2Sn1=Sn1+f(xk1)Sn2=Sn2+f(xk)endSn=h/6*(f(a)+4*Sn1+2*(Sn2-f(a))+f(b)) %因Sn2多加了k=0时的值,故减去f(a)z=exp(2)R=Sn-z %求已知值与计算值的差fprintf('用Simpson公式计算的结果 Sn=')disp(Sn)fprintf('等分数 n=')disp(n)fprintf('已知值与计算值的误差 R=')disp(R)输出结果显示:用Simpson公式计算的结果 Sn= 7.3891等分数 n=24已知值与计算值的误差 R= 2.7284e-008用复化梯形公式计算的结果为:7.3891,与精确解的误差为:2.8300e-008。
复化梯形公式和复化Simpson公式
数值计算方法上机题目3一、计算定积分的近似值:221x e xe dx =⎰ 要求:(1)若用复化梯形公式和复化Simpson 公式计算,要求误差限71021-⨯=ε,分别利用他们的余项估计对每种算法做出步长的事前估计;(2)分别利用复化梯形公式和复化Simpson 公式计算定积分;(3)将计算结果与精确解比较,并比较两种算法的计算量。
1.复化梯形公式程序:程序1(求f (x )的n 阶导数:syms xf=x*exp(x) %定义函数f (x )n=input('输入所求导数阶数:')f2=diff(f,x,n) %求f(x)的n 阶导数结果1输入n=2f2 =2*exp(x) + x*exp(x)程序2:clcclearsyms x%定义自变量xf=inline('x*exp(x)','x') %定义函数f(x)=x*exp(x),换函数时只需换该函数表达式即可f2=inline('(2*exp(x) + x*exp(x))','x') %定义f(x)的二阶导数,输入程序1里求出的f2即可。
f3='-(2*exp(x) + x*exp(x))'%因fminbnd()函数求的是表达式的最小值,且要求表达式带引号,故取负号,以便求最大值e=5*10^(-8) %精度要求值a=1 %积分下限b=2 %积分上限x1=fminbnd(f3,1,2) %求负的二阶导数的最小值点,也就是求二阶导数的最大值点对应的x值for n=2:1000000 %求等分数nRn=-(b-a)/12*((b-a)/n)^2*f2(x1) %计算余项if abs(Rn)<e %用余项进行判断break% 符合要求时结束endendh=(b-a)/n %求hTn1=0for k=1:n-1 %求连加和xk=a+k*hTn1=Tn1+f(xk)endTn=h/2*((f(a)+2*Tn1+f(b)))z=exp(2)R=Tn-z %求已知值与计算值的差fprintf('用复化梯形算法计算的结果 Tn=')disp(Tn)fprintf('等分数 n=')disp(n) %输出等分数fprintf('已知值与计算值的误差 R=')disp(R)输出结果显示:用复化梯形算法计算的结果Tn= 7.3891等分数n=7019已知值与计算值的误差R= 2.8300e-0082. Simpson公式程序:程序1:(求f(x)的n阶导数):syms xf=x*exp(x) %定义函数f(x)n=input('输入所求导数阶数:')f2=diff(f,x,n) %求f(x)的n阶导数结果1输入n=4f2 =4*exp(x) + x*exp(x)程序2:clcclearsyms x%定义自变量xf=inline('x*exp(x)','x') %定义函数f(x)=x*exp(x),换函数时只需换该函数表达式即可f2=inline('(4*exp(x) + x*exp(x))','x') %定义f(x)的四阶导数,输入程序1里求出的f2即可f3='-(4*exp(x) + x*exp(x))'%因fminbnd()函数求的是表达式的最小值,且要求表达式带引号,故取负号,一边求最大值e=5*10^(-8) %精度要求值a=1 %积分下限b=2 %积分上限x1=fminbnd(f3,1,2) %求负的四阶导数的最小值点,也就是求四阶导数的最大值点对应的x值for n=2:1000000 %求等分数nRn=-(b-a)/180*((b-a)/(2*n))^4*f2(x1) %计算余项if abs(Rn)<e %用余项进行判断break% 符合要求时结束endendh=(b-a)/n %求hSn1=0Sn2=0for k=0:n-1 %求两组连加和xk=a+k*hxk1=xk+h/2Sn1=Sn1+f(xk1)Sn2=Sn2+f(xk)endSn=h/6*(f(a)+4*Sn1+2*(Sn2-f(a))+f(b)) %因Sn2多加了k=0时的值,故减去f(a)z=exp(2)R=Sn-z %求已知值与计算值的差fprintf('用Simpson公式计算的结果 Sn=')disp(Sn)fprintf('等分数 n=')disp(n)fprintf('已知值与计算值的误差 R=')disp(R)输出结果显示:用Simpson公式计算的结果Sn= 7.3891等分数n=24已知值与计算值的误差R= 2.7284e-008用复化梯形公式计算的结果为:7.3891,与精确解的误差为:2.8300e-008。
MATLAB实现复化梯形公式复化SIMPSON公式以及ROMBERG积分
MATLAB实现复化梯形公式复化SIMPSON公式以及ROMBERG积分复化梯形公式、复化SIMPSON公式和ROMBERG积分是常用的数值积分方法,用于对定积分进行数值近似计算。
下面将介绍MATLAB实现这三种方法的具体步骤。
复化梯形公式使用多个等距的子区间进行近似计算,然后将子区间上的梯形面积求和。
MATLAB代码如下:```matlabh=(b-a)/n;%子区间宽度x=a:h:b;%子区间节点y=f(x);%子区间节点对应的函数值result = h * (sum(y) - (y(1) + y(end)) / 2); % 计算近似积分值end```复化SIMPSON公式同样使用多个等距的子区间进行近似计算,但是每个子区间上使用二次多项式拟合。
MATLAB代码如下:```matlabh=(b-a)/n;%子区间宽度x=a:h:b;%子区间节点y=f(x);%子区间节点对应的函数值result = (h / 3) * (y(1) + y(end) + 4 * sum(y(2:2:end-1)) + 2 * sum(y(3:2:end-2))); % 计算近似积分值end```3. ROMBERG积分(Romberg Integration)ROMBERG积分是一种逐次精化的数值积分方法,通过不断提高梯形法则的阶数进行近似计算。
MATLAB代码如下:```matlabfunction result = romberg_integration(f, a, b, n)R = zeros(n, n); % 创建一个n*n的矩阵用于存储结果h=b-a;%子区间宽度R(1,1)=(h/2)*(f(a)+f(b));%计算初始近似积分值for j = 2:nh=h/2;%缩小子区间宽度sum = 0;for i = 1:2^(j-2)sum = sum + f(a + (2 * i - 1) * h);endR(j, 1) = 0.5 * R(j-1, 1) + (h * sum); % 使用梯形法则计算积分值for k = 2:jR(j, k) = R(j, k-1) + (R(j, k-1) - R(j-1, k-1)) / ((4^k) - 1); % 使用Romberg公式计算积分值endendresult = R(n, n); % 返回最终近似积分值end```以上是MATLAB实现复化梯形公式、复化SIMPSON公式以及ROMBERG积分的代码。
复化梯形公式和复化Simpson公式
数值计算方法上机题目3一、计算定积分的近似值:221x e xe dx =⎰ 要求:(1)若用复化梯形公式和复化Simpson 公式计算,要求误差限71021-⨯=ε,分别利用他们的余项估计对每种算法做出步长的事前估计;(2)分别利用复化梯形公式和复化Simpson 公式计算定积分;(3)将计算结果与精确解比较,并比较两种算法的计算量。
1.复化梯形公式程序:程序1(求f (x )的n 阶导数:syms xf=x*exp(x) %定义函数f (x )n=input('输入所求导数阶数:')f2=diff(f,x,n) %求f(x)的n 阶导数结果1输入n=2f2 =2*exp(x) + x*exp(x)程序2:clcclearsyms x%定义自变量xf=inline('x*exp(x)','x') %定义函数f(x)=x*exp(x),换函数时只需换该函数表达式即可f2=inline('(2*exp(x) + x*exp(x))','x') %定义f(x)的二阶导数,输入程序1里求出的f2即可。
f3='-(2*exp(x) + x*exp(x))'%因fminbnd()函数求的是表达式的最小值,且要求表达式带引号,故取负号,以便求最大值e=5*10^(-8) %精度要求值a=1 %积分下限b=2 %积分上限x1=fminbnd(f3,1,2) %求负的二阶导数的最小值点,也就是求二阶导数的最大值点对应的x值for n=2:1000000 %求等分数nRn=-(b-a)/12*((b-a)/n)^2*f2(x1) %计算余项if abs(Rn)<e %用余项进行判断break% 符合要求时结束endendh=(b-a)/n %求hTn1=0for k=1:n-1 %求连加和xk=a+k*hTn1=Tn1+f(xk)endTn=h/2*((f(a)+2*Tn1+f(b)))z=exp(2)R=Tn-z %求已知值与计算值的差fprintf('用复化梯形算法计算的结果 Tn=')disp(Tn)fprintf('等分数 n=')disp(n) %输出等分数fprintf('已知值与计算值的误差 R=')disp(R)输出结果显示:用复化梯形算法计算的结果Tn= 7.3891等分数n=7019已知值与计算值的误差R= 2.8300e-0082. Simpson公式程序:程序1:(求f(x)的n阶导数):syms xf=x*exp(x) %定义函数f(x)n=input('输入所求导数阶数:')f2=diff(f,x,n) %求f(x)的n阶导数结果1输入n=4f2 =4*exp(x) + x*exp(x)程序2:clcclearsyms x%定义自变量xf=inline('x*exp(x)','x') %定义函数f(x)=x*exp(x),换函数时只需换该函数表达式即可f2=inline('(4*exp(x) + x*exp(x))','x') %定义f(x)的四阶导数,输入程序1里求出的f2即可f3='-(4*exp(x) + x*exp(x))'%因fminbnd()函数求的是表达式的最小值,且要求表达式带引号,故取负号,一边求最大值e=5*10^(-8) %精度要求值a=1 %积分下限b=2 %积分上限x1=fminbnd(f3,1,2) %求负的四阶导数的最小值点,也就是求四阶导数的最大值点对应的x值for n=2:1000000 %求等分数nRn=-(b-a)/180*((b-a)/(2*n))^4*f2(x1) %计算余项if abs(Rn)<e %用余项进行判断break% 符合要求时结束endendh=(b-a)/n %求hSn1=0Sn2=0for k=0:n-1 %求两组连加和xk=a+k*hxk1=xk+h/2Sn1=Sn1+f(xk1)Sn2=Sn2+f(xk)endSn=h/6*(f(a)+4*Sn1+2*(Sn2-f(a))+f(b)) %因Sn2多加了k=0时的值,故减去f(a)z=exp(2)R=Sn-z %求已知值与计算值的差fprintf('用Simpson公式计算的结果 Sn=')disp(Sn)fprintf('等分数 n=')disp(n)fprintf('已知值与计算值的误差 R=')disp(R)输出结果显示:用Simpson公式计算的结果Sn= 7.3891等分数n=24已知值与计算值的误差R= 2.7284e-008用复化梯形公式计算的结果为:7.3891,与精确解的误差为:2.8300e-008。
复化梯形公式和复化辛普森公式的精度比较学习资料
实验四、复化梯形公式和复化Simpson公式的精度比较(2学时)一、实验目的与要求1、熟悉复化Simpson公式和复化梯形公式的构造原理;2、熟悉并掌握二者的余项表达式;3、分别求出准确值,复化梯形的近似值,复化Simpson的近似值,并比较后两者的精度;4、从余项表达式,即误差曲线,来观察二者的精度,看哪个更接近于准确值。
二、实验内容:对于函数sin()xf xx=,试利用下表计算积分1sin xI dxx=⎰。
表格如下:注:分别利用复化梯形公式和复化Simpson公式计算,比较哪个精度更好。
其中:积分的准确值0.9460831I=。
三、实验步骤1、熟悉理论知识,并编写相应的程序;2、上机操作,从误差图形上观察误差,并与准确值相比较,看哪个精度更好;3、得出结论,并整理实验报告。
四、实验注意事项1、复化梯形公式,程序主体部分:for n=2:10T(n)=0.5*T(n-1)for i=1:2^(n-2)T(n)=T(n)+(sin((2*i-1)/2^(n-1))/((2*i-1)/2^(n-1)))/2^(n-1);endend2、复化Simpson公式,程序主体部分:for i=1:10n=2.^ix=0:1/n:1f=sin(x)./xf(1)=1s=0for j=1:n/2s=s+f(2*j)endt=0for j=1:(n/2-1)t=t+f(2*j-1)endS(i)=1/3/n*(f(1)+4*s+2*t+f(n+1))end五.实验内容复化梯形公式和复化辛普森公式的引入复化梯形公式:110[(()]2n n k k k h T f x f x -+==+∑;复化辛普森公式:11102[(4()()]6n n k k k k h S f x f x f x -++==++∑; 根据题意和复化梯形公式、复化辛普森公式的原理编辑程序求解代码如下: Matlab 代码clcs=quad('sin(x)./x',0,1)p1=zeros(10,1);p2=zeros(10,1);for k=6:15s1=0;s2=0;x=linspace(0,1,k);y=sin(x)./x;z=(1/(2*(k-1))):(1/(k-1)):1;sz=sin(z)./z;y(1)=1;for i=1:(k-1)s1=s1+0.5*(x(i+1)-x(i))*(y(i)+y(i+1));endfor j=1:(k-1)s2=s2+(1/6)*(x(j+1)-x(j))*(y(j)+y(j+1)+4*sz(j)); endp1(k-5)=s1-s;p2(k-5)=s2-s;endp1;p2;s1=s+p1(4)s2=s+p2(4)format longfor k=1:length(p1)p1(k)=abs(p1(k));p2(k)=abs(p2(k));endp1p2plot(6:1:15,p1,'-r')hold onplot(6:1:15,10000*(p2),'-c') hold off部分程序结果输出:s =0.946083070076534s1 =0.945690863582701s2 =0.946083085384947结果分析根据结果输出可知:积分10sin()xI dxx=⎰的准确值为:I= 0.946083070076534;通过复化梯形公式和复化辛普森公式得到的积分值为:s1 =0.945690863582701:s2 =0.946083085384947;相对误差为:411100 4.1510100S I Iδ--=⨯=⨯; 822100 1.6210100S I Iδ--=⨯=⨯; 显然,从相对误差可知通过辛普森公式得到的结果误差小精度高。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
陕西科技大学机械教改班用C++的积分其实积分的思想就是,微分—>求和—>取极限,如果是用纯手工法那就是先对一个函数微分,再求出它的面积,在取极限,因为我们的计算速度和计算量有限,现在有了计算机这个速度很快的机器,我们可以把微分后的每个小的面积加起来,为了满足精度,我们可以加大分区,即使实现不了微分出无限小的极限情况,我们也至少可以用有限次去接近他,下面我分析了四种不同的积分方法,和一个综合通用程序。
一.积分的基本思想1、思路:微分—>求和—>取极限。
2、Newton —Leibniz 公式 ⎰-=ba a Fb F dx x f )()()( 其中,)(x F 被积函数)(x f的原函数。
3、用计算机积分的思路在积分区间内“微分—>求和—>控制精度”。
因为计算机求和不可以取极限,也就是不可以无限次的加下去,所以要控制精度。
二.现有的理论1、一阶求积公式---梯形公式⎰=+-=b a T b f a f a b dx x f )]()([2)( 他只能精确计算被积函数为0、1次多项式时的积分。
2、二阶求积分公式——牛顿、科特斯公式 ⎰=+++-=ba Sb f a b f a f a b dx x f )]()2(4)([6)(他只能精确计算被积函数为0、1、2、3次多项式时的积分。
三.四种实现方法1.复化矩形法将积分区间[a,b]等分成n 个子区间:],[],[],[],[],[112322110n n n n x x x x x x x x x x ---、、、 则h=(b-a)/n,区间端点值k x =a+kh)hf(x ))f(x x (x I 11121=-=)()()x (22232x hf x f x I =-=............................)()()(111n ---=-=n n n n x hf x f x x I∑==ni i x hf T 1n )(源程序:#include <iostream.h>#include<math.h>double f(double x) //计算被积函数{double y;y=log(1+x)/(1+x*x); //被积函数return y;}double Tn(double a,double b,int n) //求Tn{double t=0.0;double xk; //区间端点值double t1,t2; //用来判断精度do{double h=(b-a)/n;for(int k=1;k<=n-1;k++) //每一小段的矩形叠加 {t1=t;xk=a+k*h;t+=h*f(xk);t2=t;}n++; //如果精度不够就对区间再次细分,直到达到精度要求 }while(fabs(t1-t2)<=1e-7); //判断计算精度return t;}void main(){double a=0.0; //积分下线double b=2.0; //积分上限int n=1024; //把区间分为1024段cout<<Tn(a,b,n)<<endl; //输出积分结果}执行结果:2.复化梯形法方法和复化矩形法类似,只是把原来的矩形小面积变成了梯形小面积,但是精确度明显提高了,也就是说达到同样的精度需要的时间少了。
⎥⎦⎤⎢⎣⎡++=∑∑-==111)(2)()(2n k k ni i x f b f a f h I 变形一下:∑-=++=11n )()]()([21n k k x f h b f a f h T 源程序:#include <iostream.h>#include<math.h>double f(double x) //计算被积函数{double y;y=log(1+x)/(1+x*x); //被积函数return y;}double Tn(double a,double b,int n) //求Tn{double t=0.0;double xk; //区间端点值double t1,t2,h=(b-a)/n; //用来判断精度do{h=(b-a)/n;for(int k=1;k<=n-1;k++) //余项叠加,相当于每一个小梯形相加 {t1=t;xk=a+k*h;t+=f(xk);t2=t;}n++; //如果精度不够就对区间再次细分,直到达到精度要求}while(fabs(t1-t2)<=1e-7); //判断计算精度t=h*(f(a)+f(b))/2+t*h; //加上初项就是积分结果了return t;}void main(){double a=0.0; //积分下线double b=2.0; //积分上线int n=1024; //把区间分为1024段cout<<Tn(a,b,n)<<endl; //输出积分结果}执行结果:3.变步长梯形法上面我们在应用复化积分法的时候会对区间进行分割,但是在要求精度是我们也不知道事先应该分割成多少段,分的少了精度达不到,分的多了计算量太大,为了解决这个问题我在上面加了一个循环,来不断地对区间进行再次划分,直到达到精度要求,变步长积分法与我用的方法类似,只不过变步长积分法的区间划分时成倍增加的。
实现方法;由复化梯形法知道;∑-=++=11n )()]()([21n k k x f h b f a f h T 步长h=(b-a)/n现在将步长分半,即在相邻两节点[]1,+k k x x 的中点)(21121+++=k k k x x x 处增加一个求积节点,那么 []∑∑-=+-=⋅+⋅++=1021112)(2)(24)()(n k k n n k k n n n x f h x f h b f a f h T 变形一下:n n k n n k k n n n h k h a x na b h x f h T T ⋅++=-=⋅+=+-=+∑2/)()(222110212其中:源程序:#include <iostream.h>#include <math.h>double f(double x) //计算被积函数的值{double y;y=log(1+x)/(1+x*x);return y;}double t2ntn(double a,double b){int n=1;double hn=b-a; //原步长double tn=0.0;double t2n=(f(a)+f(b))*hn/2.0;while(fabs(t2n-tn)>1e-7) //判断精度{tn=t2n;t2n=0.0;for(int k=0;k<=n-1;k++) //循环叠加t2n+=f(a+hn/2.0+k*hn);t2n=tn/2.0+t2n*hn/2.0;n=n*2;hn=hn/2.0; //步长分半}return t2n;}void main(){double a=0.0;double b=2.0;cout<<t2ntn(a,b)<<endl;}执行结果:4.变步长辛普森法之前的积分斜边都是直线,如果用抛物线接近就会更准确复化辛普森求积公式h k a x na b h x f x f b f a f h T k n k k n k k n ⋅+=-=⎥⎦⎤⎢⎣⎡+++=∑∑-=+-=/)()(4)(2)()(6102/111然后就只要每次让他的积分区间加倍就行直到达到要求的精度#include <stdio.h>#include <iostream.h>#include <math.h>double a=0.0,b=2.0,e=1e-7; //积分上下线,和精度要求int n=1024;double f(double x){Double y;y=log(1+x)/(1+x*x); //被积函数return y;}float simpson(){int i;double s,sn,s2n,p,x,h;h=(b-a)/n; //步长s=f(a)+f(b);p=0;x=a+h; //积分端点for(i=1;i<=n-1;i++){if((i%2)!=0){p=p+4*f(x); //在区间中间时乘4x=x+h;}else{s=s+2*f(x); //积分端点时乘2x=x+h;}}s=s+p; //第一次求和s2n=s*h/3; //积分值do{sn=s2n;x=a+h/2; //变步长s=s-p/2;p=0;for(i=1;i<=n;i++) //变步长只需要加就行了{p=p+4*f(x);x=x+h;}s=s+p;n=n*2;h=h/2;s2n=s*h/3;}while(fabs(s2n-sn)>e); //控制精度return s2n;}void main(){cout<<simpson()<<endl;}执行结果:四.用C++写的综合程序#include <stdio.h>#include <iostream.h>#include <math.h>class Bjhs //抽象类{public:virtual double f(double x)=0; //虚计算被积函数virtual void print()=0; //输出函数virtual double Tn()=0; //虚函数};class Fhjx:public Bjhs //复化矩形法类{public:Fhjx(){a=0;b=2;e=1e-7;n=1024;} //构造函数付初值double f(double x); //计算被积函数double Tn() //求Tn{double t=0.0;double xk; //区间端点值double t1,t2; //用来判断精度do{double h=(b-a)/n;for(int k=1;k<=n-1;k++) //每一小段的矩形叠加{t1=t;xk=a+k*h;t+=h*f(xk);t2=t;}n++; //如果精度不够就对区间再次细分,直到达到精度要求}while(fabs(t1-t2)<=e); //判断计算精度return t;}void print() //输出{cout<<"用复化矩形法计算的结果"<<Tn()<<endl;}private:double a,b,e;int n;};double Fhjx::f(double x) //外联函数{double y;y=log(1+x)/(1+x*x); //被积函数return y;}class Fhtx:public Bjhs //复化梯形法{public:Fhtx(){a=0;b=2;e=1e-7;n=1024;}double f(double x); //计算被积函数double Tn() //求Tn{double t=0.0;double xk; //区间端点值double t1,t2,h=(b-a)/n; //用来判断精度do{h=(b-a)/n;for(int k=1;k<=n-1;k++) //余项叠加,相当于每一个小梯形相加{t1=t;xk=a+k*h;t+=f(xk);t2=t;}n++; //如果精度不够就对区间再次细分,直到达到精度要求}while(fabs(t1-t2)<=1e-7); //判断计算精度t=h*(f(a)+f(b))/2+t*h; //加上初项就是积分结果了return t;}void print(){cout<<"用复化梯形法计算的结果"<<Tn()<<endl;}private:double a,b,e;int n;};double Fhtx::f(double x){double y;y=log(1+x)/(1+x*x); //被积函数return y;}class Bbctx:public Bjhs //变步长梯形法{public:Bbctx(){a=0;b=2;e=1e-7;n=1;tn=0;}double f(double x); //计算被积函数的值double Tn(){double hn=b-a; //原步长double t2n=(f(a)+f(b))*hn/2.0;while(fabs(t2n-tn)>e) //判断精度{tn=t2n;t2n=0.0;for(int k=0;k<=n-1;k++) //循环叠加t2n+=f(a+hn/2.0+k*hn);t2n=tn/2.0+t2n*hn/2.0;n=n*2;hn=hn/2.0; //步长分半}return t2n;}void print(){cout<<"用变步长梯形法计算的结果"<<Tn()<<endl;}private:double a,b,e;double tn;int n;};double Bbctx::f(double x){double y;y=log(1+x)/(1+x*x); //被积函数return y;}class Bbcxps:public Bjhs //变步长辛普森法{public:Bbcxps(){n=1024;a=0;b=2;e=1e-7;} //积分上下线,和精度要求double f(double x);double Tn(){int i;double s,sn,s2n,p,x,h;h=(b-a)/n; //步长s=f(a)+f(b);p=0;x=a+h; //积分端点for(i=1;i<=n-1;i++){if((i%2)!=0) //判奇偶,也就是看哪点乘几{p=p+4*f(x); //在区间中间时乘4x=x+h;}else{s=s+2*f(x); //积分端点时乘2x=x+h;}}s=s+p; //第一次求和s2n=s*h/3; //积分值do{sn=s2n;x=a+h/2; //变步长s=s-p/2;p=0;for(i=1;i<=n;i++) //变步长只需要加就行了{p=p+4*f(x);x=x+h;}s=s+p;n=n*2;h=h/2;s2n=s*h/3;}while(fabs(s2n-sn)<=e); //控制精度return s2n;}void print(){cout<<"用变步长辛普森法计算的结果"<<Tn()<<endl;}private:double a,b,e,p;int n;};double Bbcxps::f(double x){double y;y=log(1+x)/(1+x*x); //被积函数return y;}void display(Bjhs&q) //输出函数{q.Tn();q.print();};void main() //选择你想要的方法,用switch语句{char a;Fhjx b;Fhtx c;Bbctx d;Bbcxps e;cout<<"求函数y=log(1+x)/(1+x*x)的积分值"<<endl;cout<<"请输入你要选用的方法的编号"<<endl;cout<<"A.复化矩形法 B.复化梯形法"<<endl;cout<<"C.变步长梯形法 D.变步长辛普森法"<<endl;cin>>a;switch(a){case'A': display(b);break;case'B': display(c);break;case'C': display(d);break;case'D': display(e);break;default:cout<<"输入代码错误"<<endl;break;}}执行结果:。