(整理)复化梯形法复化矩形法变步长梯形变步长辛普森

合集下载

利用复化梯形公式、复化simpson公式计算积分

利用复化梯形公式、复化simpson公式计算积分

1、 利用复化梯形公式、复化simpson 公式计算积分2、 比较计算误差与实际误差取n=2,3,…,10分别利用复化梯形公式、复化simpson 公式计算积分1 I = x 2dx ,并与真值进行比较,并画出计算误差与实际误差之间的曲线。

利用复化梯形公式的程序代码如下: function f=fx(x) f=x.A 2;R=on es(1,9)*(-(b-a)/12*h.A 2*2); %积分余项(计算误差)true=quad(@fx,0,1); %积分的真实值A=T-true; %计算的值与真实值之差(实际误差)x=li nspace(0,1,9);plot(x,A,'r',x,R,'*')%将计算误差与实际误差用图像画出来 注:由于被积函数是x.A2,它的二阶倒数为 2,所以积分余项为:(-(b-a)/12*h.A 2*2) 实 验 原 理 ( a=0; b=1; T=[]; for n=2:10; %积分下线 %积分上线 %用来装不同n 值所计算出的结果 h=(b-a)/n; %步长 x=zeros(1, n+1); for i=1: n+1 x(i)=a+(i-1)*h; end y=x.A2; t=0; for i=1: n t=t+h/2*(y(i)+y(i+1)); end T=[T,t]; end%给节点定初值 %给节点赋值 %给相应节点处的函数值赋值 %利用复化梯形公式求值 %把不同n 值所计算出的结果装入 T 中 实验目的或 %首先建立被积函数,以便于计算真实值。

2法二:a=0;b=1;T=[];for n=2:10h=(b-a)/(2* n); x=zeros(1,2* n+1);for i=1:2* n+1x(i)=a+(i-1)*h;endy=x.A4;t=y(1)+y(2* n+1);for i=1: nt=t+4*y(2*i)+2*y(2*i-1);endT=[T,h/3*t];endtrue=quad(@fx1,0,1);A=T-true;x=li nspace(0,1,9);plot(x,A)此法与第一种一样,只是所用的表达式不同。

复化梯形公式,复化辛普森公式,复化柯特斯公式

复化梯形公式,复化辛普森公式,复化柯特斯公式

复化梯形公式,复化辛普森公式,复化柯特斯公式
复化梯形公式、复化辛普森公式和复化柯特斯公式都是用来计算定积分的近似值的方法。

1. 复化梯形公式:将积分区间分成若干个小区间,在每个小区间上用梯形面积近似代替该小区间的曲边梯形面积,然后将这些梯形面积相加,得到积分的近似值。

2. 复化辛普森公式:将积分区间分成若干个等分小区间,在每个小区间上用矩形面积近似代替该小区间的曲边梯形面积,然后将这些矩形面积相加,得到积分的近似值。

3. 复化柯特斯公式:将积分区间分成若干个等分小区间,在每个小区间上用切线段长度近似代替该小区间的曲边梯形面积,然后将这些切线段长度相加,得到积分的近似值。

这三种方法都是通过将积分区间分成若干个小区间,然后在每个小区间上用近似方法计算该小区间的曲边梯形面积,最后将这些近似值相加得到积分的近似值。

它们的精度和误差都与分区间的大小有关。

复化梯形公式和复化辛普生公式

复化梯形公式和复化辛普生公式
return result;
}
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)计算得
而积分的准确值。

复化梯形公式和复化辛普森公式的精度比较(共7页)

复化梯形公式和复化辛普森公式的精度比较(共7页)

- 让每一个人同等地提高(tí gāo)自我实验四、复化梯形(tīxíng)公式和复化Simpson 公式的精度(jīnɡ dù)比较(2 学时(xuéshí))一、实验目的(mùdì)与要求1、熟习复化 Simpson 公式和复化梯形公式的结构原理;2、熟习并掌握两者的余项表达式;3、分别求出正确值,复化梯形的近似值,复化Simpson 的近似值,并比较后两者的精度;4、从余项表达式,即偏差曲线,来察看两者的精度,看哪个更靠近于正确值。

二、实验内容:关于函数 f (x) sin x,试利用下表计算积分 I 1sin xdx 。

x x表格以下:x 0 1/8 1/4 3/8 1/2 5/8 3/4 7/8 1 f ( x)1注:分别利用复化梯形公式和复化Simpson 公式计算,比较哪个精度更好。

此中:积分的正确值I0.9460831。

三、实验步骤1、熟习理论知识,并编写相应的程序;2、上机操作,从偏差图形上察看偏差,并与正确值对比较,看哪个精度更好;3、得出结论,并整理实验报告。

四、实验注意事项11- 让每一个人同等地提高(tí gāo)自我1、复化梯形公式,程序主体(zhǔtǐ)部分:for n=2:10T(n)=*T(n-1)for i=1:2^(n-2);endend2、复化 Simpson 公式(gōngshì),程序主体部分: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五.实验(shíyàn)内容复化梯形(tīxíng)公式和复化辛普森公式的引入22- 让每一个(yī ɡè)人同等地提高自我复化梯形(tīxíng)公式:T n n 1 h [ f (x k f ( x k 1 )] ;k 0 2复化辛普森公式:S n n 1 h4 f ( x 1 ) f (x k 1 )] ;[ f (x kk 0 6k2依据题意(tí yì)和复化梯形公式、复化辛普森公式的原理编写程序求解代码以下:Matlab 代码(dài mǎ)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+*(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;33- 让每一个人同等地提高(tí gāo)自我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部分(bù fen)程序结果输出:s=s1 =s2 =结果剖析1 sin( x);依据结果输出可知:积分 I dx 的正确值为: I=x44- 让每一个人同等(tóngděng)地提高自我经过复化梯形公式(gōngshì)和复化辛普森公式获得的积分值为:s1 =:s2 =;相对偏差为:S 1 I 100 4.15 10 4 ; 1I 100S 2 I 100 1.62 10 8 ; 2 I 100明显,从相对偏差可知经过辛普森公式获得(huòdé)的结果偏差小精度高。

复化梯形法 复化矩形法 变步长梯形 变步长辛普森

复化梯形法 复化矩形法 变步长梯形 变步长辛普森

陕西科技大学机械教改班用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.复化梯形法方法和复化矩形法类似,只是把原来的矩形小面积变成了梯形小面积,但是精确度明显提高了,也就是说达到同样的精度需要的时间少了。

分别利用矩形法、梯形法、辛普森法对定积分进行近似计算并比较计算效果。

分别利用矩形法、梯形法、辛普森法对定积分进行近似计算并比较计算效果。

称为矩形法。不过,只有当积分区间被分割得很细时,矩形法才有一定的精确度。
b 梯形法
b
f ( x)dx
a

ba 6n
[
y0

y2n

4(
y1

y3

y2n1 )
各个小梯形面积之和就是曲边梯形面积的近似值。
2( y2 y4 y2n2 )]
c 辛普森法
b a
f ( x)dx

0.4000 0.4100 0.4200 0.4300 0.4600 0.4700 0.4800 0.4900
0.4400
0.4500
Columns 51 through 60
0.5000 0.5100 0.5200 0.5300 0.5600 0.5700 0.5800 0.5900
0.5400
0.5500
实验过程纪录(含基本步骤、主要程序清单及异常情况纪录)
1、 计 算 的
近似值
方法一:矩形法
1 si >>n=100
x=0:1/n:1 left_sum=0; right_sum=0; for i=1:n
if i==1 left_sum=left_sum + 1/n;
else left_sum=left_sum + sin(x(i))/x(i)*(1/n);
a=0;
b=1;
syms x fx
fx=1/(1+x^2);
i=1:n;
xx=a+(2*i-2)*(b-a)/(2*n); yy=a+(2*i-1)*(b-a)/(2*n); zz=a+(2*i-0)*(b-a)/(2*n); fyy=subs(fx,'x',yy); f=(fxx+4*fyy+fzz)*(b-a)/(6*n); s=sum(f) s =0.7854 方法三 梯形法 >> syms x >> y=1/(1+x^2); >> yi=eval(int(y,0,1))

复化辛浦生公式

复化辛浦生公式
k 0
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 谁更强?说到这儿,很多人就会问,复化梯形公式和复化辛普森公式,谁更厉害呢?其实,这就像问“苹果和橘子,哪个更好吃”。

复化梯形公式和复化Simpson公式

复化梯形公式和复化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。

c.2数值积分中复化simpson公式和变步长梯形法内容

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公式可以更准确地近似计算定积分的值。

辛普森求积公式分解

辛普森求积公式分解
n
的插值型求积公式
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公式

复化梯形公式和复化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。

复合梯形公式和辛普森公式

复合梯形公式和辛普森公式

一 、实验目的掌握复合辛普森求积公式的运用,能够用复合辛普森公式对函数进行近似 求值二 、实验要求 对于函数xx x f sin )(=,给出8=n 时的函数表,试用复合梯形公式及复合辛普森公式计算积分 dx x x I ⎰=10sin 三、实验内容1 复合梯形公式 将区间],[b a 划分为n 等份,分点n k n a b h kh a x k ,,1,0,,⋅⋅⋅=-=+=,在每个子区间],[1+k k x x )(1,,1,0-⋅⋅⋅=n k 上采用梯形公式))()((2)(b f a f a b dx x f ba +-≈⎰,则得 )()]()([2)()(101101f R x f x f h dx x f dx x f I n n k k k n k x x b a k k ++===∑∑⎰⎰-=+-=+ 记)]()(2)([2)]()([21111b f x f a f h x f x f h T n k k n k k k n ++=+=∑∑-=-+ 2 辛普森公式将区间],[b a 划分为n 等份,在每个子区间],[1+k k x x 上采用辛普森公式,若记h x x k k 212/1+=+ )()]()(4)([6)()(1012/1101f R x f x f x f h dx x f dx x f I n n k k k k n k x x b a k k +++===∑∑⎰⎰-=++-=+记=n S ∑-=++++112/1)]()(4)([6n k k k x f x f a f h=)]()(2)(4)([611102/1b f x f x f a f h n k k n k k ∑∑-=-=++++ 四、实验程序#include<stdio.h>#include"math.h"double fun1(double x){double f;if(x==0)f=1;elsef=sin(x)/x;return f;}fun(double a,double b,double h,double n){double x1;double sum=0.0;int i;sum+=(fun1(a)+fun1(b));for(i=1;i<=n-1;i++){x1=a+i*h;sum+=(2*fun1(x1));}sum*=(h/2);printf("用复合梯形公式求得的积分为:\n");printf("%lf\n",sum);}void main(){double a,b,n;double h;double t;printf("请输入积分上限与积分下限:\n");scanf("%lf%lf",&a,&b);printf("请输入把此区间n 等分的n:\n");scanf("%lf",&n);t=b-a;h=t/n;fun(a,b,h,n);}复合辛普森公式程序#include<stdio.h>#include"math.h"double fun1(double x){double f;if(x==0)f=1;elsef=sin(x)/x;return f;}fun(double a,double b,double h,double n) {double x1,x2;double sum=0.0;int i;sum+=(fun1(a)+fun1(b));for(i=1;i<=n-1;i++){x1=a+i*h;sum+=(2*fun1(x1));}for(i=0;i<=n-1;i++){x2=a+i*h+0.5*h;sum+=(4*fun1(x2));}sum=sum*(h/6);printf("%lf\n",sum);}void main(){double a,b,n;double h;double t;printf("请输入积分上限与积分下限:\n");scanf("%lf%lf",&a,&b);printf("请输入把此区间n等分的n:\n");scanf("%lf",&n);t=b-a;h=t/n;fun(a,b,h,n);}五、实验结果实验得到的结果:六、实验总结通过这次实验我对用复合梯形和辛普森公式求积分有了更多的了解。

Simpson Rule Summary 辛普森法则

Simpson Rule Summary   辛普森法则

考虑积分,如果在区间[a ,b]内取等间隔的N 份,间隔长度为h ,简述矩形[,]()ba b aI f x dx =⎰(、梯形、Simpson 法则)计算积分的i )理论、误差精度分析,和算法计算流程。

解:对于缓变函数我们可以用各个区间中点上函数值作来近似该区间的平均值1/2()i i f f x -≈其中。

1/211()2i i i x x x --≡+矩形法则:f(x)在区间[a,b]上的积分用矩形求积定义如下[,]1/21Na b i i I h f -==∑第i 个区间对积分的贡献为:11[,]1/2()ii i i x x x i x I f x dx hf ---=≈⎰如果围绕该区间中点的邻域内对函数f(x)作泰勒级数展开, 有1/2i x -2(3)31/21/21/21/21/21/21/2111()()()()1!2!3!i i i i i i i f x f f x x f x x f x x -------'''=+-+-+-+L 其中,和分别表示了f(x)在处的一阶,二阶和三阶导数。

相应1/2i f -'1/2i f -''(3)1/2i f -1/2i x x -=地,积分在子区间内的值可以表示为111111/21/21/221/21/2(3)31/21/21()()1!1()2!1()3!iii i i i i i ii x x x i i i x x x x i i x x i i x f x dx f dx f x x dxf x x dxf x x dx------------'=+-''+-+-+⎰⎰⎰⎰⎰L其中第一项是矩形积分的近似值,第二项则由于其中的积分等于零而消除。

从而,矩形法则在宽度为h 的单个子区间内的最高阶误差由第三项给出111[,]1/2321/21/21/2()1()2!24ii i i i i x x x i x x i i i x I f x dx hf h f x x dx f -------∆≡-''''≈-=⎰⎰在整个[a,b]区间上的总误差则通过将所有N 个子区间的贡献相加得到32[,][,]21()()()()2424ba b a b ab a b a I f x dx I h f f N ξξ--''''∆=-≈=⎰其中我们利用了Nh=(b-a),并且取为f(x)在[a,b]上的二阶导数的均值。

复化梯形复化辛普森龙贝格自适应辛普森课程设计论文

复化梯形复化辛普森龙贝格自适应辛普森课程设计论文

湖南农业大学综合设计报告综合设计五多方法求解数值积分学生姓名:学号:年级专业:指导老师:学院:评阅成绩:评阅意见:成绩评定教师签名:时间:湖南·长沙提交日期:2014年6月多方法求解数值积分具体题目要求:用不同数值方法计算积分49xdx=-⎰(1) 取不同的步长h,分别用复合梯形及复合辛普森公式计算积分,给出误差中关于h的函数,并与积分精确值比较两个公式的精度,是否存在一个最小的h,使得精度不能再被改善?(2) 用龙贝格求积计算完成问题(1);(3) 用自适应辛普森积分,使其精度达到410-。

1设计目的、要求由积分学基本理论,定积分可由Newton Leibniz-公式计算,但是对于一些无法找到原函数的函数(如2xe-等)不能通过牛顿—莱布尼兹公式计算,就必须得另寻它法。

因此需要我们能够熟练地应用常用的数值积分计算方法(如机械求积、Newton Cotes-公式等)并掌握结合数值计算软件(Matlab、Lingo 等)及计算机高级语言()c java、进行对应算法实现的技能。

熟练数学软件求解数学问题,掌握各种数学问题的求解方法。

本设计主要是通过多种复合求积公式求解积分,主要包括复化梯度法、复化辛普森法、龙贝格以及自适应辛普森法等求解方法,利用Matlab软件编写相对应的算法进行求解,大大地提高了解题的速度。

2设计原理由积分中值定理我们可以知道在积分区间[],a b内存在一点ξ,使得式子()()()baf x dx b a fξ=-⎰成立。

这个式子在于对于点ς的具体位置一般是不知道的,因此难以准确算出()fξ的值。

也就是不同算法求得平均高度()fξ,对应的就是一种不同的数值求积方法。

更一般地,我们可以在区间[],a b上适当选取某些节点k x,然后用的加权平均得到平均高度()fξ的近似值,这样构造出的求积公式具有下列形式:()()nbk k ak f x dx A f x =≈∑⎰称为机械求积公式。

常用的复化求积公式有复化梯形公式和复化辛普森公式。

常用的复化求积公式有复化梯形公式和复化辛普森公式。

)

2
k 1
f
( xk ) f
(b)
称为复化辛普森公式。
类似于复化梯形公式余项的讨论,复化辛普森公式的 求积余项为
Rs


b a h4 2880
f
(4) ( )
a,b
显然,复化辛普森公式是收敛且稳定的.
复化求积公式的余项表明,只要被积函数f(x)及所涉及 的各阶导数在[a,b]上连续,那么复化梯形公式、复化辛普
n1
求出积分值Ik,然后将它们累加求和,用 I k 作为所求积分I
的近似值。
k 0
I
b
n1
f ( x)dx
a k0ቤተ መጻሕፍቲ ባይዱ
xk1 f ( x)dx n1 h
xk
k0 2
f ( xk ) f ( xk1)

h 2

f
(
x0
)

2(
f
(
x1
)

f (x2 ) ...
森公式所得近似值 Tn , Sn , Cn 的余项和步长的关系依次 为O(h2 ) 、O(h4 )、O(h6 ) 。因此当h→0 (即n→∞)时,Tn , Sn , Cn
都收敛于积分真值,且收敛速度一个比一个快。
例1 依次用n=8的复化梯形公式、n=4的复化辛普森公式计算
I
1 sin x dx
213等份时,用复化梯形公式计算误差不超过 1 105。
2
由于Tn 的求积系数为正,由定理2知复合梯形公式是稳定的.
4.3.2 复化辛普森公式及其误差
将积分区间[a,b]划分为n等分,记子区间 xk , xk1 的中点

复化梯形公式和复化Simpson公式

复化梯形公式和复化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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;}}执行结果:。

相关文档
最新文档