变步长梯形法求积分Fortran程序
利用复化梯形公式、复化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)此法与第一种一样,只是所用的表达式不同。
fortran常用算法的程序设计举例
4
2. 梯形法
$ 10
第i个小梯形面积 :
100 f (a ih ) f (a (i 1)h) $ si h 2 200
1 read(*,*) a,b,n 求 : sin xdx 0 x=a h=(b-a)/n s=0.0 do 10 i=1,n si=(sin(x+(i-1)*h)+ sin(x+i*h))*h/2.0 s=s+si continue write(*,100) a,b,n write(*,200) s format(1x,'a=',f10.3,3x, 'b=',f10.3,3x,'n=',i4) format(1x,'s=',f15.8) end
ca 其中h a 2 h { f (a) f (b) 4[ f (a h) f (a 3h)] 2 f (a 2h)} 3
b
f ( x)dx s1 s2
7
如果将(a,b)分成四个小区间:
h a f ( x)dx 3 { f (a) f (b) 4[ f (a h) f (a 3h) f (a 5h) f (a 7h)] 2[ f (a 2h) f (a 4h) f (a 6h)} ba 其中h 2 4
17
五、计算机模拟
计算机模拟(Computer Simulation),又称 “仿真”:用计算机模仿实物系统进行测试,从 测试的结果获得期望的资料。
根据模拟对象的不同特点,可分为: 确定性模拟(Deterministic Mode); 随机性模拟(Stochastic Mode) 。
18
变步长辛卜生积分法PPT学习教案
第10页/共12页
心 得体 会
这次程序设计使我们深刻地 感受到了C++无穷的魅力,也使 我们认识到过去的我们对C++的 认识只是最初步的了解。只有去 通过一次又一次的实践努力才能 真正的驾驭他;真正的了解他; 真正的使他成为解决问题的工具。 而在这次设计中,使我感受最深 的是团体的合作是多么的重要!
第5页/共12页
实现过程
n*=2; h/=2; In=I2n; } } return I2n; } double CIntegral::Func(double x) {
if(A<=x) if(x<=B) {
第6页/共12页
实现过程
return 3/(x*x); } else { cout<<" "<<endl; }
第11页/共12页
第4页/共12页
实现过程
double temp(0.0); for(int k=0;k<=n-1;k++) { double x=a+(k+0.5)*h; temp+=Func(x); } T2n=(Tn+h*temp)/2.0; I2n=(4.0*T2n-Tn)/3.0; if(fabs(I2n-In)<eps) done=1; else { Tn=T2n;
double Simpson(double a,double b,double eps); double Func(double x); private: double A,B; }; double CIntegral::Func(double x); double CIntegral::Simpson(double
复化梯形法 复化矩形法 变步长梯形 变步长辛普森
陕西科技大学机械教改班用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.复化梯形法方法和复化矩形法类似,只是把原来的矩形小面积变成了梯形小面积,但是精确度明显提高了,也就是说达到同样的精度需要的时间少了。
(完整word版)《数值分析》matlab实验报告-梯形、辛普森求积公式
东莞理工学院《数值分析》实验报告实验名称:牛顿插值法系别:计算机学院专业:2013级信息与计算科学班级:1班姓名:学号:实验日期:1、实验内容用不同数值方法计算积分104ln 9x xdx =-⎰。
2、算法说明 梯形求积公式算法:将积分区间[,]a b 划分为n 等份,步长b ah n-=分点为 ,1,2,...,k x a kh k n =+=。
积分10()2nk k k h I x x +==+∑。
辛普森求积公式算法:5(4)012()(4)()390xx h h f x dx y y y f c =++-⎰其中h 为步长。
3、Matlab 软件程序清单梯形求积公式TiXing_quad(a,b,h):function t = TiXing_quad(a,b,h) %a 为积分下界,b 为积分上界,h 为步长。
format long x = a:h:b;y = sqrt(x).*log(x); y(1) = 0;t = 0;for k=1:(b-a)/h,t=t+y(k)+y(k+1);endt=t*h/2;辛普森求积公式Sinpson_quad(a,b,h):function s=Sinpson_quad(a,b,h)format longx=a:h:b;y=sqrt(x).*log(x);z=sqrt(x+h/2).*log(x+h/2);y(1)=0;s=0;for k=1:(b-a)/h,s=s+y(k)+y(k+1)+4*z(k);ends=s*h./6;4、运行结果真值I=-4/9=-0.444444444444444次数I(梯形公式)I(辛普森公式)50 -0.441090226387332 -0.443793798301150100 -0.443117905322695 -0.444194********* 200 -0.443925359444891 -0.4443490454521025、分析与思考“”“”At the end, Xiao Bian gives you a passage. Minand once said, "people who learn to learn are very happy people.". In every wonderful life, learning is an eternal theme. As a professional clerical and teaching position, I understand the importance of continuous learning, "life is diligent, nothing can be gained", only continuous learning can achieve better self. Only by constantly learning and mastering the latest relevant knowledge, can employees from all walks of life keep up with the pace of enterprise development and innovate to meet the needs of the market. This document is also edited by my studio professionals, there may be errors in the document, if there are errors, please correct, thank you!。
变步长梯形公式(C语言)
变步长梯形公式(C语言)程序:// cehngxu.cpp : 定义控制台应用程序的入口点。
//#include"stdafx.h"#include"stdio.h"#include"math.h"double f(double x) //这里自定义了函数,因为出现sin(0)/0的情况,系统无法计算;{double y;if (x == 0)y = 1; //把x=0作为一种情况,单独拿出来;elsey = sin(x) / x; //正常情况下的函数;return(y);} //编写这个自定义函数便于你在作业中的计算,对于不用的题目只需改动一下函数即可计算;void main() //主函数;{double a , b ,h,k,s,t[4998]; //数组的定义中不能出现变量,故对其任意取值,一般取一个很大的数;int n = 1, m = 0;printf("please input a=");scanf_s("%lf", &a); //在VC环境下用scanf输入没有问题,但是在我这编译环境visual studio 2013下需要用scanf_s()输入;printf("please input b=");scanf_s("%lf", &b);t[1] = (b - a)*(f(a) + f(b)) / 2;do{h = (b - a) / n;s = 0;for (k = 0; k < n; k++){s += f(a + (k + 0.5)*h);}t[2 * n] = t[n] / 2 + h / 2 * s; //梯形的递推公式n = 2*n;m = m + 1;}while (fabs(t[n]- t[n/2]) >= 0.0000001);printf("\n计算次数=%d",m);printf("\n计算结果=%.7lf", t[n]);printf("\n误差为=%.10lf", fabs(t[n] - t[n / 2]));}新加入的程序部分我做了批注,你应该能看懂,整个程序变化不大,主要是把下标我给你改成了数组,这样看起来比较直观,不容易迷糊。
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公式可以更准确地近似计算定积分的值。
编写程序来实现数据积分中的梯形积分法
梯形积分法是数值积分中常用的一种方法,它通过将积分区间分成若干小份,然后在每个小份上应用梯形面积的公式来逼近积分的真实值。
该方法在工程和科学领域中经常被使用,因为它相对简单并且能够得到较为准确的结果。
编写程序来实现梯形积分法是一项具有挑战性但又十分有意义的任务。
本文将通过介绍梯形积分法的原理和算法,以及具体的程序编写过程,帮助读者深入理解该方法,并掌握编写程序的技巧。
一、梯形积分法的原理和算法在介绍如何编写程序来实现梯形积分法之前,让我们先来了解一下该方法的原理和算法。
1. 原理梯形积分法的基本思想是将积分区间[a, b]分成n个小份,然后用每个小份上的梯形面积来逼近积分的真实值。
具体来说,对于每个小份[xi-1, xi],可以使用以下公式来计算其梯形面积:\[ S_i = \frac{f(x_{i-1}) + f(x_i)}{2} * (x_i - x_{i-1}) \]其中,f(x)是被积函数,xi-1和xi分别是小份的左右端点。
将所有小份的梯形面积相加,即可得到整个积分区间的近似值:\[ \int_a^b f(x) dx \approx \sum_{i=1}^n S_i \]2. 算法基于上述原理,我们可以总结出梯形积分法的基本算法步骤:(1)将积分区间[a, b]分成n个小份,即确定小份的个数n和每个小份的长度h。
(2)计算每个小份上的梯形面积Si。
(3)将所有小份的梯形面积相加,得到近似积分的值。
以上就是梯形积分法的原理和算法,接下来我们将介绍如何将其转化为程序代码,以便实现自动化计算。
二、编写程序实现梯形积分法为了编写程序来实现梯形积分法,我们可以选择使用Python语言,因为Python具有简洁易读的特点,非常适合用来实现数值计算方法。
下面以Python为例,介绍编写程序的具体步骤。
1. 导入必要的库我们需要导入Python中的数学库math,以便使用其中的数学函数。
具体的代码如下所示:```pythonimport math```2. 编写梯形积分法函数接下来,我们可以编写一个函数,来实现梯形积分法的算法。
高校(理工类)数学变步长的梯形法则教学(课堂讲义)
1 (Tn (h) 2 H n (h)) 3 h 1 h h 所以S 2 n ( ) (T2 n ( ) 2 H 2 n ( )) 2 3 2 2
变步长Simpson求积公 式
程序实现的基本思想: Tn (h) H n (h) S n (h) h h h T2 n ( ) H 2 n ( ) S 2 n ( ) 2 2 2 h h 当 S 2 n ( ) S n (h) 时,取S 2 n ( )为 2 2 定积分的近似值,否则 将分点加密一倍, 重复上述过程。
[例2]
11 1 1 1 I S 5 ( h) [( ) 2 ( 6 5 1 0 11 1 0.2 1 1 1 1 )] 1 0.4 1 0.6 1 0.8 1 1 1 1 1 1 1 1 1 ( 2 ( )) 30 2 1.2 1.4 1.6 1.8 2 0.69315 24 ( 4) 因为 f ( x) 24 5 1 x
变步长Simpson求积算 法
1.输入a, b, , M ; 2. 计算Tn (h), H n (h), S n (h) h( f (a) f (b)) (1) n 1; h b a; T1 ; 2 ab 1 (2) H n hf ( ); S1 (T1 2 H n ); 2 3 h h h 3. 计算T2 n ( ), H 2 n ( ), S 2 n ( ) 2 2 2 1 h (1) T2 (T1 H n ); n 2n; h ; 2 2 n 1 1 (2) H n h f (a ( j )h); S 2 (T2 H n ); 2 3 j 1
复化梯形公式和变步长法的比较
复化梯形法 变步长法
变步长梯形求积法计算定积分(word文档良心出品)
变步长梯形求积法计算定积分1.原理:变步长求积法的思想是利用若干小梯形的面积代替原方程的积分,当精度达不到要求时,可以通过增加点数对已有的区间再次划分,达到所需精度时即可;其中由于新的式子中有原来n点中的部分项主要公式:T2n=T n/2+(h/2)*Σf(x k+0.5);2.源程序如下:#include"math.h"#include"iostream.h"double f(double x){double s;s=log(x*x);return(s);}double ffts(double a,double b,double eps){int n,k;double fa,fb,h,t1,p,s,x,t;fa=f(a);fb=f(b);n=1;h=b-a;t1=h*(fa+fb)/2;p=eps+1;while(p>=eps){s=0;for(k=0;k<=n-1;k++){x=a+(k+0.5)*h;s=s+f(x);}t=t1/2+h*s/2;p=fabs(t1-t);cout<<"步长n为:"<<n<<"时的"<<"Tn="<<t1<<'\t'<<"T2n="<<t<<'\t'<<"误差变化:"<<p<<endl;t1=t;n=n*2;h=h/2;}return(t);}void main(){double result,a,b,eps;cout<<"需要求解的积分式为f(x)=log(x^2)"<<endl;cout<<"输入边界值a="<<'\t';cin>>a;cout<<"输入边界值b="<<'\t';cin>>b;cout<<"输入误差限"<<'\t';cin>>eps;result=ffts(a,b,eps);cout<<"经过变步长梯形求积法得方程结果为:"<<result<<endl;}3.运行结果:根据程序提示依次输入积分上限和积分下限,然后输入误差限;本程序需要预先在程序中输入需要积分方程的表达式。
变步长梯形求积法计算定积分
变步长梯形求积法计算定积分1.原理:变步长求积法的思想是利用若干小梯形的面积代替原方程的积分,当精度达不到要求时,可以通过增加点数对已有的区间再次划分,达到所需精度时即可;其中由于新的式子中有原来n点中的部分项主要公式:T2n=T n/2+(h/2)*Σf(x k+0.5);2.源程序如下:#include"math.h"#include"iostream.h"double f(double x){double s;s=log(x*x);return(s);}double ffts(double a,double b,double eps){int n,k;double fa,fb,h,t1,p,s,x,t;fa=f(a);fb=f(b);n=1;h=b-a;t1=h*(fa+fb)/2;p=eps+1;while(p>=eps){s=0;for(k=0;k<=n-1;k++){x=a+(k+0.5)*h;s=s+f(x);}t=t1/2+h*s/2;p=fabs(t1-t);cout<<"步长n为:"<<n<<"时的"<<"Tn="<<t1<<'\t'<<"T2n="<<t<<'\t'<<"误差变化:"<<p<<endl;t1=t;n=n*2;h=h/2;}return(t);}void main(){double result,a,b,eps;cout<<"需要求解的积分式为f(x)=log(x^2)"<<endl;cout<<"输入边界值a="<<'\t';cin>>a;cout<<"输入边界值b="<<'\t';cin>>b;cout<<"输入误差限"<<'\t';cin>>eps;result=ffts(a,b,eps);cout<<"经过变步长梯形求积法得方程结果为:"<<result<<endl;}3.运行结果:根据程序提示依次输入积分上限和积分下限,然后输入误差限;本程序需要预先在程序中输入需要积分方程的表达式。
第三章 第四节 变步长积分法
一、引言
变步长积分法
二、以梯形公式为例来介绍这一算法
一、引言
利用复化梯形公式和复化Simpson公式来进行定积 分的近似计算既简便, 又可以达到满意的计算精度。
但是为了确定把积分区间 a, b 分成多少个子区间,即 n
取多大, 则需依据误差表达式作事先估计, 就要Байду номын сангаас析
被积函数的高阶导数,而这是很困难的。
S2n Sn
(4.4)
来控制计算过程。
2n
k 0
f k f x dx
b a
则得到
I Tn 4 I T2 n
I T2 n
1 T2 n Tn 3
(4.3)
这说明,若用不等式(4.1)来控制计算过程。则 T2n 与积 分精确值之差大约是允许误差的三分之一,因此计算可 以至此为止。误差的这种估计法称为后天估计(或事后 估计)。 对于 Simpson 公式, 也可以同样进行区间逐次分 半,并可由不等式
T n
1 ba T E2 n f I T2 n 12 2n
3 2 n 1 k 0
f
k
将两式相除并注意当 n 充分大时
b a n 1
n
f
k 0 k
b
a
f x dx
b a 2 n 1
T2n Tn
(取绝对误差)
(4.1)
T2 n Tn T2 n
(取相对误差)
(4.2)
是否满足,如果满足,则取 T2n 为所求定积分之近似 值,否则区间继续分半,重复上述过程直至条件满足。
现在我们来分析为什么可以通过(4.1)式来控制 计算过程。由(3.2)式可知
变步长的梯形积分方法的应用
CENTRAL SOUTH UNIVERSITY 数值分析实验报告变步长的梯形积分方法的应用一、问题背景实际问题当中常常需要计算积分,有些数值方法,如微分方程和积分方程的求解,也都和积分计算相关联。
依据人们所熟知的微积分基本定理,对于积分()dx x f I a ⎰=b, 只要找到被积分函数()x f 的原函数()x F ,便有下列牛顿-莱布尼茨(Newton-Leibniz )公式:()()()a F b F dx x f b-=⎰a . 但实际使用这种求积分方法往往有困难,因为大量的被积函数,诸如()0sin ≠x xx ,2x e -等,其原函数不能用初等函数表达,故不能用上述公式计算。
即使能求得原函数的积分,有时计算也十分困难。
例如对于被积函数()611x x f +=,其原函数 ()C x x x x x x x x F ++-+++⎪⎭⎫ ⎝⎛-+=1313ln 3411arctan 61arctan 3122, 计算()a F ,()b F 仍然很困难,另外,当()x f 是由测量或数值计算给出的一张数据表时,牛顿-莱布尼茨公式也不能直接运用。
因此有必要研究积分的数值计算问题。
二、数学模型由于牛顿-科特斯积分公式在8≥n 时不具有稳定性,故不能通过提高阶数的方法来提高求积精度。
为了提高精度通常可以把积分区间划分成若干的子区间(通常是等分),再在每个子区间上用低阶求积公式。
这种方法称为复合求积法。
复合梯形法虽然方法简单,但是却不能估计积分精度,这有时候是很不方便的。
要想控制积分精度,可以采用如下的方法,设积分区间已经划分为n 个子区间,这时再把区间划分更细,给出新的积分结果,如果前后两次积分的差比给定的误差容限小的话,则停止细华否则继续增加积分区间。
这种方法原理很简单也 容易实现,但是实际计算中一般采用的比较少,因为这种方法比较机械效率不是太高,实际上采用比较多的通常是Romberg 方法。