插值与拟合

实际问题中,仅能观测到函数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)=xixi1xxi1 ,x[xi1,xi] ,i=0xixi+1xxi+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=0nxixjxxj ,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=0nyili(x)=i=0nyi(j=ij=0nxixjxxj)

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<<xn1<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,,n1}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)Si(xi+1)=Si+1(xi+1)Si(xi+1)=Si+1(xi+1),i=0,1,,n2联立 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种类型:

  1. S ’ ( a ) = y ’ 0 , S ’ ( b ) = y ’ n S’(a)=y’_0,S’(b)=y’_n S(a)=y0,S(b)=yn。由这种边界条件建立的样条插值函数称为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,xn1,xn2,xn3为节点作一个三次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)=Nb(b)。由这种边界条件建立的三次样条称为f(x)的Lagrange三次样条插值函数。
  2. S ’ ’ ( a ) = y ’ ’ 0 , S ’ ’ ( b ) = y ’ ’ n S’’(a)=y’’_0,S’’(b)=y’’_n S(a)=y0,S(b)=yn。特别地, y ’ ’ 0 = y ’ ’ n = 0 y’’_0=y’’_n=0 y0=yn=0时,称为自然边界条件。
  3. 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(b0),S(a+0)=S(b0),此条件称为周期条件。

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=1nδi2=i=1n[f(xi)yi]2要使J达到最小,即要 ∂ J ∂ a j = 0 \cfrac{\partial J}{\partial a_j}=0 ajJ=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 AminRAY22,求解命令为 A = R ∖ Y \bm{A=R\setminus Y} A=RY

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=1mfi2(x)在Matlab优化工具箱中,用于求解最小二乘优化问题的函数由lsqlin、lsqcurvefit、lsqnonlin、lsqnonneg。

  1. 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} xmin21Cxd22s.t.AxbAeqx=beqlbxub式中 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)
  1. 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 xminF(x,xdata)ydata22=i(F(x,xdatai)ydatai)2MATLAB中的函数为
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)	%fun为定义函数F(x,xdata)的M文件
  1. 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 xminF(x)22MATLAB中的函数为
x = lsqnonlin(fun,x0,lb,ub,options)		%fun为定义向量函数F(x)的M文件
  1. lsqnonneg函数:求解非负的x,使得 min ⁡ x ∣ ∣ C ⋅ x − d ∣ ∣ 2 2 \min_x ||\bm{C\cdot x-d}||_2^2 xminCxd22MATLAB中的函数为
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)a1am=(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,当方程组的系数矩阵非奇异时,有唯一解。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值