现代科学运算-matlab语言与应用
东北大学 http://www.icourses.cn/home/ (薛定宇)
《高等应用数学问题的MATLAB求解(第四版)》
代码可在matlab r2016b 运行。
08 数据插值、函数逼近问题的计算机求解
08.01 一维插值问题
一维插值 interp1() 函数的调用格式为
y1=interp1(x,y,x1,method)
y
1
=
i
n
t
e
r
p
1
(
x
,
y
,
x
1
,
m
e
t
h
o
d
)
插值方法:
Linear – 默认方法
Pchip – 三次函数插值
Nearest – 最近点插值
Spline – 样条插值,推荐使用
运用外推法,再区间[
x1,xN
x
1
,
x
N
] 外的点的插值
y1=interp1(x,y,x1,method,′extrap′)
y
1
=
i
n
t
e
r
p
1
(
x
,
y
,
x
1
,
m
e
t
h
o
d
,
′
e
x
t
r
a
p
′
)
例8-1 数据插值
已知的数据点来自函数
f(x)=(x2−3x+5)e−5xsinx
f
(
x
)
=
(
x
2
−
3
x
+
5
)
e
−
5
x
sin
x
生成的数据进行插值处理
得出较平滑的插值曲线
生成的数据显示
x = 0: .12: 1;
y = (x.^2 - 3*x + 5).*exp(-5*x).*sin(x);
plot(x, y, x, y, 'o');
不同的插值算法
x1 = 0: .02: 1;
y1 = interp1(x, y, x1);
y0 = (x1.^2 - 3*x1 + 5).*exp(-5*x1).*sin(x1);
y2 = interp1(x, y, x1, 'pchip');
y3 = interp1(x, y, x1, 'spline');
y4 = interp1(x, y, x1, 'nearest');
plot(x1, [y1', y2', y3', y4'], ':', x, y, 'o', x1, y0)
% 验证结果
[max(abs(y0(1:49) - y2(1:49))), max(abs(y0 - y3)), max(abs(y0 - y4))]
例8-2 徒手绘制规划曲线
用户可以在 x-y 平面内选择一些点
x轴排序,密集点插值,绘图
function sketcher(vis)
x = [];
y = [];
i = 1;
h = [];
axes(gca);
while 1
[x0,y0,but] = ginput(1);
if but == 1
x = [x, x0];
y = [y, y0];
h(i) = line(x0, y0);
set(h(i), 'Marker', 'o');
i = i + 1;
else
break
end
end
if nargin == 1
delete(h);
end
[x ii] = sort(x);
y = y(ii);
xx = [x(1):(x(end)-x(1))/100: x(end)];
yy = interp1(x, y, xx, 'spline');
line(xx, yy)
Lagrange插值算法及应用
已知xi,yi点,i=1,2,⋯,N
已
知
x
i
,
y
i
点
,
i
=
1
,
2
,
⋯
,
N
生成一个插值x向量
插值算法为
ϕ(x)=∑i=1Nyi∏j=1,j≠iNx−xj(xi−xj)
ϕ
(
x
)
=
∑
i
=
1
N
y
i
∏
j
=
1
,
j
≠
i
N
x
−
x
j
(
x
i
−
x
j
)
matlab函数调用格式: y = lagrange(
x0,y0,x
x
0
,
y
0
,
x
)
例8-3 Runge现象
测试函数
f(x)=1/(1+25x2),−1≤x≤1
f
(
x
)
=
1
/
(
1
+
25
x
2
)
,
−
1
≤
x
≤
1
生成数据,进行Lagrange插值
function y = lagrange(x0, y0, x)
ii = 1:length(x0);
y=zeros(size(x));
for i = ii
ij = find(ii ~= i);
y1 = 1;
for j = 1:length(ij)
y1 = y1.*(x-x0(ij(j)));
end
y = y+y1*y0(i)/prod(x0(i)-x0(ij));
end
x0 = -1+2*[0:10]/10;
y0 = 1./(1+25*x0.^2);
x = -1: .01:1;
y = lagrange(x0, y0, x);
ya = 1./ (1+25*x.^2);
plot(x, ya, x, y, ':');
调用interp1()函数
y1 = interp1(x0, y0, x, 'pchip');
y2 = interp1(x0, y0, x, 'spline');
plot(x, ya, x, y1, ':', x, y2, '--');
例8-4 人口预测
某省人口数据在census.xls给出
可以根据给出的数据预报未来的人口
X = xlsread('E:\\Work\\201806\\math_4th\\census.xls', 'B5:C67');
t = X(:, 1);
p = X(:, 2);
t0 = t(1:5:end);
p0 = p(1:5:end);
t1 = 1949:2015;
y = interp1(t0, p0, t1, 'spline', 'extrap');
plot(t, p, t1, y, t0, p0, 'o');
已知样本点的定积分计算
已知函数散点
x0,y0
x
0
,
y
0
function y = quadspln(x0, y0, a, b)
f = @(x) interp1(x0, y0, x, 'spline');
y = integral(f, a, b);
函数调用格式: I = quadspln(x0, y0, a, b)
例8-5 利用插值求数值积分
利用样条插值三分求解
∫π0sinxdx
∫
0
π
sin
x
d
x
用30个采样点求解:
x0 = 0: pi/30: pi;
y0 = sin(x0);
I = quadspln(x0, y0, 0, pi)
08.02 二维与高维插值问题
二维网格数据的插值问题
样本点是网格形式给出的
二维插值的函数
z1=interp2(x0,y0,z0,x1,y1,method)
z
1
=
i
n
t
e
r
p
2
(
x
0
,
y
0
,
z
0
,
x
1
,
y
1
,
m
e
t
h
o
d
)
其中,
x0,y0,z0为已知二维网格数据x1,y1
x
0
,
y
0
,
z
0
为
已
知
二
维
网
格
数
据
x
1
,
y
1
x,y为要插值点的网格矩阵z1
x
,
y
为
要
插
值
点
的
网
格
矩
阵
z
1
选项类似于 interp1,建议使用 spline 选项
这里的数据一定要采用网格数据
网格数据应该由 meshgrid函数生成
例8-7 网格数据的插值举例
根据下述函数生成一些稀疏的网格数据
由下面的函数可以生成样本点网格数据
z=f(x,y)=(x2−2x)e−x2−y2−xy
z
=
f
(
x
,
y
)
=
(
x
2
−
2
x
)
e
−
x
2
−
y
2
−
x
y
进行各种插值拟合,并比较拟合结果
绘制已知数据的网格图:
[x, y] = meshgrid(-3: .6 : 3, -2: .4 : 2);
z = (x.^2 - 2*x) .* exp(-x.^2-y.^2-x.*y);
surf(x, y, z);
axis([-3, 3, -2, 2, -0.7, 1.5]);
不同插值算法的比较
默认插值算法进行插值:
[x1, y1] = meshgrid(-3: .2: 3, -2: .2: 2);
z1 = interp2(x, y, z, x1, y1);
surf(x1, y1, z1);
axis([-3, 3, -2, 2, -0.7, 1.5]);
三次插值和样条插值,并分析误差
[x, y] = meshgrid(-3: .6 : 3, -2: .4 : 2);
z = (x.^2 - 2*x) .* exp(-x.^2-y.^2-x.*y);
[x1, y1] = meshgrid(-3: .2: 3, -2: .2: 2);
z1 = interp2(x, y, z, x1, y1, 'cubic');
z2 = interp2(x, y, z, x1, y1, 'spline');
surf(x1, y1, z1);
figure;
surf(x1, y1, z2);
z = (x1.^2-2*x1).*exp(-x1.^2-y1.^2-x1.*y1);
figure;
surf(x1, y1, abs(z-z1));
figure;
surf(x1, y1, abs(z-z2));
二维一般分布数据的插值问题
实际应用中能测到的并不总是网格分布的数据,经常需要解决样本点为散点的插值
griddata()函数的调用格式:z = griddata(
x0,y0,z0,x,y
x
0
,
y
0
,
z
0
,
x
,
y
, ‘v4’)
其中,
x0,y0,z0
x
0
,
y
0
,
z
0
是已知的二维样本点向量
x,y 是期望的插值位置
z表示插值的结果,维数和x,y一致
‘v4’是matlab 4.0 版本中提供的插值算法
例8-8 随机分布样本点的插值
给定函数
z=f(x,y)=(x2−2x)e−x2−y2−xy
z
=
f
(
x
,
y
)
=
(
x
2
−
2
x
)
e
−
x
2
−
y
2
−
x
y
在矩形区域
x∈[−3,3],y∈[−2,2]
x
∈
[
−
3
,
3
]
,
y
∈
[
−
2
,
2
]
内随机生成一组样本点
zi
z
i
用griddata()进行插值处理, 并误差分析
数据生成与显示
x = -3 + 6*rand(200, 1);
y = -2 + 4*rand(200, 1);
z = (x.^2 - 2*x).*exp(-x.^2-y.^2-x.*y);
plot(x, y, 'x');
figure;
plot3(x, y, z, 'x');
不同插值方法比较
使用’cubic’和’v4’算法:
[x1, y1] = meshgrid(-3: .2: 3, -2: .2: 2);
z1 = griddata(x, y, z, x1, y1, 'cubic');
surf(x1, y1, z1);
z2 = griddata(x, y, z, x1, y1, 'v4');
figure;
surf(x1, y1, z2);
% 比较
figure;
z0 = (x1.^2 - 2*x1).*exp(-x1.^2-y1.^2-x1.*y1);
surf(x1, y1, abs(z0-z1));
figure;
surf(x1, y1, abs(z0-z2));
例8-9 剔除某些样本点
给定的样本点在x-y平面分布较均匀,现在人为剔除某些点,表明已知数据分布不均匀,这时再进行插值分析,观察插值效果。
剔除圆内样本点
x = -3 + 6*rand(200, 1);
y = -2 + 4*rand(200, 1);
ii = find((x+1).^2 + (y+0.5).^2 > 0.5^2);
x = x(ii);
y = y(ii);
z = z(ii);
plot(x, y, 'x');
t = [0: .1: 2*pi, 2*pi];
x0 = -1 + 0.5*cos(t);
y0 = -0.5 + 0.5*sin(t);
line(x0, y0);
重新插值
% 用新样本点拟合曲面
[x1, y1] = meshgrid(-3: .2: 3, -2: .2: 2);
z1 = griddata(x, y, z, z1, y1, 'v4');
surf(x1, y1, z1);
% 误差分析
z0 = (x1.^2 - 2*x1).*exp(-x1.^2-y1.^2-x1.*y1);
surf(x1, y1, abs(z0-z1)),
axis([-3, 3, -2, 2, 0, 0.1]);
% 误差等高线图
figure;
contour(x1, y1, abs(z0-z1), 30);
hold on;
plot(x, y, 'x');
hold off;
line(x0, y0)
高维插值问题
三维的网格数据生成:
[x, y, z] = meshgrid(
x1,y1,z1
x
1
,
y
1
,
z
1
);
高维网格数据的生成
[x1,⋯,xn]=ndgrid(v1,⋯,vn);
[
x
1
,
⋯
,
x
n
]
=
n
d
g
r
i
d
(
v
1
,
⋯
,
v
n
)
;
插值函数
网格数据插值 interpn
散点数据插值 griddatan
数据格式转换
ndgrid与meshgrid格式不同
% 格式转换方法
function [x1, y1, z1, v1] = mesh2nd(x, y, z, v)
switch nargin
case 3, x1 = x.'; y1 = y.'; z1 = z.';
case 4, z1 = z;
for i = 1: size(x, 3), x1(:, :, i) = x(:, :, i).';
y1(:, :, i) = y(:, :, i).';
v1(:, :, i) = v(:, :, i).';
end;
otherwise error('Error in input arguments')
end;
例8-10 三元函数插值
假设已知某三元函数
V(x,y,z)=xx+y(x+y)/2+z(x+y+z)/3−−−−−−−−−−−−−−−−−−−−√
V
(
x
,
y
,
z
)
=
x
x
+
y
(
x
+
y
)
/
2
+
z
(
x
+
y
+
z
)
/
3
可以通过该函数生成一些网格样本点,是根据样本点进行拟合,并给出拟合误差
[x, y, z] = meshgrid(0: 0.3: 2);
[x0, y0, z0] = meshgrid(0: 0.1: 2);
V = sqrt(x.^x + y.^((x+y)/2) + z.^((x+y+z)/3));
V0 = sqrt(x0.^x0 + y0.^((x0+y0)/2) + z0.^((x0+y0+z0)/3));
V1 = interp3(x, y, z, V, x0, y0, z0, 'spline');
vol_visual4d(x0, y0, z0, V1);
08.03 样条插值问题
三次样条函数及其matlab表示
样本点
(xi,yi)(i=1,2,⋯,n)
(
x
i
,
y
i
)
(
i
=
1
,
2
,
⋯
,
n
)
其中
x1<x2<⋯<xn
x
1
<
x
2
<
⋯
<
x
n
S(x) 为三次样条函数的三个条件:
S(xi)=yi(i=1,2,⋯,n)
S
(
x
i
)
=
y
i
(
i
=
1
,
2
,
⋯
,
n
)
每个子区间
[xi,xi+1]
[
x
i
,
x
i
+
1
]
上, S(x)位三次多项式
S(x)=ci1(x−xi)3+ci2(x−xi)2+ci3(x−xi)+ci4
S
(
x
)
=
c
i
1
(
x
−
x
i
)
3
+
c
i
2
(
x
−
x
i
)
2
+
c
i
3
(
x
−
x
i
)
+
c
i
4
S(x) 在整个区间 [x_i, x_{i+1}] 上有连续1-2阶导数
例8.12 正弦函数插值
稀疏数据的三次样条插值结果
I=∫π0sintdt
I
=
∫
0
π
sin
t
d
t
x0 = [0, 0.4, 1 2, pi];
y0 = sin(x0);
sp = csapi(x0, y0);
fnplt(sp, ':');
hold on;
ezplot('sin(t)', [0, pi]);
plot(x0, y0, 'o');
多个自变量网格数据插值
网格数据三次样条插值类:
S = csapi(
{x1,x2,⋯,xn}
{
x
1
,
x
2
,
⋯
,
x
n
}
, z)
xi
x
i
为自变量的网格数据
zi
z
i
为网格数据的样本点
得出的S是三次样条函数对象
得出的样条函数类可用下面函数处理
fnplt(), fnval()
例8-14 二维数据插值
给定
z=f(x,y)=(x2−2x)e−x2−y2−xy
z
=
f
(
x
,
y
)
=
(
x
2
−
2
x
)
e
−
x
2
−
y
2
−
x
y
用三次样条插值方法得出网格数据的样条插值拟合,并绘制曲面
x0 = -3: .6: 3;
y0 = -2: .4: 2;
[x, y] = ndgrid(x0, y0);
z = (x.^2 - 2*x) .* exp(-x.^2 - y.^2 -x.*y);
sp = csapi({x0, y0}, z);
fnplt(sp);
B样条函数及其matlab表示
建立B样条函数对象
S = spapi(k, z, y)
其中k为用户选定的B样条阶次,一般选择k= 4, 5
例8-15 插值类的比较
给定正弦函数
f(x)=sinx
f
(
x
)
=
sin
x
生成稀疏数据
进行5次B样条插值函数拟合
与三次样条函数拟合的结果比较
x0 = [0, 0.4, 1 2, pi];
y0 = sin(x0);
ezplot('sin(t)', [0, pi]);
hold on;
sp1 = csapi(x0, y0);
fnplt(sp1, '--');
sp2 = spapi(5, x0, y0);
fnplt(sp2, ':');
hold off;
另一个函数
原函数
f(x)=(x2−3x+5)e−5xsinx
f
(
x
)
=
(
x
2
−
3
x
+
5
)
e
−
5
x
sin
x
插值效果比较
x = 0: .12: 1;
y = (x.^2-3*x+5).*exp(-5*x).*sin(x);
ezplot('(x^2-3*x)*exp(-5*x)*sin(x)', [0, 1]);
hold on;
sp1 = csapi(x, y);
fnplt(sp1, '--');
sp2 = spapi(5, x, y);
fnplt(sp2, ':');
hold off;
08.04 基于样条插值的数值微积分
基于样条插值的数值微分运算
求单变量k阶导数的函数调用格式
Sd
S
d
= fnder(S, k)
多变量函数的偏导数的函数调用格式
Sd
S
d
= fnder(S, [
k1,⋯,kn
k
1
,
⋯
,
k
n
])
S可用三次或B样条类
例8-16数值微分
给定
f(x)=(x2−3x+5)e−5xsinx
f
(
x
)
=
(
x
2
−
3
x
+
5
)
e
−
5
x
sin
x
生成一些数据点
用三次分段多项式样条函数与B样条插值函数,求出该函数的导数
syms x;
f = (x^2-3*x+5)*exp(-5*x)*sin(x);
ezplot(diff(f), [0, 1]);
hold on;
x = 0: .12: 1;
y = (x.^2-3*x+5).*exp(-5*x).*sin(x);
% 数值微分
figure;
sp1 = csapi(x, y);
dsp1 = fnder(sp1, 1);
fnplt(dsp1, '--');
sp2 = spapi(5, x, y);
dsp2 = fnder(sp2, 1);
fnplt(dsp2, ':');
hold off;
% 高阶导数,如三阶导数
figure;
ezplot(diff(f, 3), [0, 1]);
hold on;
dsp1 = fnder(sp1, 3);
fnplt(dsp1, '--');
dsp2 = fnder(sp2, 3);
fnplt(dsp2, ':');
hold off;
例8-17 二元函数
给定
z=f(x,y)=(x2−2x)e−x2−y2−xy
z
=
f
(
x
,
y
)
=
(
x
2
−
2
x
)
e
−
x
2
−
y
2
−
x
y
生成一些数据点
利用数值插值的方法拟合曲面
partialz∂x∂y
p
a
r
t
i
a
l
z
∂
x
∂
y
并与解析解法绘制出的曲面相比较
x0 = -3: .3 : 3;
y0 = -2: .2: 2;
[x, y] = ndgrid(x0, y0);
z = (x.^2-2*x).*exp(-x.^2-y.^2-x.*y);
sp = spapi({5, 5}, {x0, y0}, z);
dspxy = fnder(sp, [1, 1]);
fnplt(dspxy);
hold on;
syms x y;
z = (x^2-2*x)*exp(-x^2-y^2-x*y);
ezsurf(diff(diff(z, x), y), [-3, 3], [-2, 2])
样条插值的数值积分计算
数值积分运算
积分函数:
Si
S
i
= fnint(S)
积分函数的结果为样条对数
在区间[a, b]求取定积分
I = diff(fnval(fnint(S), [a, b]))
例8-18 正弦函数的数值积分
给定
∫π0sinxdx
∫
0
π
sin
x
d
x
生成一些稀疏的样本点
用样条积分的方程求出定积分及积分函数
x = [0, 0.4, 1 2, pi];
y = sin(x);
sp1 = csapi(x, y);
a = fnint(sp1, 1);
xx = fnval(a, [0, pi]);
I1 = xx(2) - xx(1);
sp2 = spapi(5, x, y);
b = fnint(sp2, 1);
xx = fnval(b, [0, pi]);
I2 = xx(2) - xx(1);
% 积分函数绘制
ezplot('-cos(t)+2', [0, pi]);
hold on;
fnplt(a, '--');
fnplt(b, ':');
hold off;
基于样条插值的数值积分运算
数值积分运算
积分函数
Si
S
i
= fnint(S)
积分函数的结果为样条函数
在区间[a, b]求取定积分
I = diff(fnval(fnint(S), [a, b]))
例8-19 双重积分的积分曲面
积分公式
J=∫1−1int2−2e−x2/2sin(x2+y)dxdy
J
=
∫
−
1
1
i
n
t
−
2
2
e
−
x
2
/
2
sin
(
x
2
+
y
)
d
x
d
y
fnint()函数不能求解,可以考虑fnder()函数
微分阶次选为负值可以计算积分
x0 = -2: 0.1 : 2;
y0 = -1: 0.1: 1;
[x, y] = ndgrid(x0, y0);
z = exp(-x.^2/2).*sin(x.^2+y);
S = spapi({5, 5}, {x0, y0}, z);
S1 = fnder(S, [-1, -1]);
S2 = fnval(S1, {x0, y0});
surf(y0, x0, S2);
08.05 由已知数据拟合函数
多项式拟合
多项式拟合就是用多项式拟合已知数据
多项式拟合函数调用格式
p = polyfit(x, y, n)
其中:
x和y为原始的样本点构成的向量
n为选定的多项式阶次
p为多项式系数按降幂排列得出的行向量
例8-20 数据的多项式拟合
原型函数
f(x)=(x2−3x+5)e−5xsinx
f
(
x
)
=
(
x
2
−
3
x
+
5
)
e
−
5
x
sin
x
使用该函数生成一些数据点
用多项式方法在不同的阶次下进行拟合
拟合该数据的3次多项式
x0 = 0: 0.1: 1;
y0 = (x0.^2-3*x0+5).*exp(-5*x0).*sin(x0);
p3 = polyfit(x0, y0, 3);
x = 0: .01: 1;
ya = (x.^2-3*x+5).*exp(-5*x).*sin(x);
y1 = polyval(p3, x);
plot(x, y1, x, ya, x0, y0, 'o');
不同阶次拟合
p4 = polyfit(x0, y0, 4);
y2 = polyval(p4, x);
p5 = polyfit(x0, y0, 5);
y3 = polyval(p5, x);
p8 = polyfit(x0, y0, 8);
y4 = polyval(p8, x);
plot(x, ya, x0, y0, 'o', x, y2, x, y3, x, y4);
% Taylor幂级数展开
syms x;
y = (x^2-3*x+5)*exp(-5*x)*sin(x);
p = taylor(y, 'Order', 9)
例8-21 数据拟合
对下式进行多项式拟合,并观察拟合效果
f(x)=1/(1+25x2),−1≤x≤1
f
(
x
)
=
1
/
(
1
+
25
x
2
)
,
−
1
≤
x
≤
1
就不同的多项式阶次进行曲线拟合:
x0 = -1+2*[0:10]/10;
y0 = 1./(1+25*x0.^2);
x = -1: 0.01: 1;
ya = 1./(1+25*x.^2);
p3 = polyfit(x0, y0, 3);
y1 = polyval(p3, x);
p5 = polyfit(x0, y0, 5);
y2 = polyval(p5, x);
p8 = polyfit(x0, y0, 8);
y3 = polyval(p8, x);
p10 = polyfit(x0, y0, 10);
y4 = polyval(p10, x);
plot(x, ya, x, y1, x, y2, x, y3, x, y4);
函数线性组合的曲线拟合方法
已知函数的线性组合
g(x)=c1f1(x)+c2f2(x)+c3f3(x)+⋯+cnfn(x)
g
(
x
)
=
c
1
f
1
(
x
)
+
c
2
f
2
(
x
)
+
c
3
f
3
(
x
)
+
⋯
+
c
n
f
n
(
x
)
Ac = y
A=⎡⎣⎢⎢⎢⎢⎢⎢f1(x1)f1(x2)⋮f1(xM)f2(x1)f2(x2)⋮f2(xM)⋯⋯⋱⋮fm(x1)fm(x2)⋮fm(xM)⎤⎦⎥⎥⎥⎥⎥⎥,y=⎡⎣⎢⎢⎢⎢y1y2⋮yM⎤⎦⎥⎥⎥⎥
A
=
[
f
1
(
x
1
)
f
2
(
x
1
)
⋯
f
m
(
x
1
)
f
1
(
x
2
)
f
2
(
x
2
)
⋯
f
m
(
x
2
)
⋮
⋮
⋱
⋮
f
1
(
x
M
)
f
2
(
x
M
)
⋮
f
m
(
x
M
)
]
,
y
=
[
y
1
y
2
⋮
y
M
]
例8-21 多项式拟合
原型函数
f(x)=(x2−3x+t)e−5xsinx
f
(
x
)
=
(
x
2
−
3
x
+
t
)
e
−
5
x
sin
x
进行多项式拟合的各个函数为
fi(x)=xn+1−i,i=1,2,⋯,n
f
i
(
x
)
=
x
n
+
1
−
i
,
i
=
1
,
2
,
⋯
,
n
观察多项式拟合效果
x = [0: .1: 2]';
n = 7;
A = [];
y = (x.^2+3*x+5).*exp(-5*x).*sin(x);
for i = 1:n+1
A(:, i) = x.^(n+1-i);
end;
c = A\y
08.06 最小二乘曲线拟合
最小二乘曲线拟合
给定一组数据
xi,yi,i=1,2,⋯,N
x
i
,
y
i
,
i
=
1
,
2
,
⋯
,
N
已知函数原型
y^(x)=f(a,x),a为待定系数
y
^
(
x
)
=
f
(
a
,
x
)
,
a
为
待
定
系
数
最小二乘曲线拟合的目标为求出一组待定系数的值,使得目标函数为最小
J=mina∑i=1N[yi−y^(xi)]2=mina∑i=1N[yi−f(a,xi)]2
J
=
min
a
∑
i
=
1
N
[
y
i
−
y
^
(
x
i
)
]
2
=
min
a
∑
i
=
1
N
[
y
i
−
f
(
a
,
x
i
)
]
2
matlab求解
[a,
jm
j
m
] = lsqcurvefit(Fun,
a0
a
0
, x, y, options)
例8-25 最小二乘曲线拟合
由下面的语句生成一组数据
x = 0: 0.1: 10;
y = 0.12*exp(-0.213*x)+0.54*exp(-0.17*x).*sin(1.23*x);
该数据满足原型函数: y(x)=a1e−a2x+a3e−a4xsin(a5x) y ( x ) = a 1 e − a 2 x + a 3 e − a 4 x sin ( a 5 x )
% 最小二乘拟合
f = @(a, x)a(1)*exp(-a(2)*x)+a(3)*exp(-a(4)*x).*sin(a(5)*x);
[xx, res] = lsqcurvefit(f, [1, 1, 1, 1, 1], x, y)
例8-26 最小二乘拟合
已知数据可能满足
y(x)=ax+bx2e−cx+d
y
(
x
)
=
a
x
+
b
x
2
e
−
c
x
+
d
xiyixiyi0.12.32010.63.9900.22.64700.74.21470.32.97070.84.51910.43.28850.94.82320.53.600815.1275
x
i
0.1
0.2
0.3
0.4
0.5
y
i
2.3201
2.6470
2.9707
3.2885
3.6008
x
i
0.6
0.7
0.8
0.9
1
y
i
3.990
4.2147
4.5191
4.8232
5.1275
求满足数据的最小二乘解 a, b, c, d的值
令
a1=a,a2=b,a3=c,a4=d
a
1
=
a
,
a
2
=
b
,
a
3
=
c
,
a
4
=
d
原型函数
y(x)=a1x+a2x2e−a3x+a4
y
(
x
)
=
a
1
x
+
a
2
x
2
e
−
a
3
x
+
a
4
% 输入已知数据:
x = 0.1: 0.1: 1;
y = [2.3201, 2.6470, 2.9707, 3.2885, 3.6008, ...
3.9090, 4.2147, 4.5191, 4.8232, 5.1275];
% 求解
f = @(a, x)a(1)*x + a(2)*x.^2 .* exp(-a(3)*x) + a(4);
a = [1;2;2;3];
[a, b, c, d] = lsqcurvefit(f, a, x, y);
a, b
多变量函数的最小二乘函数拟合
多变量待定函数
z=f(z,X)
z
=
f
(
z
,
X
)
目标函数:
z=f(a,x1,x2,⋯,xm)
z
=
f
(
a
,
x
1
,
x
2
,
⋯
,
x
m
)
J=mina∑i=1N[yi−y^(xi)]2=mina∑i=1N[yi−f(a,xi)]2
J
=
min
a
∑
i
=
1
N
[
y
i
−
y
^
(
x
i
)
]
2
=
min
a
∑
i
=
1
N
[
y
i
−
f
(
a
,
x
i
)
]
2
最小二乘拟合
[a,jm]=lsqcuryefit(Fun,a0,X,y,options)
[
a
,
j
m
]
=
l
s
q
c
u
r
y
e
f
i
t
(
F
u
n
,
a
0
,
X
,
y
,
o
p
t
i
o
n
s
)
例8-27 多变量函数拟合
原型函数
z=a1xa2x+a3ya4(x+y)+a5za6(x+y+z)
z
=
a
1
x
a
2
x
+
a
3
y
a
4
(
x
+
y
)
+
a
5
z
a
6
(
x
+
y
+
z
)
数据文件:c8data1.dat
令
x1=x,x2=y,x3=z
x
1
=
x
,
x
2
=
y
,
x
3
=
z
f = @(a, X)a(1)*X(:, 1) .^ (a(2)*X(:, 1)) + ...
a(3)*X(:, 2) .^ (a(4)*(X(:, 1) +X(:, 2))) + ...
a(5)*X(:, 3) .^ (a(6)*(X(:, 1) + X(:, 2) + X(:, 3)));
% XX = load('E:\\Work\\201806\\math_4th\\c8data1.dat');
XX = load('c8data1.dat');
X = XX(:, 1:3);
v = XX(:, 4);
a0 = [2 3 2 1 2 3];
[a, fm] = lsqcurvefit(f, a0, X, v)
08.07 函数的有理式逼近
连分式的数学形式
f(x)=b1+(x−a)c1b2+(x−a)c2b3+x−a)c3b4+(x−a)c4b5+(x−a)c5...
f
(
x
)
=
b
1
+
(
x
−
a
)
c
1
b
2
+
(
x
−
a
)
c
2
b
3
+
x
−
a
)
c
3
b
4
+
(
x
−
a
)
c
4
b
5
+
(
x
−
a
)
c
5
.
.
.
调用格式:cf = contfrac(f, n)
[cf, r] = contfrac(f, n, ‘x=a’)
function key=isanumber(a)
key=0; if length(a)~=1, return; end
switch class(a)
case 'double', key=1;
case 'sym', try, double(a); key=1; catch, end
end
function [cf, r] = contfrac(f, varargin)
[n, a] = default_vals({6,0}, varargin{:});
if isanumber(f)
cf = feval(symengine, 'contfrac', f, n);
p1 = char(cf);
k = strfind(p1, ',');
k1 = strfind(p1, '/');
if nargout > 1
r = sym(p1(k(end)+1:k1-1))/sym(p1(k1+1:end-1));
end
else
if isfinite(a)
str=num2str(a);
else
str='infinity';
end
cf = feval(symengine, 'contfrac', f, ['x=' str], n);
if nargout > 1
r = feval(symengine, 'contfrac::rational', cf);
end
end
例8-28
π
π
的连分数近似
连分数近似cf = contfrac(pi, 20)
结果: 292大于其它值
截断于该项103993/33102
近似值: 3.141592653012
例8-29 函数的连分式近似
原型函数
f(x)=e−xsinx(x+1)3
f
(
x
)
=
e
−
x
sin
x
(
x
+
1
)
3
10级连分式
syms x;
f = sin(x)*exp(-x)/(x+1)^3;
[cf, y] = contfrac(f, 10)
% 不同连分式近似
[cf1, f8] = contfrac(f, 8),
[cf2, f10] = contfrac(f, 10)
连分式拟合效果
% 拟合效果
ezplot(f, [0, 2]);
hold on;
ezplot(f8, [0, 2]);
ezplot(f10, [0, 2]);
figure;
ezplot(f, [0, 5]);
hold on;
ezplot(f8, [0, 5]);
ezplot(f10, [0, 5]);
% 参考点x = 0.5
[cf1, f8] = contfrac(f, 8, 0.5)
ezplot(f, [0, 5]);
hold on;
ezplot(f8, [0, 5]);
hold off;
有理式拟合:Pad
e´
e
´
近似
函数 f(s) 的幂级数展开
f(s)=c0+c1s+c2s2+c3s3+⋯=∑i=0∞cisi
f
(
s
)
=
c
0
+
c
1
s
+
c
2
s
2
+
c
3
s
3
+
⋯
=
∑
i
=
0
∞
c
i
s
i
r/m阶的Pade´近似表示为:
r
/
m
阶
的
P
a
d
e
´
近
似
表
示
为
:
Grm(x)=βr+1sr+βrsr−1+⋯+β1αm+1sm+αmsm−1+⋯+α1=∑i=1r+1βisi−1∑i=1m+1αisi−1
G
m
r
(
x
)
=
β
r
+
1
s
r
+
β
r
s
r
−
1
+
⋯
+
β
1
α
m
+
1
s
m
+
α
m
s
m
−
1
+
⋯
+
α
1
=
∑
i
=
1
r
+
1
β
i
s
i
−
1
∑
i
=
1
m
+
1
α
i
s
i
−
1
α1=1,β1=c1
α
1
=
1
,
β
1
=
c
1
系数计算
系数ci的递推计算c0=bk+1,
系
数
c
i
的
递
推
计
算
c
0
=
b
k
+
1
,
ci=bk+1−i−∑j=0i=1cjan+1−i+j,i=1,2,⋯
c
i
=
b
k
+
1
−
i
−
∑
j
=
0
i
=
1
c
j
a
n
+
1
−
i
+
j
,
i
=
1
,
2
,
⋯
设∑i=0∞cisi=Grm(s),则可写出
设
∑
i
=
0
∞
c
i
s
i
=
G
m
r
(
s
)
,
则
可
写
出
∑i=1m+1αisi−1∑i=0∞cisi=∑i=1r+1βisi−1
∑
i
=
1
m
+
1
α
i
s
i
−
1
∑
i
=
0
∞
c
i
s
i
=
∑
i
=
1
r
+
1
β
i
s
i
−
1
令相应的 s 项系数的值相等,得出
Wx=w,v=Vy
W
x
=
w
,
v
=
V
y
其中:
x=[α2,α3,⋯,αm+1]T
x
=
[
α
2
,
α
3
,
⋯
,
α
m
+
1
]
T
y=[α2,α3,⋯,αr+1]T
y
=
[
α
2
,
α
3
,
⋯
,
α
r
+
1
]
T
w=[−cr+2,−cr+3,⋯,−cm+r+1]T
w
=
[
−
c
r
+
2
,
−
c
r
+
3
,
⋯
,
−
c
m
+
r
+
1
]
T
v=[β2−c2,β3−c3,⋯,βr+1−cr+1]T
v
=
[
β
2
−
c
2
,
β
3
−
c
3
,
⋯
,
β
r
+
1
−
c
r
+
1
]
T
且有
W=⎡⎣⎢⎢⎢⎢⎢cr+1cr+2⋮cr+mcrcr+1⋮cr+m−1⋯⋯⋯⋯0c1⋮cm−1⋯⋯⋱⋯00⋮cr+1⎤⎦⎥⎥⎥⎥⎥
W
=
[
c
r
+
1
c
r
⋯
0
⋯
0
c
r
+
2
c
r
+
1
⋯
c
1
⋯
0
⋮
⋮
⋯
⋮
⋱
⋮
c
r
+
m
c
r
+
m
−
1
⋯
c
m
−
1
⋯
c
r
+
1
]
V=⎡⎣⎢⎢⎢⎢⎢c1c2⋮cr0c1⋮vr−100⋮cr−2⋯⋯⋱⋯00⋮c1⎤⎦⎥⎥⎥⎥⎥
V
=
[
c
1
0
0
⋯
0
c
2
c
1
0
⋯
0
⋮
⋮
⋮
⋱
⋮
c
r
v
r
−
1
c
r
−
2
⋯
c
1
]
编写函数计算
给定函数的
Pade´
P
a
d
e
´
有理数近似调用格式
[n, d] = padefcn(c, r, m)
function [nP, dP] = padefcn(c, r, m)
w = -c(r+2:m+r+1)';
vv = [c(r+1:-1:1)';
zeros(m-1-r,1)];
W = rot90(hankel(c(m+r:-1:r+1),vv));
V = rot90(hankel(c(r:-1:1)));
x = [1 (W\w)'];
y = [1 x(2:r+1)*V'+c(2:r+1)];
dP = x(m+1:-1:1)/x(m+1);
nP = y(r+1:-1:1)/x(m+1);
例8-30 函数的有理近似
给定函数
f(x)=e−2x
f
(
x
)
=
e
−
2
x
求有理函数近似
分别选择分子阶次为0和不同的分母阶次
syms x;
c = taylor(exp(-2*x), 'Order', 10);
c = sym2poly(c);
c = c(end:-1:1);
ezplot(exp(-2*x), [0, 4]);
x = 0: 0.01: 8;
nd = [3:7];
for i = 1: length(nd)
[n, d] = padefcn(c, 0, nd(i));
y = polyval(n, x)./polyval(d, x);
line(x, y);
end;
符号运算
符号运算版本的padefcnsym()函数
function c = polycoef(p, x)
c=[];
n = 0;
p1=p;
n1=1;
nn=1;
if nargin == 1
x=symvar(p);
end
while (1)
c = [c subs(p1, x, 0)];
p1 = diff(p1, x);
n = n+1;
n1 = n1*n;
nn = [nn, n1];
if p1 == 0
c=c./nn(1:end-1);
c=c(end:-1:1);
break;
end
end
function G = padefcnsym(f, r, m)
c = taylor(f, 'Order', r+m+1);
c = polycoef(c);
c = c(end: -1: 1);
w = -c(r+2:m+r+1)';
vv = [c(r+1:-1:1)';
zeros(m-1-r, 1)];
W = rot90(hankel(c(m+r:-1:r+1), vv));
V = rot90(hankel(c(r:-1:1)));
X = [1 (W\w)'];
y = [1 X(2:r+1)*V'+c(2:r+1)];
dP = X(m+1:-1:1)/X(m+1);
nP = y(r+1:-1:1)/X(m+1);
syms x;
G = poly2sym(nP, x)/poly2sym(dP, x);
例8-31 符号运算求取Pade近似
给定函数
f(x)=e−2x
f
(
x
)
=
e
−
2
x
用符号运算方式求取 Pade近似模型
syms x;
f = exp(-2*x);
G = padefcnsym(f, 0, 8)
最终结果
G(x)=3152(x8+4x7+4x6+42x5+105x4+210x3+315x2+315x+315/2)
G
(
x
)
=
315
2
(
x
8
+
4
x
7
+
4
x
6
+
42
x
5
+
105
x
4
+
210
x
3
+
315
x
2
+
315
x
+
315
/
2
)
08.08 特殊函数
误差函数与补误差函数
误差函数
erf(z)=2π−−√∫z0e−t2dt=1π−−√∫z−ze−t2dt
e
r
f
(
z
)
=
2
π
∫
0
z
e
−
t
2
d
t
=
1
π
∫
−
z
z
e
−
t
2
d
t
erf(0)=2π−−√∫00e−t2dt=0,erf(∞)=2π−−√∫∞0e−t2dt=1,erf(−∞)=−1
e
r
f
(
0
)
=
2
π
∫
0
0
e
−
t
2
d
t
=
0
,
e
r
f
(
∞
)
=
2
π
∫
0
∞
e
−
t
2
d
t
=
1
,
e
r
f
(
−
∞
)
=
−
1
补误差函数
erfc(z)=2π−−√∫∞ze−t2dt
e
r
f
c
(
z
)
=
2
π
∫
z
∞
e
−
t
2
d
t
两个函数的关系: erfc(z) = 1 - erf(z)
例8-34 误差函数与补误差函数的曲线
直接绘制:y = erf(z), y = erfc(z)
x = -5: 0.1: 5;
y1 = erf(x);
y2 = erfc(x);
plot(x, y1, x, y2, '--');
Gamma函数
Gamma函数的数学描述
Γ(α)=∫∞0e−ttα−1dt
Γ
(
α
)
=
∫
0
∞
e
−
t
t
α
−
1
d
t
Gamma函数调用格式: y = gamma(x)
其中,x可以为向量,矩阵或其它数据结构
gamma()函数可用于数据与符号运算
特殊性质:
Γ(n+1)=n!,Γ(α+1)=αΓ(α)
Γ
(
n
+
1
)
=
n
!
,
Γ
(
α
+
1
)
=
α
Γ
(
α
)
常用性质:
Γ(12)=π−−√,Γ(α)Γ(1−α)=αsinπα
Γ
(
1
2
)
=
π
,
Γ
(
α
)
Γ
(
1
−
α
)
=
α
sin
π
α
Γ(α)Γ(−α)=−παsinπα
Γ
(
α
)
Γ
(
−
α
)
=
−
π
α
sin
π
α
Γ(12+α)Γ(12−α)=πcosπα
Γ
(
1
2
+
α
)
Γ
(
1
2
−
α
)
=
π
cos
π
α
limα→∞αzΓ(α)Γ(α+z)=1,Rez>0
lim
α
→
∞
α
z
Γ
(
α
)
Γ
(
α
+
z
)
=
1
,
R
e
z
>
0
例8-37 Gamma函数曲线
试绘制(-4, 3)区间内Gamma函数的曲线
x = -4: 0.0001: 3;
plot(x, gamma(x));
ylim([-40, 40]);
注意:
Γ(α+1)=αΓ(α),Γ(1)=1
Γ
(
α
+
1
)
=
α
Γ
(
α
)
,
Γ
(
1
)
=
1
若α为非负整数,则Γ(α+1)=α!
若
α
为
非
负
整
数
,
则
Γ
(
α
+
1
)
=
α
!
若α为负整数,则Γ(α+1)趋于±∞
若
α
为
负
整
数
,
则
Γ
(
α
+
1
)
趋
于
±
∞
例8-38 不可积函数的解析求解
试写出下面无穷积分的“解析解”
I1=∫π/20sin2m−1tcos2n−1tdt
I
1
=
∫
0
π
/
2
sin
2
m
−
1
t
cos
2
n
−
1
t
d
t
I2=∫∞0tx−1costdt,x>0
I
2
=
∫
0
∞
t
x
−
1
c
o
s
t
d
t
,
x
>
0
syms m n t z;
syms x positive;
I1 = int(sin(t)^(2*m-1)*cos(t)^(2*n-1), t, 0, pi/2)
I2 = simplify(int(t^(x-1)*cos(t), t, 0, inf))
不完整Gamma函数
不完整
Γ
Γ
-函数的数学描述
Γ(x,α)=1Γ(α)∫x0e−ttα−1dt,x≥0
Γ
(
x
,
α
)
=
1
Γ
(
α
)
∫
0
x
e
−
t
t
α
−
1
d
t
,
x
≥
0
求取不完整
Γ
Γ
-函数的调用格式
y = gammainc(x, b)
Beta函数
Beta函数的数学描述
B(z,m)=∫10tz−1(1−t)m−1dt,Re(m)>0,Re(z)>0
B
(
z
,
m
)
=
∫
0
1
t
z
−
1
(
1
−
t
)
m
−
1
d
t
,
R
e
(
m
)
>
0
,
R
e
(
z
)
>
0
B(z,m)=Γ(z)Γ(m)Γ(z+m)
B
(
z
,
m
)
=
Γ
(
z
)
Γ
(
m
)
Γ
(
z
+
m
)
Beta函数的调用格式: y = beta(m, z)
Bessel函数
对于Bessel微分方程
t2d2xdt2+tdxdt+(t2−λ2)x=0
t
2
d
2
x
d
t
2
+
t
d
x
d
t
+
(
t
2
−
λ
2
)
x
=
0
该方程的通解为
x(t)=C1Jλ(t)+C2J−λ(t)
x
(
t
)
=
C
1
J
λ
(
t
)
+
C
2
J
−
λ
(
t
)
其中,C1和C2为任意常数
其
中
,
C
1
和
C
2
为
任
意
常
数
Bessel函数计算
第一类Bessel函数调用格式: y = besselj(
λ,x
λ
,
x
)
第二类Bessel函数调用格式: y = bessely(
λ,x
λ
,
x
)
第三类Bessel函数调用格式: y = besselh(
λ,x
λ
,
x
)
其中,
λ
λ
为阶次
Legendre函数
对于Legendre微分方程
(1−t2)d2xdt2−2tdxdt+n(n+1)x=0
(
1
−
t
2
)
d
2
x
d
t
2
−
2
t
d
x
d
t
+
n
(
n
+
1
)
x
=
0
该方程的通解为
x(t)=C1Pn(t)+C2Qn(t)
x
(
t
)
=
C
1
P
n
(
t
)
+
C
2
Q
n
(
t
)
其中,C1和C2为任意常数
其
中
,
C
1
和
C
2
为
任
意
常
数
Legendre函数计算
计算关联Legendre函数
Pmn(t)
P
n
m
(
t
)
调用格式: Y = legendre(n, x)
其中, Y为一个矩阵,其各行分别为
P0n(x),P1n(x),⋯,Pnn(x)
P
n
0
(
x
)
,
P
n
1
(
x
)
,
⋯
,
P
n
n
(
x
)
该函数要求:
−1<x<1
−
1
<
x
<
1
例8-41 Legendre 函数曲线
x = -1: 0.04: 1;
Y = legendre(2, x);
plot(x, Y);
超几何函数
超几何函数的一般形式
pFq(a1,⋯,ap;b1,⋯,bq;z)=Γ(b1)⋯Γ(bq)Γ(a1)⋯Γ(ap)∑k=0∞Γ(a1+k)⋯Γ(ap+k)zkΓ(b1+k)⋯Γ(bq+k)k!
p
F
q
(
a
1
,
⋯
,
a
p
;
b
1
,
⋯
,
b
q
;
z
)
=
Γ
(
b
1
)
⋯
Γ
(
b
q
)
Γ
(
a
1
)
⋯
Γ
(
a
p
)
∑
k
=
0
∞
Γ
(
a
1
+
k
)
⋯
Γ
(
a
p
+
k
)
z
k
Γ
(
b
1
+
k
)
⋯
Γ
(
b
q
+
k
)
k
!
符号运算: y = hypergeom(
[a1,⋯,ap],[b1,⋯,bq],z
[
a
1
,
⋯
,
a
p
]
,
[
b
1
,
⋯
,
b
q
]
,
z
)
数值运算:
y1
y
1
= subs(
y,z,x0
y
,
z
,
x
0
)
08.09 Mittag-Leffler函数
Mittag-Leffler函数
指数函数的幂级数展开
ez=∑k=0∞zkk!=∑k=0∞zkΓ(k+1)
e
z
=
∑
k
=
0
∞
z
k
k
!
=
∑
k
=
0
∞
z
k
Γ
(
k
+
1
)
单参数 Mittag-Leffler 函数
E1(z)=ez
E
1
(
z
)
=
e
z
Eα(z)=∑k=0∞zkΓ(αk+1),Re(α)>0
E
α
(
z
)
=
∑
k
=
0
∞
z
k
Γ
(
α
k
+
1
)
,
R
e
(
α
)
>
0
其它常用的单参数 Mittag-Leffler 函数
E2(z)=∑k=0∞zkΓ(2k+1)=∑k=0∞(z√)2k(2k)!=coshz√
E
2
(
z
)
=
∑
k
=
0
∞
z
k
Γ
(
2
k
+
1
)
=
∑
k
=
0
∞
(
z
)
2
k
(
2
k
)
!
=
cosh
z
E1/2(z)=∑k=0∞zkΓ(k/2+1)=ez2(1+erf(z))=ez2erfc(−z)
E
1
/
2
(
z
)
=
∑
k
=
0
∞
z
k
Γ
(
k
/
2
+
1
)
=
e
z
2
(
1
+
e
r
f
(
z
)
)
=
e
z
2
e
r
f
c
(
−
z
)
双参数 Mittag-Leffler 函数
Re(α)>0,Re(β)>0
R
e
(
α
)
>
0
,
R
e
(
β
)
>
0
Eα,β(z)=∑k=0∞zkΓ(αk+β),Eα,1(z)=Eα(z)
E
α
,
β
(
z
)
=
∑
k
=
0
∞
z
k
Γ
(
α
k
+
β
)
,
E
α
,
1
(
z
)
=
E
α
(
z
)
双参数Mittag-Leffler函数的一些公式
E1,2(z)=∑k=0∞zkΓ(k+2)=1z∑k=0∞zk+1(k+1)!=ez−1z
E
1
,
2
(
z
)
=
∑
k
=
0
∞
z
k
Γ
(
k
+
2
)
=
1
z
∑
k
=
0
∞
z
k
+
1
(
k
+
1
)
!
=
e
z
−
1
z
E1,3(z)=∑k=0∞zkΓ(k+3)=ez−1−zz2
E
1
,
3
(
z
)
=
∑
k
=
0
∞
z
k
Γ
(
k
+
3
)
=
e
z
−
1
−
z
z
2
E1,m(z)=∑k=0∞zkΓ(k+m)=1zm−1(ez−∑k=0m−2zkk!)
E
1
,
m
(
z
)
=
∑
k
=
0
∞
z
k
Γ
(
k
+
m
)
=
1
z
m
−
1
(
e
z
−
∑
k
=
0
m
−
2
z
k
k
!
)
E2,2(z)=∑k=0∞zkΓ(2k+2)=1z∑k=0∞(z√)2k+1(2k+1)!=sinhz√z√
E
2
,
2
(
z
)
=
∑
k
=
0
∞
z
k
Γ
(
2
k
+
2
)
=
1
z
∑
k
=
0
∞
(
z
)
2
k
+
1
(
2
k
+
1
)
!
=
sinh
z
z
% Mittag-Leffler解析函数
function f = mittag_leffler(aa, z)
aa = [aa 1];
a = aa(1);
b = aa(2);
syms k;
f = simplify(symsum(z^k/gamma(a*k+b), k, 0, inf));
函数入口:
f1 = mittag_leffler(
α
α
, z)
f1 = mittag_leffler([
α,β
α
,
β
], z)
例8-36 Mittag-Leffler函数
单参数 Mittag-Leffler 函数推导
α=1/3,3,4,5
α
=
1
/
3
,
3
,
4
,
5
syms z;
I1 = mittag_leffler(1/sym(3), z),
I2 = mittag_leffler(3, z)
I3 = mittag_leffler(4, z)
I4 = mittag_leffler(5, z)
% 在matlab2008a下可以求出非超几何函数
例8-37 双参数 Mittag-Leffler 函数推导
syms z;
I5 = mittag_leffler([4, 1], z),
I6 = mittag_leffler([4, 5], z),
I7 = mittag_leffler([5, 6], z),
I8 = mittag_leffler([1/sym(2), 4], z)
双参数 Mittag-Leffler 函数的整数阶导数
dndznEα,β(z)=∑k=0∞(k+n)!k!Γ(αk+αn+β)zk
d
n
d
z
n
E
α
,
β
(
z
)
=
∑
k
=
0
∞
(
k
+
n
)
!
k
!
Γ
(
α
k
+
α
n
+
β
)
z
k
调用格式:
f = ml_func(
α,z,n,ϵ0
α
,
z
,
n
,
ϵ
0
)
f = ml_func(
[α,β],z,n,ϵ0
[
α
,
β
]
,
z
,
n
,
ϵ
0
)
function f = ml_func(aa, z, varargin)
aa=[aa,1,1,1]; a=aa(1); b=aa(2); c=aa(3); q=aa(4); f=0; k=0; fa=1;
[n,eps0]=default_vals({0,eps},varargin{:});
if n==0
while norm(fa,1)>=eps0
fa=gamma(k*q+c)/gamma(c)/gamma(k+1)/gamma(a*k+b) *z.^k;
f=f+fa; k=k+1;
end
if ~isfinite(f(1))
if c*q==1
f=mlf(a,b,z,round(-log10(eps0))); f=reshape(f,size(z));
else, error('Error: truncation method failed'); end, end
else
aa(2)=aa(2)+n*aa(1); aa(3)=aa(3)+aa(4)*n;
f=gamma(q*n+c)/gamma(c)*ml_func(aa,z,0,eps0);
end
例8-38 Mittag-Leffler函数
得出
E1/2,4(z)
E
1
/
2
,
4
(
z
)
的解析解与数值解(比较耗时)
syms z;
I8 = mittag_leffler([1/sym(2), 4], z);
t = 0: 0.01: 2;
y = subs(I8, z, t);
y1 = ml_func([1/2, 4], t);
plot(t, y, t, y1, '--');
% 数值解
t = 0: 0.01: 0.5;
y1 = ml_func([1/2, 4], t);
plot(t, y1);
例8-46 绘制函数
E0.8,0.9(z)的实部与虚部表面图
E
0.8
,
0.9
(
z
)
的
实
部
与
虚
部
表
面
图
假设 z 是复数变量
% 生成网格, 构造复数矩阵, 绘制实部表面图
[x, y] = meshgrid(-6: 0.2: 6);
z = x + sqrt(-1)*y;
L = ml_func([0.8, 0.9], z);
L1 = real(L);
ii = find(L1 > 3);
L1(ii) = 3;
ii = find(L1 < -3);
L1(ii) = -3;
surf(x, y, L1);
axis([-6 6 -6 6 -3 3])
% 虚部表面图
figure;
L2 = imag(L);
ii = find(L2 > 3);
L2(ii) = 3;
ii = find(L2 < -3);
L2(ii) = -3;
surf(x, y, L2);
axis([-6 6 -6 6 -3 3]);
多参数Mittag-Leffler函数
三参数Mittag_leffler函数
Eγα,β(z)=∑k=0∞(γ)kΓ(αk+β)zkk!,Re(⋅)>0
E
α
,
β
γ
(
z
)
=
∑
k
=
0
∞
(
γ
)
k
Γ
(
α
k
+
β
)
z
k
k
!
,
R
e
(
⋅
)
>
0
四参数Mittag_leffler函数
Eγ,qα,β(z)=∑k=0∞(γ)kqΓ(αk+β)zkk!,q∈N
E
α
,
β
γ
,
q
(
z
)
=
∑
k
=
0
∞
(
γ
)
k
q
Γ
(
α
k
+
β
)
z
k
k
!
,
q
∈
N
Pochhammer符号
(γ)k=γ(γ+1)(γ+2)⋯(γ+k−1)=Γ(k+γ)Γ(γ)
(
γ
)
k
=
γ
(
γ
+
1
)
(
γ
+
2
)
⋯
(
γ
+
k
−
1
)
=
Γ
(
k
+
γ
)
Γ
(
γ
)
Eα,β(z)=E1α,β(z),Eγα,β(z)=Eγ,1α,β(z)
E
α
,
β
(
z
)
=
E
α
,
β
1
(
z
)
,
E
α
,
β
γ
(
z
)
=
E
α
,
β
γ
,
1
(
z
)
Mittag-Leffler函数的导数
n阶导数公式
dndznEγ,qα,β(z)=(γ)qnEγ+qn,qα,β+nα(z)
d
n
d
z
n
E
α
,
β
γ
,
q
(
z
)
=
(
γ
)
q
n
E
α
,
β
+
n
α
γ
+
q
n
,
q
(
z
)
matlab求解:
f = ml_func(
α,z,n,ϵ0
α
,
z
,
n
,
ϵ
0
)
f = ml_func(
[α,β],z,n,ϵ0
[
α
,
β
]
,
z
,
n
,
ϵ
0
)
f = ml_func(
[α,β,γ],z,n,ϵ0
[
α
,
β
,
γ
]
,
z
,
n
,
ϵ
0
)
f = ml_func(
[α,β,γ,q],z,n,ϵ0
[
α
,
β
,
γ
,
q
]
,
z
,
n
,
ϵ
0
)
08.10 信号的相关分析
信号的相关分析
信号
x(t)
x
(
t
)
的自相关函数的定义:
Rxx(τ)=limT→∞1T∫T0x(t)x(t+τ)dt,τ≥0
R
x
x
(
τ
)
=
lim
T
→
∞
1
T
∫
0
T
x
(
t
)
x
(
t
+
τ
)
d
t
,
τ
≥
0
且相关函数为偶函数,即
Rxx(−τ)=Rxx(τ)
R
x
x
(
−
τ
)
=
R
x
x
(
τ
)
两个信号
x(τ)和y(τ)
x
(
τ
)
和
y
(
τ
)
的互相关函数为:
Rxy(τ)=limT→∞1T∫T0x(t)y(t+τ)dt,τ≥0
R
x
y
(
τ
)
=
lim
T
→
∞
1
T
∫
0
T
x
(
t
)
y
(
t
+
τ
)
d
t
,
τ
≥
0
例8-39 自相关函数计算
给定信号
x(t)=A1cos(ω1t+θ1)+A2cos(ω2t+θ2)
x
(
t
)
=
A
1
cos
(
ω
1
t
+
θ
1
)
+
A
2
cos
(
ω
2
t
+
θ
2
)
求它的自相关函数
syms A1 A2 w1 w2 t1 t2 t tau T;
x = A1*cos(w1*t + t1) + A2*cos(w2*t + t2);
Rxx = simplify(limit(int(x*subs(x, t, t+tau), t, -T, T)/2/T, T, inf))
结果:
Rxx(τ)=12A21cos(ω1τ)+12A22cos(ω2τ)
R
x
x
(
τ
)
=
1
2
A
1
2
cos
(
ω
1
τ
)
+
1
2
A
2
2
cos
(
ω
2
τ
)
相关分析的数值方法
在实验中测出两组数值:
xi,yi,(i=1,2,⋯,n)
x
i
,
y
i
,
(
i
=
1
,
2
,
⋯
,
n
)
计算两组数据的相关系数
γxy=∑(xi−x¯)(yi−y¯)−−−−−−−−−−−−−−−√(xi−x¯)2−−−−−−−√(yi−y¯)2−−−−−−−√
γ
x
y
=
∑
(
x
i
−
x
¯
)
(
y
i
−
y
¯
)
(
x
i
−
x
¯
)
2
(
y
i
−
y
¯
)
2
求取已知向量的相关系数矩阵
R = corrcoef(x, y)
R = corrcoef([x, y])
例 8-40 相关系数矩阵
用下列两个原型函数分别生成一组数据, 并求取其相关系数矩阵
y2=te−4tcos3t和y1=te−4tsin3t
y
2
=
t
e
−
4
t
cos
3
t
和
y
1
=
t
e
−
4
t
sin
3
t
x = 0: 0.01: 5;
y1 = x.* exp(-4*x) .* sin(3*x);
y2 = x .* exp(-4*x) .* cos(3*x);
R = corrcoef(y1, y2)
相关函数计算
在实验中测出两组数据
xi,yi,(i=1,2,⋯,n)
x
i
,
y
i
,
(
i
=
1
,
2
,
⋯
,
n
)
定义 x 序列的自相关函数
cxx(k)=1N∑l=1n−[k]−1x(l)x(k+l),0≤k≤m−1
c
x
x
(
k
)
=
1
N
∑
l
=
1
n
−
[
k
]
−
1
x
(
l
)
x
(
k
+
l
)
,
0
≤
k
≤
m
−
1
其中, m < n, 自相关函数是偶函数
定义出相关函数
cxy(k)=1N∑l=1n−[k]−1x(l)y(k+l),0≤k≤m−1
c
x
y
(
k
)
=
1
N
∑
l
=
1
n
−
[
k
]
−
1
x
(
l
)
y
(
k
+
l
)
,
0
≤
k
≤
m
−
1
求自相关的调用格式
Cxx
C
x
x
= xcorr(x, N)
求互相关的调用格式
Cxx
C
x
x
= xcorr(x, y, N)
其中, N为k的最大取值, 可以忽略
例8.41 相关函数
用函数
y1=te−4tsin3t,y2=te−4tcos3t
y
1
=
t
e
−
4
t
sin
3
t
,
y
2
=
t
e
−
4
t
cos
3
t
生成一组数据,用数值方法计算相关函数
并和已知理论曲线进行比较
t = 0: 0.01: 5;
x = t.*exp(-4*t).*sin(3*t);
y = t.*exp(-4*t).*cos(3*t);
N = 150;
c1 = xcorr(x, N);
x1 = [-N: N];
stem(x1, c1);
figure;
c1 = xcorr(x, y, N);
x1 = [-N: N];
stem(x1, c1)
08.11 信号滤波与滤波器设计
例8-42 污染的信号
给定信号
y(x)=e−xsin(5x)
y
(
x
)
=
e
−
x
sin
(
5
x
)
叠加标准误差为
σ=0.05
σ
=
0.05
的零均值的白噪声信号
绘制噪声污染后的信号曲线
x = 0: 0.002: 2;
y = exp(-x).*sin(5*x);
r = 0.05*randn(size(x));
y1 = y + r;
plot(x, y1);
线性滤波器的一般模型
离散线性时不变滤波器模型一般表达式为:
H(z)=b1+b2z1+b3z−2+⋯+bn+1z−n1+a1z−1+a2z−2+⋯+amz−m
H
(
z
)
=
b
1
+
b
2
z
1
+
b
3
z
−
2
+
⋯
+
b
n
+
1
z
−
n
1
+
a
1
z
−
1
+
a
2
z
−
2
+
⋯
+
a
m
z
−
m
假设输入信号为 x(n), 则经过滤波器后的输出信号为:
y(k)=−a1y(k−1)−⋯−amy(k−m)+b1x(k)+b2x(k−1)+⋯+bn+1x(k−n)
y
(
k
)
=
−
a
1
y
(
k
−
1
)
−
⋯
−
a
m
y
(
k
−
m
)
+
b
1
x
(
k
)
+
b
2
x
(
k
−
1
)
+
⋯
+
b
n
+
1
x
(
k
−
n
)
三种滤波器类型
根据n和m的不同取值,定义常用的滤波器
FIR滤波器:又称为有限长脉冲响应滤波器, m = 0, a为标量,称为移动平均模型(MA)
IIR滤波器:又称全极点无限长脉冲响应滤波器,也称自回归模型(AR),n = 0, b为标量
ARMA滤波器:又称为一般IIR滤波器,也称为自回归移动平均模型(ARMA),要求n与m均不为0
滤波的信号向量调用格式: y = filter(b, a, x)
a,b 向量表示滤波器, x为需要过滤的信号
对滤波器进行放大倍数分析
[h, w] = freqz(b, a, N)
只获得放大倍数的幅值
plot(w, abs(h))
例8-43 滤波器效果
假设已经设计滤波器H(z)如下, 试得出该滤波器的放大倍数, 并观察滤波后的信号
A(z)=1.2296×10−6(1+z−1)7
A
(
z
)
=
1.2296
×
10
−
6
(
1
+
z
−
1
)
7
B(z)=1−0.7265z−1
B
(
z
)
=
1
−
0.7265
z
−
1
C(z)=1−1.488z−1+0.5641z−2
C
(
z
)
=
1
−
1.488
z
−
1
+
0.5641
z
−
2
D(z)=1−1.595z−1+0.6769z−2
D
(
z
)
=
1
−
1.595
z
−
1
+
0.6769
z
−
2
E(z)=1−1.78z−1+0.8713z−2
E
(
z
)
=
1
−
1.78
z
−
1
+
0.8713
z
−
2
H(z)=A(z)B(z)C(z)D(z)E(z)
H
(
z
)
=
A
(
z
)
B
(
z
)
C
(
z
)
D
(
z
)
E
(
z
)
b = 1.2296e-6*conv([1 4 6 4 1], [1 3 3 1]);
a = conv([1, -0.7265], ...
conv([1, -1.488, 0.5644], ...
conv([1, -1.595, 0.6769], ...
[1, -1.78, 0.8713])));
x = 0: 0.002: 2;
y = exp(-x).*sin(5*x);
r = 0.05*randn(size(x));
y1 = y+r;
[h, w] = freqz(b, a, 100);
plot(w, abs(h))
figure;
y2 = filter(b, a, y1);
plot(x, y1, x, y2);
滤波器及matlab实现
常用的滤波器类型
Butterworth滤波器
[b, a] = butter(n,
wn
w
n
)
Chebyshev I 型滤波器
[b, a] = cheby1(n, r,
wn
w
n
)
Chebyshev II型滤波器
[b, a] = cheby2(n, r,
wn
w
n
)
例8-44 滤波器仿真
给定信号
y(x)=e−xsin(5x)
y
(
x
)
=
e
−
x
sin
(
5
x
)
叠加标准差为
σ=0.05
σ
=
0.05
的零均值的白噪声信号
试对阶次及不同的
wn
w
n
值, 设计Butterworth 滤波器并比较滤波效果
wn=1
w
n
=
1
f1 = figure;
f2 = figure;
for n = 5: 2: 20
figure(f1);
[b, a] = butter(n, 0.1);
y2 = filter(b, a, y1);
plot(x, y2);
hold on;
figure(f2);
[h, w] = freqz(b, a, 100);
plot(w, abs(h));
hold on;
end;
阶次为7时
f1 = figure;
f2 = figure;
for wn = 0.1: 0.1: 0.7
figure(f1);
[b, a] = butter(7, wn);
y2 = filter(b, a, y1);
plot(x, y2);
hold on;
figure(f2);
[h, w] = freqz(b, a, 100);
plot(w, abs(h));
hold on;
end
其它滤波器
设计高通滤波器
[b, a] = butter(n,
wn
w
n
, ‘high’)
设计带通滤波器
[b, a] = butter(n, [
w1,w2
w
1
,
w
2
])