插值和拟合都是要求通过已知的数据去寻求某个近似函数,使得近似函数与与已知数据有较高的拟合精度

@


前言

插值和拟合都是要求通过已知的数据去寻求某个近似函数,使得近似函数与与已知数据有较高的拟合精度。本文将介绍两者的区别,相应的算法以及如何用matlab实现。

一、拟合

1.定义

已知一组(二维)数据,即平面上的n个点\((x_i,y_i)\)\(i=1,2,...,n\)\(x_i\)互不相同,寻求一个函数(曲线)\(y=f(x)\),使\(f(x)\)在某种准则下与所有数据点最为接近,即曲线拟合得最好。
注意:拟合曲线不要求经过所有的数据点

2.三种判别准则

使偏差的绝对值最小;
使偏差的最大绝对值最小;
使偏差的平方和最小(即最小二乘法)。

3.最小二乘法

(1)一般形式

最小二乘法是解决拟合的最常用方法,基本思路是令

\[f(x)=a_1r_1(x)+a_2r_2(x)+...+a_mr_m(x )\]

其中,\(r_k(x)\)为实现选定的一组线性无关的函数;\(a_k\)为待定系数\((k=1,2,...,m;m<n)\)

\[R=\begin{bmatrix} r_1(x_1) & ... & r_m(x_1) \\ r_1(x_n) & ... & r_m(x_n) \\ \end{bmatrix}\quad_{n \times\ m} \]

\[A=[a_1,...,a_m]^T,Y=[y_1,...,y_n]^T \]

则有唯一解

\[A=(R^TR)^{-1}R^TY \]

证明略

(2)常用函数

直线:\(y=a_1x+a_2\)
多项式:\(y=a_1x^m+...+a_mx+a_{m+1}\)(m一般为2或3)
双曲线(一支):\(y=\frac{a_1}{x}+a_2\)
指数曲线:\(y=a_1e^{a_2x}\)
注意:对于指数曲线,需要现转化为线性函数

(3)matlab实现

解方程组方法:

\[J(a_1,...,a_m)=\sum\limits_{i=1}^{n}[f(x_i)-y_i]^2=||RA-Y||^2 \]

易得

\[A=R\backslash Y \]

注意是左除

多项式拟合方法:

a=polyfit(x0,y0,m);
y=polyval(a,x);

其中\(x_0,y_0\)是要拟合的数据,\(m\)为拟合的多项式次数,\(a\)为拟合多项式

\[y=a(1)x^m+...,a(m)x+a(m+1) \]

的系数向量\(a=[a(1),...,a(m),a(m+1)]\)

二、插值

1.定义

在平面上给定一组离散点列,要求一条曲线,把这些点按次序连接起来,称为插值。
注意:拟合曲线必须经过所有的数据点

2.方法

(1)分段线性插值

分段线性插值,字面意思,就是把相邻两点用直线连接起来,记作\(I_n(x)\)。那么\(I_n(x)\)必经过所有数据点。\(I_n(x)\)可表示为\(I_n(x)=\sum\limits_{i=0}^{n}y_il_i(x)\),其中

\[l_i(x)= \begin{cases} \frac{x-x_{i-1}}{x_i-x_{i-1}},\quad x \in [x_{i-1},x_i],i\neq0 \\ \frac{x-x_{i+1}}{x_i-x_{i+1}}, \quad x \in [x_i,x_{i+1}] ,i\neq n \\ 0 \end{cases} \]

\(I_n\)具有良好的收敛性,即当\(n \rightarrow \infty\)时,\(I_n(x)=f(x)\)
分段线性插值适用于大多数情况。但如果对函数的光滑性要求较高时,就需要使用其它方法。

(2)拉格朗日插值多项式

\[L(x)=\sum\limits_{i=0}^{n}y_il_i(x)=\sum\limits_{i=0}^{n}y_i(\prod\limits_{j=0,j\neq i}^{n}\frac{x-x_j}{x_i-x_j}) \]

(3)样条插值

样条插值的优势在于产生的函数有连续的曲率,本质是一个具有一定光滑性的分段多项式。一般使用三次样条插值。

3.matlab实现

(1)一维插值函数

y=interp1(x0,y0,x,'...');
'linear'//线性插值(默认)
'spline'//三次样条插值
'nearest'//最近项插值
'cubic'//立方插值

\(x_0\)必须是单调的

(2)三次样条插值

y=interp1(x0,y0,x,'spline');

y=spline(x0,y0,x);

pp=csape(x0,y0);
y=fnval(pp,x);

(3)二维插值

interp2(x0,y0,z0,x,y,'...');

pp=csape({x0,y0},z0),z=fnval(pp,{x,y});//三次样条插值

用法同一维插值

总结

本篇文章只是非常非常非常粗略地介绍了插值与拟合及实现方法,省去了证明过程、函数的更多用法和优化等。欢迎指正。