实际问题中,仅能观测到函数f(x)在某区间[a,b]上一系列点的值 y i = f ( x i ) , i = 0 , 1 , ⋯ , n y_i=f(x_i)\ ,i=0,1,\cdots,n yi=f(xi) ,i=0,1,⋯,n。想得知观测点之间的函数值时,可用插值或拟合进行近似。
- 插值:用较简单的、满足一定条件的函数 φ ( x ) \varphi(x) φ(x)代替 f ( x ) f(x) f(x),且插值函数满足 φ ( x i ) = y i , i = 0 , 1 , ⋯ , n \varphi(x_i)=y_i\ ,i=0,1,\cdots,n φ(xi)=yi ,i=0,1,⋯,n
- 拟合:拟合的近似函数不要求过已知数据点,只要求在某种意义下在这些点上的总偏差最小
1. 插值方法
1.1 分段线性插值
将每两个相邻的节点用直线连起来,如此形成的一条折线就是分段线性插值函数,记为
I
n
(
x
)
I_n(x)
In(x),满足
I
n
(
x
i
)
=
y
i
I_n(x_i)=y_i
In(xi)=yi,且
I
n
(
x
)
I_n(x)
In(x)在每个小区间
[
x
i
,
x
i
+
1
]
[x_i,x_{i+1}]
[xi,xi+1]上是线性函数。
I
n
(
x
)
I_n(x)
In(x)可以表示为
I
n
(
x
)
=
∑
i
=
0
n
y
i
l
i
(
x
)
I_n(x)=\sum_{i=0}^ny_il_i(x)
In(x)=∑i=0nyili(x),其中
l
i
(
x
)
=
{
x
−
x
i
−
1
x
i
−
x
i
−
1
,
x
∈
[
x
i
−
1
,
x
i
]
,
i
≠
0
x
−
x
i
+
1
x
i
−
x
i
+
1
,
x
∈
[
x
i
,
x
i
+
1
]
,
i
≠
n
0
,
其
他
l_i(x)=\begin{cases}\cfrac{x-x_{i-1}}{x_i-x_{i-1}}\ ,x\in [x_{i-1},x_i]\ ,i\neq 0 \\ \cfrac{x-x_{i+1}}{x_i-x_{i+1}}\ ,x\in [x_{i},x_{i+1}]\ ,i\neq n \\ 0\ ,其他\end{cases}
li(x)=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧xi−xi−1x−xi−1 ,x∈[xi−1,xi] ,i=0xi−xi+1x−xi+1 ,x∈[xi,xi+1] ,i=n0 ,其他用
I
n
(
x
)
I_n(x)
In(x)计算x点的插值时,只用到x左右的两个节点,计算量与节点个数n无关。但n越大,分段越多,插值误差越小。
1.2 拉格朗日插值多项式
拉格朗日插值的基函数为
l
i
(
x
)
=
∏
j
=
0
j
≠
i
n
x
−
x
j
x
i
−
x
j
,
i
=
0
,
1
,
⋯
,
n
l_i(x)=\prod_{j=0\atop j\neq i}^n \cfrac{x-x_j}{x_i-x_j}\ ,i=0,1,\cdots,n
li(x)=j=ij=0∏nxi−xjx−xj ,i=0,1,⋯,n其中
l
i
(
x
)
l_i(x)
li(x)是n次多项式,满足
l
i
(
x
j
)
=
{
0
,
j
≠
i
1
,
j
=
i
l_i(x_j)=\begin{cases}0\ ,j\neq i \\ 1\ ,j=i\end{cases}
li(xj)={0 ,j=i1 ,j=i拉格朗日插值函数为
L
n
(
x
)
=
∑
i
=
0
n
y
i
l
i
(
x
)
=
∑
i
=
0
n
y
i
(
∏
j
=
0
j
≠
i
n
x
−
x
j
x
i
−
x
j
)
L_n(x)=\sum_{i=0}^ny_il_i(x)=\sum_{i=0}^ny_i(\prod_{j=0\atop j\neq i}^n \cfrac{x-x_j}{x_i-x_j})
Ln(x)=i=0∑nyili(x)=i=0∑nyi(j=ij=0∏nxi−xjx−xj)
1.3 样条插值
许多工程问题对插值函数的光滑性有较高的要求,要求曲线不仅要连续,而且要有连续的曲率,这就导致了样条插值的产生。
1.3.1 样条函数的概念
数学上将具有一定光滑性的分段多项式称为样条函数。具体地说,给定区间[a,b]的一个划分
Δ
:
a
=
x
0
<
x
1
<
⋯
<
x
n
−
1
<
x
n
=
b
\Delta:a=x_0<x_1<\cdots<x_{n-1}<x_n=b
Δ:a=x0<x1<⋯<xn−1<xn=b如果函数S(x)满足:
- 在每个小区间 [ x i , x i + 1 ] [x_i,x_{i+1}] [xi,xi+1]上S(x)是m次多项式
- S(x)在[a,b]上具有m-1阶连续导数
则称S(x)为关于划分 Δ \Delta Δ的m次样条函数,其图形为m次样条曲线。折线是一次样条曲线。
1.3.2 三次样条插值
取插值函数为样条函数,即为样条插值。记函数S(x)为f(x)的三次样条插值函数,且有
S
(
x
)
=
{
S
i
(
x
)
,
x
∈
[
x
i
,
x
i
+
1
]
,
i
=
0
,
1
,
⋯
,
n
−
1
}
S
i
(
x
)
=
a
i
x
3
+
b
i
x
2
+
c
i
x
+
d
i
S(x)=\left\{S_i(x)\ ,x\in [x_i,x_{i+1}]\ ,i=0,1,\cdots,n-1\right\}\\ S_i(x)=a_ix^3+b_ix^2+c_ix+d_i
S(x)={Si(x) ,x∈[xi,xi+1] ,i=0,1,⋯,n−1}Si(x)=aix3+bix2+cix+di式中
a
i
,
b
i
,
c
i
,
d
i
a_i,b_i,c_i,d_i
ai,bi,ci,di为待定系数,共4n个。由二阶连续可微的性质有
{
S
i
(
x
i
+
1
)
=
S
i
+
1
(
x
i
+
1
)
S
’
i
(
x
i
+
1
)
=
S
’
i
+
1
(
x
i
+
1
)
S
’
’
i
(
x
i
+
1
)
=
S
’
’
i
+
1
(
x
i
+
1
)
,
i
=
0
,
1
,
⋯
,
n
−
2
\begin{cases}S_i(x_{i+1})=S_{i+1}(x_{i+1})\\ S’_i(x_{i+1})=S’_{i+1}(x_{i+1})\\S’’_i(x_{i+1})=S’’_{i+1}(x_{i+1})\end{cases},i=0,1,\cdots,n-2
⎩⎪⎨⎪⎧Si(xi+1)=Si+1(xi+1)S’i(xi+1)=S’i+1(xi+1)S’’i(xi+1)=S’’i+1(xi+1),i=0,1,⋯,n−2联立
S
(
x
i
)
=
y
i
(
i
=
0
,
1
,
⋯
,
n
)
S(x_i)=y_i(i=0,1,\cdots,n)
S(xi)=yi(i=0,1,⋯,n)共有4n-2个方程,为确定S(x)的4n个待定参数,需再给出两个边界条件。
常用的三次样条函数的边界条件由3种类型:
-
S
’
(
a
)
=
y
’
0
,
S
’
(
b
)
=
y
’
n
S’(a)=y’_0,S’(b)=y’_n
S’(a)=y’0,S’(b)=y’n。由这种边界条件建立的样条插值函数称为f(x)的完备三次样条插值函数。
如果f’(x)不知道,可要求S’(x)与f’(x)在端点处近似相等。此时以 x 0 , x 1 , x 2 , x 3 x_0,x_1,x_2,x_3 x0,x1,x2,x3为节点作一个三次Newton插值多项式 N a ( x ) N_a(x) Na(x),以 x n , x n − 1 , x n − 2 , x n − 3 x_n,x_{n-1},x_{n-2},x_{n-3} xn,xn−1,xn−2,xn−3为节点作一个三次Newton插值多项式 N b ( x ) N_b(x) Nb(x),要求 S ’ ( a ) = N a ′ ( a ) , S ’ ( b ) = N ’ b ( b ) S’(a)=N'_a(a),S’(b)=N’_b(b) S’(a)=Na′(a),S’(b)=N’b(b)。由这种边界条件建立的三次样条称为f(x)的Lagrange三次样条插值函数。 - S ’ ’ ( a ) = y ’ ’ 0 , S ’ ’ ( b ) = y ’ ’ n S’’(a)=y’’_0,S’’(b)=y’’_n S’’(a)=y’’0,S’’(b)=y’’n。特别地, y ’ ’ 0 = y ’ ’ n = 0 y’’_0=y’’_n=0 y’’0=y’’n=0时,称为自然边界条件。
- S ’ ( a + 0 ) = S ’ ( b − 0 ) , S ’ ’ ( a + 0 ) = S ’ ’ ( b − 0 ) S’(a+0)=S’(b-0),S’’(a+0)=S’’(b-0) S’(a+0)=S’(b−0),S’’(a+0)=S’’(b−0),此条件称为周期条件。
1.4 Matlab插值工具箱
1.4.1 一维插值函数
y=interp1(x0,y0,x,’method’) %其中x0,y0为已知数据点,x为插值点,y为插值点的函数值,method指定插值的方法,默认为线性插值,其值可以为:
‘nearest’最近项插值 ‘linear’线性插值 ‘spline’立方样条插值 ‘cubic’立方插值 所有的插值方法要求x0是单调的
1.4.2 三次样条插值
如果三次样条插值没有边界条件,最常用的方法就是采用非扭结(not-a-knot)条件。该条件强迫第一个和第二个三次多项式的三阶导数相等,最后一个和倒数第二个三次多项式的三阶导数相等。
Matlab中三次样条插值由如下函数:
y=interp1(x0,y0,x,’spline’)
y=spline(x0,y0,x)
pp=csape(x0,y0) %提倡使用该函数,csape的返回值是pp形式,要得到插值点的函数值,需调用函数fnval
y=fnval(pp,x),默认边界条件为Lagrange边界条件
pp=csape(x0,y0,conds,valconds) %conds指定插值的边界条件,当边界设为二阶导数时,valconds给定二阶导数的值
1.4.3 二维插值
若节点是二维的,插值函数就是二元函数,即曲面。
- 插值节点为网格节点
z=interp2(x0,y0,z0,x,y,’method’) %x0,y0分别为m维和n维向量,表示节点;z0为n*m矩阵,表示节点值
%x,y为一维数组,表示插值点;z为矩阵,其行数为y的维数,列数为x的维数,表示得到的插值
pp=csape({x0,y0},z0,conds,valconds),z=fnval(pp,{x,y}) %三次样条插值
- 插值节点为散乱节点
ZI=griddata(x,y,z,XI,YI) %x,y,z均为n维向量,指明所给数据点的横、纵、竖坐标
%向量XI,YI为给定网格点的横坐标和纵坐标,ZI为网格(XI,YI)处的函数值
2. 曲线拟合的线性最小二乘法
2.1 线性最小二乘法
已知一组数据,即平面上n个点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi),要寻找一个函数f(x)使曲线拟合最好。线性最小二乘法是解决曲线拟合最常用的方法,基本思路是,令
f
(
x
)
=
a
1
r
1
(
x
)
+
a
2
r
2
(
x
)
+
⋯
+
a
m
r
m
(
x
)
f(x)=a_1r_1(x)+a_2r_2(x)+\cdots+a_mr_m(x)
f(x)=a1r1(x)+a2r2(x)+⋯+amrm(x)其中
r
k
(
x
)
r_k(x)
rk(x)为事先选定的一组线性无关的函数,
a
k
a_k
ak为待定系数,m<n。拟合准则是使
y
i
y_i
yi与
f
(
x
i
)
f(x_i)
f(xi)的距离
δ
i
\delta_i
δi的平方和最小,称为最小二乘准则。
2.1.1 系数
a
k
a_k
ak的确定
记
J
(
a
1
,
⋯
,
a
m
)
=
∑
i
=
1
n
δ
i
2
=
∑
i
=
1
n
[
f
(
x
i
)
−
y
i
]
2
J(a_1,\cdots,a_m)=\sum_{i=1}^n\delta_i^2=\sum_{i=1}^n[f(x_i)-y_i]^2
J(a1,⋯,am)=i=1∑nδi2=i=1∑n[f(xi)−yi]2要使J达到最小,即要
∂
J
∂
a
j
=
0
\cfrac{\partial J}{\partial a_j}=0
∂aj∂J=0,可得到关于
a
1
,
⋯
.
a
m
a_1,\cdots.a_m
a1,⋯.am的线性方程组,矩阵化后为
R
T
R
A
=
R
T
Y
\bm{R^TRA=R^TY}
RTRA=RTY式中
R
=
[
r
1
(
x
1
)
⋯
r
m
(
x
1
)
⋮
⋮
⋮
r
1
(
x
n
)
⋯
r
m
(
x
n
)
]
n
×
m
,
A
=
[
a
1
,
⋯
,
a
m
]
T
,
Y
=
[
y
1
,
⋯
,
y
n
]
T
\bm{R}=\begin{bmatrix}r_1(x_1) & \cdots & r_m(x_1) \\ \vdots & \vdots & \vdots \\ r_1(x_n) & \cdots & r_m(x_n)\end{bmatrix}_{n\times m},\bm{A}=[a_1,\cdots,a_m]^T\ ,\bm{Y}=[y_1,\cdots,y_n]^T
R=⎣⎢⎡r1(x1)⋮r1(xn)⋯⋮⋯rm(x1)⋮rm(xn)⎦⎥⎤n×m,A=[a1,⋯,am]T ,Y=[y1,⋯,yn]T当
{
r
1
(
x
)
,
⋯
,
r
m
(
x
)
}
\left\{r_1(x),\cdots,r_m(x)\right\}
{r1(x),⋯,rm(x)}线性无关时,
R
\bm{R}
R列满秩,
R
T
R
\bm{R^TR}
RTR可逆,于是方程组式有唯一解
A
=
(
R
T
R
)
−
1
R
T
Y
\bm{A=(R^TR)^{-1}R^TY}
A=(RTR)−1RTY
2.1.2 函数
r
k
(
x
)
r_k(x)
rk(x)的选取
若通过机理分析,能够知道y和x之间的函数关系,则
r
1
(
x
)
,
⋯
,
r
m
(
x
)
r_1(x),\cdots,r_m(x)
r1(x),⋯,rm(x)容易确定。若无法知道y和x之间的关系,通常可以将数据
(
x
i
,
y
i
)
,
i
=
1
,
2
,
⋯
,
n
(x_i,y_i)\ ,i=1,2,\cdots,n
(xi,yi) ,i=1,2,⋯,n作图,直观地判断应该用什么样的曲线取作拟合。常用的曲线有:
- 直线: y = a 1 x + a 2 y=a_1x+a_2 y=a1x+a2
- 多项式: y = a 1 x m + ⋯ + a m x + a m + 1 y=a_1x^m+\cdots+a_mx+a_{m+1} y=a1xm+⋯+amx+am+1
- 双曲线: y = a 1 x + a 2 y=\cfrac{a_1}{x}+a_2 y=xa1+a2
- 指数曲线: y = a 1 e a 2 x y=a_1e^{a_2x} y=a1ea2x,用指数曲线拟合前需作变量代换,化为对 a 1 , a 2 a_1,a_2 a1,a2的线性函数
2.2 最小二乘法的Matlab实现
2.2.1 解方程组方法
Matlab中的线性最小二乘标准型为
min
A
∣
∣
R
A
−
Y
∣
∣
2
2
\mathop{\min}\limits_{A}||\bm{RA-Y}||^2_2
Amin∣∣RA−Y∣∣22,求解命令为
A
=
R
∖
Y
\bm{A=R\setminus Y}
A=R∖Y。
2.2.2 多项式拟合方法
若取
{
r
1
(
x
)
,
⋯
,
r
m
+
1
(
x
)
}
=
{
1
,
x
,
⋯
,
x
m
}
\left\{r_1(x),\cdots,r_{m+1}(x)\right\}=\left\{1,x,\cdots,x^m\right\}
{r1(x),⋯,rm+1(x)}={1,x,⋯,xm},即用m次多项式拟合给定数据,Matlab中有现成的函数
a=polyfit(x0,y0,m) %x0,y0为要拟合的数据,m为拟合多项式的次数,a为拟合多项式的系数向量
y=polyval(a,x) %计算多项式在x出的值
3. 最小二乘优化
在非线性规划问题中,若目标函数由若干个函数的平方和构成,把极小化这类函数的问题称为最小二乘优化问题 min F ( x ) = ∑ i = 1 m f i 2 ( x ) \min F(x)=\sum_{i=1}^mf_i^2(x) minF(x)=i=1∑mfi2(x)在Matlab优化工具箱中,用于求解最小二乘优化问题的函数由lsqlin、lsqcurvefit、lsqnonlin、lsqnonneg。
- lsqlin函数:求解
min
x
1
2
∣
∣
C
⋅
x
−
d
∣
∣
2
2
s.t.
{
A
⋅
x
⩽
b
A
e
q
⋅
x
=
b
e
q
l
b
⩽
x
⩽
u
b
\min_x \cfrac12||\bm{C\cdot x-d}||_2^2 \\ \text{s.t.}\begin{cases} \bm{A\cdot x\leqslant b} \\ Aeq\cdot \bm{x}=beq \\ lb \leqslant\bm{x}\leqslant ub \end{cases}
xmin21∣∣C⋅x−d∣∣22s.t.⎩⎪⎨⎪⎧A⋅x⩽bAeq⋅x=beqlb⩽x⩽ub式中
C
,
A
,
A
e
q
\bm{C,A},Aeq
C,A,Aeq为矩阵,
d
,
x
,
b
,
b
e
q
,
l
b
,
u
b
\bm{d,x,b},beq,lb,ub
d,x,b,beq,lb,ub为向量。
MATLAB中的函数为
x = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0)
- lsqcurvefit函数:给定输入输出数列xdata,ydata,求参量x,使得 min x ∣ ∣ F ( x , x d a t a ) − y d a t a ∣ ∣ 2 2 = ∑ i ( F ( x , x d a t a i ) − y d a t a i ) 2 \min_x||F(x,xdata)-ydata||^2_2=\sum_i(F(x,xdata_i)-ydata_i)^2 xmin∣∣F(x,xdata)−ydata∣∣22=i∑(F(x,xdatai)−ydatai)2MATLAB中的函数为
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options) %fun为定义函数F(x,xdata)的M文件
- lsqnonlin函数:已知函数向量 F ( x ) = [ f 1 ( x ) , ⋯ , f k ( x ) ] T F(\bm{x})=[f_1(\bm{x}),\cdots,f_k(\bm{x})]^T F(x)=[f1(x),⋯,fk(x)]T,求x使得 min x ∣ ∣ F ( x ) ∣ ∣ 2 2 \min_x||F(\bm{x})||_2^2 xmin∣∣F(x)∣∣22MATLAB中的函数为
x = lsqnonlin(fun,x0,lb,ub,options) %fun为定义向量函数F(x)的M文件
- lsqnonneg函数:求解非负的x,使得 min x ∣ ∣ C ⋅ x − d ∣ ∣ 2 2 \min_x ||\bm{C\cdot x-d}||_2^2 xmin∣∣C⋅x−d∣∣22MATLAB中的函数为
x = lsqnonneg(C,d,options)
4. 曲线拟合与函数逼近
曲线拟合是选择一个较简单函数f(x)在一定准则下最接近一组离散数据。函数逼近是选择一个较简单函数f(x)在一定准则下最接近一个较复杂的连续函数y(x),[a,b]。与曲线拟合的最小二乘准则对应,函数逼近常用最小平方逼近,即 J = ∫ a b [ f ( x ) − y ( x ) ] 2 d x J=\int_a^b[f(x)-y(x)]^2dx J=∫ab[f(x)−y(x)]2dx达到最小。与曲线拟合一样,选一组函数 { r k ( x ) , k = 1 , ⋯ , m } \left\{r_k(x),k=1,\cdots,m\right\} {rk(x),k=1,⋯,m}构造f(x),即令 f ( x ) = a 1 r 1 ( x ) + ⋯ + a m r m ( x ) f(x)=a_1r_1(x)+\cdots+a_mr_m(x) f(x)=a1r1(x)+⋯+amrm(x)利用极值必要条件可得 [ ( r 1 , r 1 ) ⋯ ( r 1 , r m ) ⋮ ⋮ ⋮ ( r m , r 1 ) ⋯ ( r m , r m ) ] [ a 1 ⋮ a m ] = [ ( y , r 1 ) ⋮ ( y , r m ) ] \left[\begin{array}{ccc} \left(r_{1}, r_{1}\right) & \cdots & \left(r_{1}, r_{m}\right) \\ \vdots & \vdots & \vdots \\ \left(r_{m}, r_{1}\right) & \cdots & \left(r_{m}, r_{m}\right) \end{array}\right]\left[\begin{array}{c} a_{1} \\ \vdots \\ a_{m} \end{array}\right]=\left[\begin{array}{c} \left(y, r_{1}\right) \\ \vdots \\ \left(y, r_{m}\right) \end{array}\right] ⎣⎢⎡(r1,r1)⋮(rm,r1)⋯⋮⋯(r1,rm)⋮(rm,rm)⎦⎥⎤⎣⎢⎡a1⋮am⎦⎥⎤=⎣⎢⎡(y,r1)⋮(y,rm)⎦⎥⎤其中 ( g , h ) = ∫ a b g ( x ) h ( x ) d x (g,h)=\int_a^bg(x)h(x)dx (g,h)=∫abg(x)h(x)dx,当方程组的系数矩阵非奇异时,有唯一解。