Matlab实验报告
——定积分的近似计算
学生姓名:
学号:
专业:数学与应用数学专业
数学实验报告
实验序号:1001114030 日期:2012年10月20日
班级应一姓名陈璐学号1001114030
实验名称:定积分的近似运算
问题背景描述:
利用牛顿—莱布尼茨公式虽然可以精确地计算定积分的值,但它仅适合于被积分函数的原函数能用初等函数表达出来的情形。
如果这点办不到或不容易办到,
这就有必要考虑近似计算的方法。
在定积分的很多应用问题中,被积函数甚至没
有解析表达式,可能只是一条实验记录曲线,或者是一组离散的采样值,这时只
能应用近似方法去计算相应的定积分。
实验目的:
本实验将主要研究定积分的三种近似计算算法:矩形法、梯形法、抛物线发。
对于定积分的近似数值计算,Matlab有专门函数可用。
实验原理与数学模型:
1.sum(a):求数组a的和。
2.format long:长格式,即屏幕显示15位有效数字。
3.double():若输入的是字符则转化为相应的ASCII码;若输入的是整型数之则转化为
相应的实型数值。
4.quad():抛物线法求数值积分。
格式:quad(fun,a,b)。
此处的fun是函数,并且
为数值形式,所以使用*、/、^等运算时要在其前加上小数点。
5.trapz():梯形法求数值积分。
格式:trapz(x,y)。
其中x为带有步长的积分区间;y为数
值形式的运算。
6.fprintf(文件地址,格式,写入的变量):把数据写入指定文件。
7.syms 变量1变量2……:定义变量为符号。
8.sym('表达式'):将表达式定义为符号。
9.int(f,v,a,b):求f关于v积分,积分区间由a到b。
10.subs(f,'x',a):将a的值赋给符号表达式f中的x,并计算出值。
若简单地使用subs
(f),则将f的所有符号变量用可能的数值代入,并计算出值。
实验所用软件及版本:Matlab 7.0.1
主要内容(要点):
1.矩形法:i b a n
i i x f dx x f ⎰∑=∆=1)()(ς (1)左点法:对等分区间b x i n
a b a x x a x n i =<<-+
=<<<= 10在区间[]i i x x ,1-上取左端点,即取1-=i i x ς。
(2)右点发:同(1)中划分区间,在区间[]i i x x ,1-上取右端点,即取i i x =ς。
(3)中点法:同(1)中划分区间,在区间[]i i x x ,1-上取右端点,即取21i i i x x +=
-ς。
2.梯形法:⎪⎭⎫ ⎝⎛++++-=
-⎰22)(110n n b a y y y y n a b dx x f 3.抛物线法:()()[]2242123120246)(--+++++++++-=⎰n n n b a y y y y y y y y n
a b dx x f 4.直接用Matlab 命令计算结果
实验过程记录(含基本步骤、主要程序清单及异常情况记录等):
1、分别用梯形法和抛物线法,计算⎰2
1x
dx ,将积分区间[0,1]作120等分。
并尝试直接使用函数trapz()、quad()进行计算求解,比较结果的差异。
(1)梯形法:
format long
n=120;a=1;b=2;inum=0;
syms x fx
fx=1/x;
xj=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);
end
inum
integrate=int(fx,1,2)
integrate=double(integrate)
fprintf('The relative error between inum and real-value is about: %g\n\n',...
abs((inum-integrate)/integrate))
运行结果:inum =0.69315152080005
integrate =log(2)
integrate =0.69314718055995
The relative error between inum and real-value is about: 6.26164e-006
(2)抛物线法:
format long
%2*n=240;
n=120;
a=1;b=2;
syms x fx
fx=1/x;
for i=1:n
x0=a+(2*i-2)*(b-a)/(2*n);
x1=a+(2*i-1)*(b-a)/(2*n);
x2=a+(2*i-0)*(b-a)/(2*n);
fx0=subs(fx,x,x0);
fx1=subs(fx,x,x1);
fx2=subs(fx,x,x2);
Si=(fx0+4*fx1+fx2)*(b-a)/(6*n);
inum=inum+Si;
end
inum
integrate=int(fx,1,2);
integrate=double(integrate)
fprintf('抛物线法的相对误差为: %e\n',abs((inum-integrate)/integrate))%将inum输入成了abs导致运行出错
运行结果:inum =0.69314718056936
integrate =0.69314718055995
抛物线法的相对误差为: 1.358861e-011
(3)Trapz ()法:
x=1:1/120:2;
y=1./x;
trapz(x, y)
运行结果:ans =0.69315152080005
(4)quad()法:
quad('1./x',1,2)
运行结果:ans =0.69314719986297
2、试计算定积分⎰
+∞0sin dx x
x .(注意:可以运用trapz ()、quad ()或附录程序求解吗?为什么?) syms x
f=sin(x)/x;
I=int(f,0,inf)%该题积分上限为正无穷,故只能用符号运算,而不能用trapz()、quad()或附录程序 运行结果:I =1/2*pi
3、学习fuluBsum.m 的程序设计方法,尝试用函数sum 改写矩阵方法和抛物线法的程序,避免for 循环.
format long
n=120;a=1;b=2;
syms x fx
fx=1/x;%第一次操作将fx 的值当作了1,运算出错
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=(fxj+fxi)/2*(b-a)/n;
inum=sum(f)
integrate=int(fx,1,2)
integrate=double(integrate)
fprintf('The relative error between inum and real-value is about: %g\n\n',...
abs((inum-integrate)/integrate))%第二个连接符号打成了下划线
运行结果:inum =0.69315152080005
integrate =log(2)
integrate =0.69314718055995
The relative error between inum and real-value is about: 6.26164e-006
思考与深入:这几个题其实都不算难,但是由于是第一次运用所学Matlab知识,很多地方只能照着书本才能写出来程序,对各种方法都很陌生,需要加强运用。
另外,有些程序编译较简单,但是出现了些低级错误,比如拼写出错,或是符号打成了中文符号。
总的来说还需加强复习这方面的内容,最好能运用Matlab中近似计算积分的知识解决积分中遇到的难题。
教师评语:。