1. 程式人生 > 其它 >matlab——插值與擬合

matlab——插值與擬合

@

目錄

前言

插值和擬合都是要求通過已知的資料去尋求某個近似函式,使得近似函式與與已知資料有較高的擬合精度。本文將介紹兩者的區別,相應的演算法以及如何用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});//三次樣條插值

用法同一維插值

總結

本篇文章只是非常非常非常粗略地介紹了插值與擬合及實現方法,省去了證明過程、函式的更多用法和優化等。歡迎指正。