matlab实现复化梯形公式,复化simpson公式以及romberg积分

合集下载

MATLAB数值分析实验二(复合梯形、辛普森和龙贝格求积,以及二重积分计算等)

MATLAB数值分析实验二(复合梯形、辛普森和龙贝格求积,以及二重积分计算等)

佛山科学技术学院实验报告课程名称_______________ 数值分析________________________实验项目_______________ 数值积分____________________专业班级机械工程姓名余红杰学号2111505010 指导教师陈剑成绩日期月日一、实验目的b1、理解如何在计算机上使用数值方法计算定积分 a f ""X的近似值;2、学会复合梯形、复合Simpson和龙贝格求积分公式的编程与应用。

3、探索二重积分.11 f (x, y)dxdy在矩形区域D = {( x, y) | a _ x _ b, c _ y _ d}的数值D积分方法。

二、实验要求(1)按照题目要求完成实验内容;(2)写出相应的Matlab程序;(3)给出实验结果(可以用表格展示实验结果);(4)分析和讨论实验结果并提出可能的优化实验。

(5)写出实验报告。

三、实验步骤1、用不同数值方法计算积xln xdx =-- 0 9(1)取不同的步长h,分别用复合梯形及复合辛普森求积计算积分,给出误差中关于h的函数,并与积分精确值比较两公式的精度。

(2)用龙贝格求积计算完成问题(1 )。

2、给出一种求矩形区域上二重积分的复化求积方法,然后计算二重积分..e"y dxdy,其中积分区域D二{0乞x岂1,0岂y乞1}。

1.%lnt_t.m复化梯形:function F = Int_t(x1,x2,n)%复化梯形求积公式% x1,x2为积分起点和中点%分为n个区间,没选用步长可以防止区间数为非整数。

%样点矩阵及其函数值:x = lin space(x1,x2 ,n+1);y = f(x);m = len gth(x);%本题中用Matlab计算端点位置函数值为NaN,故化为零: y(1) = 0;y(m) = 0;%算岀区间长度,步长h:h = (x2 -x1)/n;a = [1 2*o nes(1,m-2) 1];%计算估计的积分值:F = h/2*sum(a.*y);%f.mfun cti on y = f(x)y = sqrt(x).*log(x);%run 11.mclc,clear;%分为10个区间,步长0.1的积分值:F = In t_t(0,1,10);F10 = F%分为100个区间F = In t_t(0,1,100);F100 = F%误差计算W10 = abs((-4/9)-F10);W100 = abs((-4/9)-F100);W = [W10 W100]%复化辛普森:%l nt_s.mfun cti on F = In t_s(x1,x2 ,n)%复化梯形求积公式% x1,x2区间,分为n个区间。

复化梯形公式和simpsion公式

复化梯形公式和simpsion公式

¸´»¯ÌÝÐι«Ê½#include <stdio.h>#include <math.h>#define e 1e-5#define a 0 //»ý·ÖÏÂÏÞa#define b 1 //»ý·ÖÉÏÏÞb#define f(x) (4/(1+(x*x))) //±»»ýº¯Êýf(x)int main(){int i,n;double h,t0,t,g;n=1; //¸³³õÖµh=(double)(b-a)/2;t=h*(f(a)+f(b));do{t0=t;g=0;for (i=1;i<=n;i++)g+=f((a+(2*i-1)*h));t=(t0/2)+(h*g); //¸´»¯ÌÝÐι«Ê½n*=2;h/=2;}while (fabs(t-t0)>e); //×Ô¶¨ÒåÎó²îÏÞeprintf("%.8lf",t); //Êä³ö»ý·ÖµÄ½üËÆÖµreturn 0;}3)RombergÇó»ý·¨£º#include <stdio.h>#include <math.h>#define e 1e-5#define a 0 //»ý·ÖÏÂÏÞa#define b 1 //»ý·ÖÉÏÏÞb#define f(x) (4/(1+(x*x))) //±»»ýº¯Êýf(x) double t[100][100];int main(){int n,k,i,m;double h,g,p;h=(double)(b-a)/2;t[0][0]=h*(f(a)+f(b));k=1;n=1;do //RombergËã·¨{g=0;for (i=1;i<=n;i++)g+=f((a+((2*i-1)*h)));t[k][0]=(t[k-1][0]/2)+(h*g);for (m=1;m<=k;m++){p=pow(4,(double)(m));t[k-m][m]=(p*t[k-m+1][m-1]-t[k-m][m-1])/(p-1);}m-=1;h/=2;n*=2;k+=1;}while (fabs(t[0][m]-t[0][m-1])>e); //×Ô¶¨ÒåÎó²îÏÞeprintf("%.8lf",t[0][m]);return 0;}ÌÝÐι«Ê½ÓëSimpson¹«Ê½Çó»ý·Ö·¨µÄC++³ÌÐò2008Äê11ÔÂ13ÈÕ ÐÇÆÚËÄ 21:09#include<iostream>#include<cassert>#include <iostream>#include<cmath>using namespace std;const double PI=3.1415926;double tixingjifen(double (*f)(double),double a,double b,int n); double Simpson(double (*f)(double),double a,double b,int n);double f(double x){return 3.0*x*x+5.0*x-1.0;}double g(double x){return PI*pow(1.0+pow(x/2.0,2),2);}int main(){cout<<tixingjifen(g,0.0,2.0,4)<<endl;cout<<Simpson(g,0.0,2.0,4)<<endl;system("pause");return 0;}double tixingjifen(double (*f)(double),double a,double b,int n) {double dn=(double)n;double h=(b-a)/dn;double sum=0.0;double x=a+h;for(int i=1;i<n;++i){sum=sum+f(x);x=x+h;}sum=sum*2.0;sum=sum+f(a)+f(b);sum=sum*h/2.0;return sum;}double Simpson(double (*f)(double),double a,double b,int n) {double dn=(double)n;double h=(b-a)/dn;double result=0.0;double sum=0.0;int i;for(i=1;i<=n;++i)sum=sum+f(a+(2.0*(double)i-1.0)*h/2.0);result=result+4.0*sum;sum=0.0;for(i=1;i<=(n-1);++i)sum=sum+f(a+h*(double)i);result=result+2.0*sum;result=result+f(a)+f(b);result=result*h/6.0;return result;}。

用matlab实现romberg积分法

用matlab实现romberg积分法

一、概述在数值分析中,求解定积分是一项重要的任务。

传统的数值积分方法包括梯形法则、辛普森法则等。

而Romberg积分法,是一种更加精确的数值积分方法,它通过不断增加区间的细分,逐步提高数值积分的精度。

在本文中,我们将尝试用MATLAB实现Romberg积分法,探索其优势和应用。

二、Romberg积分法原理Romberg积分法的基本原理是通过对梯形法则和辛普森法则进行逐步的细分和修正,以获得更加精确的数值积分结果。

假设我们需要求解函数 f(x) 在区间 [a, b] 上的定积分,那么Romberg积分法的步骤可以概括为以下几点:1. 将区间 [a, b] 均匀分成若干个子区间;2. 计算每个子区间上的梯形规则和辛普森规则的数值积分;3. 利用已知结果进行Richardson外推,修正数值积分的误差;4. 逐步增加子区间的细分,直到达到所需的精度要求。

三、MATLAB实现Romberg积分法我们可以使用MATLAB编程语言来实现Romberg积分法,以下是一个示例代码:function [I, R] = romberg(f, a, b, n)h = (b - a) ./ (2 .^ (0:n-1));R = zeros(n, n);R(1, 1) = (b - a) * (feval(f, a) + feval(f, b)) / 2;for j = 2:nsubtotal = 0;for i = 1:2^(j-2)subtotal = subtotal + feval(f, a + (2*i - 1) * h(j));endR(j, 1) = R(j-1, 1)/2 + h(j) * subtotal;endfor k = 2:nfor j = k:nR(j, k) = (4^(k-1) * R(j, k-1) - R(j-1, k-1)) / (4^(k-1) - 1); endendI = R(n, n);通过以上的MATLAB代码,我们可以轻松地实现Romberg积分法,对给定的函数和区间进行数值积分,并得到精确的积分结果。

用复合梯形公式和复合辛普森公式求函数积分

用复合梯形公式和复合辛普森公式求函数积分
附录一:
《数值分析》实验报告(模板)
学号********班级信科121姓名张凯茜
【实验课题】用复合梯形公式和复合辛普森公式求函数积分
【实验目标】
1.掌握复合梯形公式与复合辛普森公式的基本思想。掌握常用的数值积分方法(特别是梯形法、Simpson方法、Cotes公式、Romberg算法以及Gauss求积公式)的原理。
【附程序】
复合梯形公式
functionT=comptra(a,b,tol)
h=b-a;
k=0;
T=((f(a)+f(b))*h)/2;
P=T+1;
whileabs(P-T)>tol
P=T;
m=0; h=h/2;
fori=1:2^k
m=m+f(a+(2*i-1)*h);
end
T=0.5*P+m*h; k=k+1;
2.学会用matlab编程实现用复合梯形公式与复合辛普森公式求积分。
3.熟悉matlab软件的使用,通过实验体会常用数值积分方法的逐步精致化过程。
【理论概述与算法描述】
1.根据梯形公式 ,将区间【a,b】划分为n等份,分点x(k)=a+kh,h=(b-a)/n,k=0,1,2,3,……,在每个区间【x(k),x(k+1)】(k=0,1,2……n-1)上采用梯形公式,得
end
复合辛普森公式
functionS=comsinp(a,b,tol)
h=b-a;
k=1;
S=((f(a)+f(b)+4*f((a+b)/2))*h)/6;
P=S;
whileabs(P-S)>tol
P=S;

matlab复化Simpson求积公式计算数值积分

matlab复化Simpson求积公式计算数值积分

,(k 0,1,...,n)k x a kh =+=b a h n-=2221222121(x)dx (x)dx [(x )4(x )(x )]3k k m a x b x k m k k k k f f h f f f -=--=≈≈++∑⎰⎰∑复化Simpson 求积公式计算数值积分一·复化Simpson 求积公式的数学理论如果用分段二次插值函数近似被积函数,即在小区间上用Simpson 公式计算积分近似值,就可导出复化Simpson 公式。

二·复化Simpson 求积公式的算法和流程图将积分区间[a,b]分成n=2m 等分,分点为,在每个小区间[222,x k k x -](k=0,1,…,n-1)上。

用Simpson 公式求积分,则有2222222221222212(x)dx [(x )4(x )(x )]6[(x )4(x )(x )]3kk x k k k k k x k k k x x f f f f h f f f -------≈++=++⎰求和得整理后得到122111(x)dx [(a)(b)2(x )4(x )]3m m bk k a k k h f f f f f --==≈+++∑∑⎰ (5-21)式(5-21)称为复化Simpson 公式。

如果(4)(x)[a,b]f c ∈,则由Simpson 插值余项公式可得复化公式的截断误差为1221115(4)2221()(x)dx [(a)(b)2(x )4(x )]3(2h)()[x ,x ]2880m m bS k k a k k mk k k h R f f f f f f ξξ--==-==-+++=-∈∑∑⎰∑因为(4)f x 为连续,故存在[a,b]ξ∈,使得(4)(4)11()()m k k f f m ξξ==∑代入上式得5(4)4(4)1(2h)()()()(a,b)2880180m s k b a R f mf h f ξξξ=-=-=-∈∑ (5-22)式(5-22)表明,步长h 越小,截断误差越小。

复合梯形公式、复合辛普森公式matlab

复合梯形公式、复合辛普森公式matlab

复合梯形公式、复合⾟普森公式matlab 1. ⽤1阶⾄4阶Newton-Cotes公式计算积分程序:function I = NewtonCotes(f,a,b,type)%syms t;t=findsym(sym(f));I=0;switch typecase 1,I=((b-a)/2)*(subs(sym(f),t,a)+subs(sym(f),t,b));case 2,I=((b-a)/6)*(subs(sym(f),t,a)+4*subs(sym(f),t,(a+b)/2)+...subs(sym(f),t,b));case 3,I=((b-a)/8)*(subs(sym(f),t,a)+3*subs(sym(f),t,(2*a+b)/3)+...3*subs(sym(f),t,(a+2*b)/3)+subs(sym(f),t,b));case 4,I=((b-a)/90)*(7*subs(sym(f),t,a)+...32*subs(sym(f),t,(3*a+b)/4)+...12*subs(sym(f),t,(a+b)/2)+...32*subs(sym(f),t,(a+3*b)/4)+7*subs(sym(f),t,b));case 5,I=((b-a)/288)*(19*subs(sym(f),t,a)+...75*subs(sym(f),t,(4*a+b)/5)+...50*subs(sym(f),t,(3*a+2*b)/5)+...50*subs(sym(f),t,(2*a+3*b)/5)+...75*subs(sym(f),t,(a+4*b)/5)+19*subs(sym(f),t,b));case 6,I=((b-a)/840)*(41*subs(sym(f),t,a)+...216*subs(sym(f),t,(5*a+b)/6)+...27*subs(sym(f),t,(2*a+b)/3)+...272*subs(sym(f),t,(a+b)/2)+...27*subs(sym(f),t,(a+2*b)/3)+...216*subs(sym(f),t,(a+5*b)/6)+...41*subs(sym(f),t,b));case 7,I=((b-a)/17280)*(751*subs(sym(f),t,a)+...3577*subs(sym(f),t,(6*a+b)/7)+...1323*subs(sym(f),t,(5*a+2*b)/7)+...2989*subs(sym(f),t,(3*a+4*b)/7)+...1323*subs(sym(f),t,(2*a+5*b)/7)+...3577*subs(sym(f),t,(a+6*b)/7)+751*subs(sym(f),t,b));endsyms xf=exp(-x).*sin(x);a=0;b=2*pi;I = NewtonCotes(f,a,b,1)N=1:I =N=2:I =N=3:I =(pi*((3*3^(1/2)*exp(-(2*pi)/3))/2 - (3*3^(1/2)*exp(-(4*pi)/3))/2))/4N=4:I =(pi*(32*exp(-pi/2) - 32*exp(-(3*pi)/2)))/452. 已知,因此可以通过数值积分计算的近似值。

数值分析 matlab 实验4

数值分析 matlab 实验4

(1) 解题过程如下:(1)MATLAB中创建复化梯形公式和复化辛普森公式的 M 文件:1)复化梯形公式文件:function s=T_fuhua(f,a,b,n)h=(b-a)/n;s=0;for k=1:(n-1)x=a+h*k;s=s+feval(f,x);ends=h*(feval(f,a)+feval(f,b))/2+h*s;2)复化辛普森公式文件:function s=S_fuhua(f,a,b,n)h=0;h=(b-a)./(2*n);s1=0;-5-s2=0;for k=1:n-1x=a+h*2*k;s1=s1+feval(f,x);endfor k=1:nx=a+h*(2*k-1);s2=s2+feval(f,x);ends=h*(feval(f,a)+feval(f,b)+s1*2+s2*4)/3;在MATLAB中输入:f=inline('x/(4+x^2)');a=0;b=1;%inline 构造内联函数对象for n=2:10s(n-1)=T_fuhua(f,a,b,n);s(n-1)=vpa(s(n-1),10);%调用复化梯形公式,生成任意精度的数值endexact=int('x/(4+x^2)',0,1);exact=vpa(exact,10)%求出积分的精确值输出结果:exact =.1115717755s =Columns 1 through 60.1088 0.1104 0.1109 0.1111 0.1113 0.1114Columns 7 through 90.1114 0.1114 0.1115在MATLAB中输入以下函数用以画出计算误差与 n 之间的曲线:r=abs(exact-s);n=2:10;plot(double(n),double(r(n-1)))得到结果如图所示:(2)在 MATLAB中输入以下程序代码:f=inline('x/(4+x^2)');a=0;b=1;n=9;%inline 构造内联函数对象t=T_fuhua(f,a,b,n);t=vpa(t,10)s=S_fuhua(f,a,b,n);s=vpa(s,10)%调用复化梯形和复化辛普森公式,生成任意精度的数值exact=int('x/(4+x^2)',0,1);exact=vpa(exact,10)%求出积分的精确值计算结果:t =.1114379370s =.1115717991exact =.1115717755E1=|t-exact|=0.0001338385E2=|s-exact|=0.0000000236所以,两种方法计算所得的绝对误差:E1>E2(1)中的两个结果 s 与t,两个函数的计算量基本相同,但是精度却有很大差别:与精确值exact =.1115717755比较,复化梯形公式的结果t =.1114379370 只有三位有效数字,而复化辛普森公式的结果 s =.1115717991 却有七位有效数字。

matlab实现复化梯形公式,复化simpson公式以及romberg积分

matlab实现复化梯形公式,复化simpson公式以及romberg积分

(一) 实验目的熟悉并掌握数值积分的方法,重要训练复化梯形公式,复化simps on 公式以及 romberg 积分。

问题三数值积分椭圆周长的计算。

考虑椭圆其周长,只要计算其第一象限的长度即可.用参数方程可以表示为X acost (0 t /2), y bs int计算公式为.a 2 sin 21 b 2 cos 2 tdt0 为计算方便,我们可以令a 1,即计算下面的积分0 Ja 2sin 2t~ t a 0 <si n 2t (b )2cos 2 tdt 可以归结为上面的形式)采用复化梯形公式,复化Simpson 公式以及Romberg 积分的方法 计算积分I (b )「J 1 (b 2 1)cos 2tdt给出通用程序,该通用程序可以计算任何一个函数在任意一个区 间在给定的精度下的数值积分。

程序输出为计算出的数值积分值以及 计算函数值的次数。

(三)算法介绍首先利用给出的各迭代公式,设计程序。

在matlab 对话框中输入要计算的函数,给出区间和精度。

问题描述b 2 1,为计算 sin 21 2 2 b cos tdt复化梯形的迭代公式为:J b f (x) dx 二h/2 f(已)+ 2X°二+ f (b);章L. J * ' 』,复化simps on迭代公式为:J;f (x)dx 二h/3p(a) + 辽負1(x2j) + 4斗g〔fgj - i) + f (b)Romberg迭代公式为:削」- 1 h - 1. j - 1n _ n(四)程序对于复化梯形公式和复化simpson公式,我们放在中(転记后的程序可用来把b看为变量时的算法实现) %复化梯形公式function y=jifenn(f,n,a,b) (说明:f表示任一函数,n精度,a, b为区间)fi=f(a)+f(b);h=(b-a)/n;d=1;%fun cti on f=jife n(n ,a,b,c)%syms t%y=sqrt(1+(c A2-1)*cos(t)A2);%ya=subs(y,t,a);%yb=subs(y,t,b);%fi=ya+yb;for i=1:n-1x=a+i*h;fi=fi+2*f(x);d=d+1;%yx=subs(y,t,x);%fi=fi+2*yx;endf4=h/2*fi,d%复化simposon公式f仁0;f2=0;dd=1;for i=1:n-1dd=dd+1;if rem(i,2)~=0;x1=a+i*h; f1=f1+f(x1);else rem(i,2)==0; x2=a+i*h; f2=f2+f(x2) ;endendf3=(h/3)*(f(a)+4*f1+2*f2+f(b)),dd对于romberg积分,建立文件。

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

(一) 实验目的
熟悉并掌握数值积分的方法,重要训练复化梯形公式,复化simpson 公式以及romberg 积分。

(二) 问题描述
问题三数值积分椭圆周长的计算。

考虑椭圆22221x y a b
+=,为计算其周长,只要计算其第一象限的长度即可.
用参数方程可以表示为cos (0/2)sin x a t t y b t π=⎧≤≤⎨=⎩
,
计算公式为/0π⎰
为计算方便,我们可以令1a =,即计算下面的积分
/
0π⎰/0π=⎰
(/0π⎰/0a π=⎰可以归结为上面的形式)
采用复化梯形公式,复化Simpson 公式以及Romberg 积分的方法计算积分
/
0()I b π=⎰
给出通用程序,该通用程序可以计算任何一个函数在任意一个区间在给定的精度下的数值积分。

程序输出为计算出的数值积分值以及计算函数值的次数。

(三) 算法介绍
首先利用给出的各迭代公式,设计程序。

在matlab 对话框中输入要计算的函数,给出区间和精度。

复化梯形的迭代公式为:
∫f(x)dx b a =h/2[f (a )+2∑f(x j )n−1j=1+f(b)];
复化simpson 迭代公式为:
∫f(x)dx b a =h/3[f (a )+2∑f(x 2j )(n 2)−1j=1+4∑f(x 2j−1)(n 2
)j=1+f(b)]; Romberg 迭代公式为:
R k,j =R k,j−1+R k,j−1—R k−1,j−1
4j−1−1。

(四) 程序
对于复化梯形公式和复化simpson 公式,我们放在jifenn.m 中。

(%标记后的程序可用来把b 看为变量时的算法实现)
%复化梯形公式
function y=jifenn(f,n,a,b) (说明:f 表示任一函数,n 精度,a ,b 为区间) fi=f(a)+f(b);
h=(b-a)/n;
d=1;
%function f=jifen(n,a,b,c)
%syms t
%y=sqrt(1+(c^2-1)*cos(t)^2);
%ya=subs(y,t,a);
%yb=subs(y,t,b);
%fi=ya+yb;
for i=1:n-1
x=a+i*h;
fi=fi+2*f(x);
d=d+1;
%yx=subs(y,t,x);
%fi=fi+2*yx;
end
f4=h/2*fi,d
%复化simposon 公式
f1=0;
f2=0;
dd=1;
for i=1:n-1
dd=dd+1;
if rem(i,2)~=0;
x1=a+i*h;
f1=f1+f(x1);
else rem(i,2)==0;
x2=a+i*h;
f2=f2+f(x2) ;
end
end
f3=(h/3)*(f(a)+4*f1+2*f2+f(b)),dd
对于romberg积分,建立romberg.m文件。

function y=romberg(f,n,a,b) (说明:f表示任一函数,n精度,a,b为区间)z=zeros(n,n);
h=b-a;
z(1,1)=(h/2)*(f(a)+f(b));
f1=0;
for i=2:n
for k=1:2^(i-2)
f1=f1+f(a+(k-0.5)*h);
end
z(i,1)=0.5*z(i-1,1)+0.5*h*f1;
h=h/2;
f1=0;
for j=2:i
z(i,j)=z(i,j-1)+(z(i,j-1)-z(i-1,j-1))/(4^(j-1)-1);
end
end
z,n
(五)运行结果
对于复化梯形公式和复化simpson公式,我们运行下列语句并得到结果:
>> fun=inline('sqrt(1+(0.5^2-1).*cos(t).^2)');
>> jifenn(fun,8,0,pi/2)
f4 =
1.2111
d =
8
f3 =
1.2111
dd =
8
>> 1.2111*4
ans =
4.8444
>> 1.2111*4
ans =
4.8444
(说明:在本题中将椭圆中的未知量a取为1,b取为0.5。

f4为复化梯形公式得到的椭圆周长,f3为复化simpson公式得到的椭圆周长)。

对于romberg,运行下列语句并最终得到结果为:
>> fun=inline('sqrt(1+(0.5^2-1).*cos(t).^2)');
>> romberg(fun,8,0,pi/0.5)
z =
3.1416 0 0 0 0 0 0 0
3.1416 3.1416 0 0 0 0 0 0
4.7124
5.2360 5.3756 0 0 0 0 0 4.8398 4.8823 4.8587 4.8505 0 0 0 0 4.8442 4.8457 4.8432 4.8430 4.8429 0 0 0 4.8442 4.8442 4.8441 4.8441 4.8442 4.8442 0 0 4.8442 4.8442 4.8442 4.8442 4.8442 4.8442 4.8442 0 4.8442 4.8442 4.8442 4.8442 4.8442 4.8442 4.8442 4.8442
ans =
4.8442
n =
8
(说明:其中最终结果为4.8442)。

(六)结果分析
我们计算了当椭圆长轴为1,短轴为0.5时的周长。

通过上述三种方法的计算可以看到,结果相差不大。

根据椭圆周长的一个计算公式L=2πa(长轴)+4(b−a)我们可以得到L=4.283。

因此三种方法都较好的接近真值。

(七)心得体会
应该熟练掌握这三种方法,才能在编程时正确快速的写出迭代公式。

同时在一种思想的前提下可以寻找多种方法实现算法,互相验证。

相关文档
最新文档