学习目标
学习和掌握用MATLAB工具求解有关不定积分和定积分的问题,深入理解定积分的概念和几何意义.
学习内容
1 学习MATLAB命令
有关积分的MATLAB命令有:
int(s) 返回符号表达式s的不定积分,默认变量为t.
int(s,x) 返回符号表达式s关于指定变量x的不定积分.
int(s,x,a,b) 返回符号表达式s关于指定变量x的定积分,a、b为积分上、下限.
quad(Fun,a,b,tol) 抛物线积分法(simpson)返回积分值,Fun为被积函数,a,b为积分上、下限,tol为积分精度,缺省值1e-3即1×10-3.
quadl(Fun,a,b,tol) NewtonCotes积分法返回积分值,Fun为被积函数,a,b为积分上、下限.tol为积分精度,缺省值1e-6.
trapz(x,y) 梯形积分法返回积分值,x为积分区间离散化变量,y表示被积函数,是与x同维数的向量.
对于符号积分,都是用int的命令,通常在前面先用syms来定义表达式中所涉及的变量.int计算出来的值是符号解,是精确值.quad,qual,trapz是数值积分运算命令,不用syms来定义,计算出来的值是近似值.
2 实验内容
2.1 计算不定积分
【例1】 求不定积分.
输入:
clear
syms x y;
y=exp(2*x)*sin(3*x);
f=int(y,x)
输出为
f =-(exp(2x)(3cos(3x) - 2sin(3x)))/13
运算符int和运算符diff是一对互逆运算,读者可以进行检验.必须指出的是,在初等函数范围内,有些函数是初等不可积的.例如 为初等函数,而却 不能用初等函数表示出来.比如输入命令
例
syms x
int(sin(x)/x,x)
结果为
ans=sinint(x)
该结果是一个非初等函数sinint(x),称为积分正弦函数.在使用int函数求不定积分时,读者应注意到这种情况.
2.2 计算定积分
【例2】 分别求定积分,,,.
输入:
clear
syms x a b
y1=int(cos(a*x),x,0,b)
y2=int(1/(x^2+2*x-3),x,2,inf)
y3=int(1/sin(x),x,0,1)
y4=int(sin(x-1)/x-1,x,1,2)
输出为:
y1 =sin(a*b)/a
y2 =log(5)/4
y3 =Inf
y4 =cosint(1)sin(1) - cosint(2)sin(1) - sinint(1)cos(1) + sinint(2)cos(1) - 1
第一个积分表明积分上、下限可以是符号,第二个积分表明可以将int函数推广到广义积分上去.此处,在MATLAB中的log(5)就是ln 5,在MATLAB中,就是用log表示自然对数函数ln.显然,第三个积分表示该广义积分是发散到无穷大,第四个积分表明该广义积分收敛于sinint(1),只是无法用初等函数表示,如果想得到它的一个10位有效数字的近似值,可以输入命令
vpa(y4,10)
得到
0.946083 0704
该积分约等于0.946 083 0704.
【例3】 计算积分.
输入
syms x
format long
t=-1:0.1:1;
y=t.^(1/3);
f=@(x)(x.^(1/3));
y1=trapz(t,y)
y2=quadl(f,-1,1)
y3=vpa(int(x^(1/3),-1,1),15)
输出为
y1 =1.106106903775610 + 0.638611118647352i
y2 =1.124999836303145 + 0.649518958327905i
y3 =1.125 + 0.649519052838329i
显然,上述结果是错误的,无论是用trapz函数,quadl函数,还是用int函数.众所周知积分.为何会出现这样的错误呢?这是由于数值计算的方法造成的.数值方法对x是通过 计算,当x≤0时,就会出现复数,这种情况称为假奇异积分.要避免出现这种情况,当x≤0时,就用..编写jifen2.m文件:
clear;
function y=jifen2(x)
y=x.^(1/3);
if x<0
y=-(-x).^(1/3);
end
得到
clear;
y1=quadl('jifen2',-1,1)
y1=1.236le-006+7.1365e-007i
结果虽然不是零,但是非常接近,可以近似认为是零.使用数值方法计算,有时简单的问题反而得不到理想的结果,请读者碰到具体问题时具体分析.
2.3 计算广义积分
【例4】 计算广义积分.
输入
format long
ff=@(x)(exp(cos(x)-x.^2))
y1=quadl(ff,-100,100)
y2=quadl(ff,-1e10,1e10)
y3=quadl(ff,-1e20,1e20)
y4=quadl(ff,-1e30,1e30)
y5=quadl(ff,-inf,inf)
y6=vpa(int(exp((cos(x))-x^2),-inf,inf),15)
输出为
y1 =3.989812277383166
y2 =3.989812272585851
Warning: Minimum step size reached; singularity possible.
In quadl (line 96)
y3 =25.814543367399441
Warning: Minimum step size reached; singularity possible.
In quadl (line 96)
y4 =2.581454336739941e+11
Warning: Infinite or Not-a-Number function value encountered.
In quadl (line 100)
y5 =NaN
y6 =3.989812272586
由上面可以看出,本题的广义积分区间 算到得到的y1的答案就已足够满足一般的要求了,当然,算到 得到y2更精确一点.但是把区间算到 , 得到的y3,y4的答案很显然是错误的,y5干脆是无法算出的,这就说明,并不是区间越大越好.可以取一个适当的区间计算积分值,然后让区间按照某种规律扩大,直至前、后两个积分值的差小于给定精度为止,具体可以参见下面的程序.一般地说,y6这样用符号积分命令int计算出来的答案在其中相对来说应该是最精确的.输入命令
clear;
ff=@(x)(exp(cos(x)-x.^2));
n=10;
m=2;
c=1e-6;
a=inf;
b=quadl(ff,-n,n);
while abs(a-b)>c
a=b;
n=n*m;
b=quadl(ff,-n,n)
end
结果为
b =3.989812272587003
2.4 计算瑕积分
【例5】 计算瑕积分.
输入
clc
clear
format long
ff=@(x)(1./(1+cos(x))./sqrt(x));
y1=quadl(ff,1e-5,1)
y2=quadl(ff,1e-10,1)
y3=quadl(ff,1e-100,1)
y4=quadl(ff,0,1)
syms t
y5=vpa(int(1/(1+cos(t))/sqrt(t),0,1),16)
结果为
y1=1.051971682435839
y2=1.055123961405538
y3=5.308783031002335e+30
y4=1.055134167548272
上例瑕积分中的0是瑕点,在积分时,为了避免分母为零,常常用很小的数字代替,这里用了le-5,le-10,le-100,太小的数显然超过了计算机的最小步长,在计算y4时,干脆直接用了零,计算机警告分母为零,但是在MATLAB 7.0版本最后都计算出了它们的近似值,也是可以满足一般要求的.当然,还是y