我们假设
I
1
=
∫
a
b
f
(
x
)
d
x
I_{1}=\int_{a}^{b}f(x)\mathrm{d}x
I1=∫abf(x)dx
I
2
=
∫
a
b
p
(
x
)
d
x
I_{2}=\int_{a}^{b}p(x)\mathrm{d}x
I2=∫abp(x)dx
从高等数学中知道,当
∣
f
(
x
)
p
(
x
)
∣
<
e
|f(x)p(x)|<e
∣f(x)p(x)∣<e 时,
∣
I
1
−
I
2
∣
<
ε
(
b
−
a
)
\left | I_{1}-I_{2} \right | <\varepsilon (b-a)
∣I1−I2∣<ε(b−a)。这说明,当
ε
\varepsilon
ε 充分小时,可用
I
2
I_{2}
I2 近似地代替
I
1
I_{1}
I1。
所以,求任意函数
f
(
x
)
f(x)
f(x) 在
[
a
,
b
]
[a, b]
[a,b] 上的定积分时,要是难以使用解析的方法求出
f
(
x
)
f(x)
f(x) 的原函数,则可以寻找一个在
[
a
,
b
]
[a, b]
[a,b] 上与
f
(
x
)
f(x)
f(x) 逼近,但形式上却简单且易于求积分的函数
p
(
x
)
p(x)
p(x),用
p
(
x
)
p(x)
p(x) 在
[
a
,
b
]
[a, b]
[a,b] 上的积分值近似地代替
f
(
x
)
f(x)
f(x)在
[
a
,
b
]
[a, b]
[a,b] 上的积分值。
如果把积分区间
[
a
,
b
]
[a, b]
[a,b] 分划为
n
n
n 个等长的子区间:
[
a
,
b
]
=
[
a
,
a
1
]
∪
[
a
1
,
a
2
]
∪
⋯
∪
[
a
n
−
1
,
b
]
[a,b]=[a,a_{1}]\cup [a_{1},a_{2}]\cup \dots \cup [a_{n-1},b]
[a,b]=[a,a1]∪[a1,a2]∪⋯∪[an−1,b]
则在每个子区间
[
a
i
,
a
i
+
1
]
[a_{i}, a_{i+1}]
[ai,ai+1] 上用
f
(
x
)
f(x)
f(x) 的插值多项式
p
(
x
)
p(x)
p(x) 代替
f
(
x
)
f(x)
f(x),其逼近效果一般会比在整个区间上使用一个统一的插值多项式时更好。这样就形成了数值积分负荷公式。对被积函数
f
(
x
)
f(x)
f(x) 采用一、二次多项式插值,然后对插值多项式求积分,就得到了几个常见的数值积分公式:
S
1
=
b
−
a
2
[
f
(
a
)
+
f
(
b
)
]
S_{1}=\frac{b-a}{2}[f(a)+f(b)]
S1=2b−a[f(a)+f(b)]
S
2
=
b
−
a
6
[
f
(
a
)
+
4
f
(
a
+
b
2
)
+
f
(
b
)
]
S_{2}=\frac{b-a}{6}[f(a)+4f(\frac{a+b}{2})+f(b)]
S2=6b−a[f(a)+4f(2a+b)+f(b)]
S
3
=
h
2
[
f
(
a
)
+
f
(
b
)
+
2
∑
i
=
1
n
−
1
f
(
a
+
i
h
)
]
S_{3}=\frac{h}{2}[f(a)+f(b)+2\sum_{i=1}^{n-1}f(a+ih)]
S3=2h[f(a)+f(b)+2i=1∑n−1f(a+ih)]
S
4
=
h
6
[
f
(
a
+
i
h
)
+
4
f
(
a
+
i
+
1
2
h
)
+
f
(
a
+
(
i
+
1
)
h
)
]
S_{4}=\frac{h}{6}[f(a+ih)+4f(a+\frac{i+1}{2}h)+f(a+(i+1)h)]
S4=6h[f(a+ih)+4f(a+2i+1h)+f(a+(i+1)h)]
例如,我们求
I
=
∫
0
1
e
−
x
2
d
x
I=\int_{0}^{1}e^{-x^{2}}\mathrm{d}x
I=∫01e−x2dx。
对此,先建立一个函数文件 fex.m。
function f=fex(x)
f=exp(-x.^2)
end
在建立被积函数的函数文件时,因为函数文件允许向量作为输入参数,所以在函数表达式中要采用点运算符。
接下来,我们调用积分函数 quad 求定积分,程序如下:
>>[I,n]=quad(@fex,0,1)
I =0.7468
n =13
也可不建立关于被积函数的函数文件,而使用匿名函数(或内联函数)求解,程序如下:
>> f=@(x)exp(-x.^2);%使用匿名函数f(x)定义被积函数
>>[I,n]=quad(f,0,1)%注意函数句柄f前面不用加@号
I =0.7468
n =13
例如,我们分别用 quad 函数和 quadl 函数求
I
=
∫
0
1
4
1
+
x
2
d
x
I=\int_{0}^{1}\frac{4}{1+x^{2}} \mathrm{d}x
I=∫011+x24dx 的近似值,并在相同的积分精度下,比较函数的调用次数。
程序如下:
>> format long>> f=@(x)4./(1+x.^2);>>[I,n]=quad(f,0,1,1e-8)%调用函数quad求定积分
I =3.141592653733437
n =61>>[I,n]=quadl(f,0,1,1e-8)%调用函数quadl求定积分
I =3.141592653589806
n =48>>(atan(1)-atan(0))*4%理论值
ans =3.141592653589793>> format
其中,向量
X
、
Y
X、Y
X、Y 定义函数关系
Y
=
f
(
X
)
Y=f(X)
Y=f(X)。
X
、
Y
X、Y
X、Y 是两个等长的向量:
X
=
(
x
1
,
x
2
,
…
,
x
n
)
X=(x_{1},x_{2},…,x_{n})
X=(x1,x2,…,xn),
Y
=
(
y
1
,
y
2
,
…
,
y
n
)
Y=(y_{1},y_{2},…,y_{n})
Y=(y1,y2,…,yn),并且
x
1
<
x
2
<
…
<
x
n
x_{1}< x_{2}<…<x_{n}
x1<x2<…<xn,积分区间是
[
x
1
,
x
n
]
[x_{1},x_{n}]
[x1,xn]。
例如,我们用 trapz 函数计算定积分
∫
0
1
4
1
+
x
2
d
x
\int_{0}^{1} \frac{4}{1+x^{2}}\mathrm{d}x
∫011+x24dx。
程序如下:
>> format long>> x=0:0.001:1;>> y=4./(1+x.^2);%生成函数向量
>>trapz(x,y)
ans =3.141592486923126>> format
2.5 累计梯形积分
在 MATLAB 中,提供了对数据积分逐步累计的函数 cumtrapz。该函数调用格式如下:
Z=cumtrapz(Y)
Z=cumtrapz(X,Y)
对于向量
Y
Y
Y,
Z
Z
Z 是一个与
Y
Y
Y 等长的向量;对于矩阵
Y
Y
Y,
Z
Z
Z 是一个与
Y
Y
Y 相同大小的矩阵,累计计算
Y
Y
Y 每列的积分。函数其他参数的含义和用法与 trapz 函数的相同。例如:
>> S=cumtrapz([1:5;2:6]')
S =001.50002.50004.00006.00007.500010.500012.000016.0000
MATLAB 提供的 integral2、quad2d、dblquad 函数用于求
∫
c
d
∫
a
b
f
(
x
,
y
)
d
x
d
y
\int_{c}^{d}\int_{a}^{b}f(x,y)\mathrm{d}x \mathrm{d}y
∫cd∫abf(x,y)dxdy 的数值解,integral3、 triplequad 函数用于求
∫
f
e
∫
c
d
∫
a
b
f
(
x
,
y
,
z
)
d
x
d
y
d
z
\int_{f}^{e}\int_{c}^{d}\int_{a}^{b}f(x,y,z)\mathrm{d}x\mathrm{d}y\mathrm{d}z
∫fe∫cd∫abf(x,y,z)dxdydz 的数值解。函数的调用格式如下:
其中,I 返回积分值;filename 为被积函数;
[
a
,
b
]
[a, b]
[a,b] 为 x 的积分区域,
[
c
,
d
]
[c, d]
[c,d] 为 y 的积分区域,
[
e
,
f
]
[e, f]
[e,f] 为 z 的积分区域;dblquad 函数和 triplequad 函数中参数 tol 的用法与 quad 函数相同。
例如,我们计算二重积分
∫
−
1
1
∫
−
2
2
e
−
x
2
/
2
sin
(
x
2
+
y
)
d
x
d
y
\int_{-1}^{1}\int_{-2}^{2}e^{-x^{2}/2}\sin (x^{2}+y)\mathrm{d}x\mathrm{d}y
∫−11∫−22e−x2/2sin(x2+y)dxdy。
首先,建立一个函数文件 fxy.m。
function f =fxy(x,y)
global ki;
ki=ki+1;%ki用于统计被积函数的调用次数
f=exp(-x.^2/2).*sin(x.^2+y);
end
然后,我们调用函数求解,程序如下:
>> global ki;>> ki=0;>> I=integral2(@fxy,-2,2,-1,1)%调用integral2函数求解
I =1.5745>> ki
ki =22>> ki=0;>> I=quad2d(@fxy,-2,2,-1,1)%调用quad2d函数求解
I =1.5745>> ki
ki =20>> ki=0;>> I=dblquad(@fxy,-2,2,-1,1)%调用dblquad函数求解
I =1.5745>> ki
ki =1050
例如,我们计算三重积分
∫
0
1
∫
0
π
∫
0
π
4
x
z
e
−
z
2
y
−
x
2
d
x
d
y
d
z
\int_{0}^{1}\int_{0}^{\pi}\int_{0}^{\pi}4xze^{-z^{2}y-x^{2}}\mathrm{d}x\mathrm{d}y\mathrm{d}z
∫01∫0π∫0π4xze−z2y−x2dxdydz
程序如下:
>> fxyz=@(x,y,z)4*x.*z.*exp(-z.*z.*y-x.*x);%定义被积函数
>>integral3(fxyz,0,pi,0,pi,0,1)%调用integral3函数求解
ans =1.7328>>triplequad(fxyz,0,pi,0,pi,0,1,1e-7)%调用triplequad函数求解
ans =1.7328
二、离散傅里叶变换
离散傅里叶变化(DFT)广泛应用于信号分析、光谱和声谱分析、全息技术等领域,但直接计算 DFT 的运算量与变换的长度
N
N
N 的平方成正比,当
N
N
N 较大时,计算量太大。
MATLAB 提供了一套计算快速傅里叶变换的函数,它们包括求一维、二维和
N
N
N 维离散傅里叶变换函数 fft、fft2 和 fftn,还包括求上述各维离散傅里叶变换的逆变换函数 ifft、ifft2 和 ifftn 等。
1. 离散傅里叶变换算法简介
在某时间片等距地抽取
N
N
N 个抽样时间
t
m
t_{m}
tm 处的样本值
f
(
t
m
)
f(t_{m})
f(tm),且记作
f
(
m
)
f(m)
f(m),这里
m
=
0
,
1
,
2
,
…
,
N
−
1
m=0,1,2,…,N-1
m=0,1,2,…,N−1,称向量
F
(
k
)
(
k
=
0
,
1
,
2
,
…
,
N
−
1
)
F(k)(k=0,1,2,…,N-1)
F(k)(k=0,1,2,…,N−1) 为
f
(
m
)
f(m)
f(m) 的一个离散傅里叶变换,其中
F
(
k
)
=
∑
m
=
0
N
f
(
m
)
e
−
j
2
π
m
k
/
N
,
k
=
0
,
1
,
2
,
…
,
N
F(k)=\sum_{m=0}^{N}f(m)e^{-j2\pi mk/N},k=0,1,2,…,N
F(k)=m=0∑Nf(m)e−j2πmk/N,k=0,1,2,…,N
因为 MATLAB 不允许有零下标,所以将上述公式中
m
m
m 的下标均移动 1,于是便得到相应公式:
F
(
k
)
=
∑
m
=
1
N
f
(
m
)
e
−
j
2
π
(
m
−
1
)
(
k
−
1
)
/
N
,
k
=
1
,
2
,
…
,
N
F(k)=\sum_{m=1}^{N}f(m)e^{-j2\pi (m-1)(k-1)/N},k=1,2,…,N
F(k)=m=1∑Nf(m)e−j2π(m−1)(k−1)/N,k=1,2,…,N
由
f
(
m
)
f(m)
f(m) 求
F
(
k
)
F(k)
F(k) 的过程,称为求
f
(
m
)
f(m)
f(m) 的傅里叶变换,又称
F
(
k
)
F(k)
F(k) 为
f
(
m
)
f(m)
f(m) 的离散频谱。反之,由
F
(
k
)
F(k)
F(k) 逆求
f
(
m
)
f(m)
f(m) 的过程,称为离散傅里叶逆变换,相应的变换公式为:
f
(
m
)
=
1
N
∑
k
=
1
N
F
(
k
)
e
j
2
π
(
m
−
1
)
(
k
−
1
)
/
N
,
m
=
1
,
2
,
…
,
N
f(m)=\frac{1}{N}\sum_{k=1}^{N}F(k)e^{j2\pi (m-1)(k-1)/N},m=1,2,…,N
f(m)=N1k=1∑NF(k)ej2π(m−1)(k−1)/N,m=1,2,…,N