最小二乘法函数拟合原理及matlab实现

——数值分析数学笔记


如有纰漏,欢迎指正


前言

        对大量实验数据 ( x i , y i ) (x_{i},y_{i}) (xi,yi) 如何寻找一个合适的函数 y = f ( x ) y=f(x) y=f(x) 来近似的描述呢?
        所谓 “合适” :要求 y = f ( x ) y=f(x) y=f(x) 最能反应数据点的总体趋势
Tips: 第一节和第二节皆是数学推导,可跳过直接看第三节的应用。


以下为正文

        既然是分析实验数据 ( x i , y i ) (x_{i},y_{i}) (xi,yi) ,那么数据有什么特点及要求呢?

  1. 实验数据并不是准确无误,存在误差。
  2. 实验数据较多甚至很多。
  3. 数据的采样基本能够反应 x x x y y y 的对应关系。

  对于第一个特点,假设我们构造出了一个函数,结果发现很多甚至所有的实验数据都不在函数图像上?这合适吗?这很合适!因为带有误差的实验数据落在了函数曲线上,那就说明我们的曲线是存在误差的。如果我们得到的数据(一定不是实验的数据,可能是经过计算得到的数据)能够保证准确无误。那么应该优先考虑通过插值的方法构造函数。
  对于第二个特点,若是实验数据很少,我们能否强行构造函数呢?能,但构造出的函数是没有意义的,它不能体现总体水平。因此我们需要大量的实验数据。
  对于第三个特点,如果 x x x y y y 本就毫无关系,又何谈“构造函数来近似描述”呢?

  假设我们的实验数据具备以上特征,要如何才能构造出了一个函数 最能反应数据点的总体趋势 呢?什么叫最能 你画 一条拟合函数,我画一条拟合函数都可以说是“最能,因此我们需要确定一个标准。

一、拟合标准

实验值 y i y_i yi

拟合值 y i ∗ y_i^* yi

偏差(拟合值与实验值之差): r i = y i − y i ∗ ( i = 1 , 2 , 3 , . . . , m ) r_i=y_i-y_i^*\quad( i=1,2,3,...,m) ri=yiyi(i=1,2,3,...,m) 注意在数理统计中,偏差又称残差,不是误差!

偏差向量 r = ( r 1 , r 2 , . . . , r m ) \boldsymbol{r}=(r_1,r_2,...,r_m) r=(r1,r2,...,rm) (这能记录每个数据点的偏差,即总体

1.使偏差向量满足 1 1 1 - 范数

数学表达式: ∑ i = 1 m ∣ r i ∣ = ∣ r 1 ∣ + ∣ r 2 ∣ + . . . + ∣ r m ∣ = m i n \sum_{i=1}^m|\boldsymbol{r_i}|=|r_1|+|r_2|+...+|r_m|=min i=1mri=r1+r2+...+rm=min

  通俗的讲就是:要求每个实验数据的偏差绝对值之和最小。 这个标准很容易想到,也很合适,但在导出拟合函数的过程中,运算很麻烦,暂且抛弃该标准。

2.使偏差向量满足 ∞ \infty - 范数

数学表达式: m a x ∣ r i ∣ = m i n max|\boldsymbol{r_i}|=min maxri=min

  通俗的讲就是:在所有的实验数据 ( r 1 , r 2 , . . . , r n ) (r_1,r_2,...,r_n) (r1,r2,...,rn) 中找到最大的 r m a x r_{max} rmax要求这个 r m a x r_{max} rmax 最小,即最大的偏差都最小。 既然最大的偏差都最小了,这个标准非常合适。这种拟合方式称之为最佳一致逼近。(但不是本文的内容,也暂不讨论)

3.使偏差向量满足 2 2 2 - 范数

数学表达式: ∑ i = 1 m r i 2 = r 1 2 + r 2 2 + . . . + r m 2 = m i n \sqrt{\sum_{i=1}^m\boldsymbol{r_i^2}}=\sqrt{r_1^2+r_2^2+...+r_m^2}=min i=1mri2 =r12+r22+...+rm2 =min

  通俗的讲就是:先把每个实验数据的偏差求平方,然后要求这些偏差平方的和最小。 这个标准通过平方把偏差放大,又要求偏差的平方之和开根号最小,因此很合适。而且该法在之后导出拟合函数的过程中,运算也不麻烦。这种拟合方式称之为最佳平方逼近。也称曲线拟合的最小二乘法


  自此我们确立了三个拟合的标准。下面就曲线拟合的最小二乘法导出拟合的公式。


二、最小二乘法原理

1.最小二乘法 多项式拟合(常用)

  要构造函数,首先确定函数类别。几个基本的函数类:多项式函数、三角函数、指数函数…这里我们选择多项式函数
  在众多函数类中,为什么选择多项式函数?因为多项式函数的好处多多:运算简便,次数越高拟合结果越好(注意不能过高)

  1.1最小二乘法的多项式拟合公式 推导。

   假设 n 次多项式函数 P n ( x ) = a 0 + a 1 x + a 2 x 2 + . . . + a n x n P_n(x)=a_0+a_1x+a_2x^2+...+a_nx^n Pn(x)=a0+a1x+a2x2+...+anxn 就是想要的拟合函数,那么每个数据的偏差 r i r_i ri 可以表示为:

r i = ( P n ( x i ) − y i ) ( i = 1 , 2 , 3 , . . . , m ) r_i=(P_n(x_i)-y_i)\quad\quad(i=1,2,3,...,m) ri=(Pn(xi)yi)(i=1,2,3,...,m)

且满足最小二乘(最佳平方逼近)的拟合标准,则有:

∑ i = 1 m ( P n ( x i ) − y i ) 2 = m i n ( i = 1 , 2 , 3 , . . . , m ) \sqrt{\sum_{i=1}^m(P_n(x_i)-y_i)^2}=min\quad\quad(i=1,2,3,...,m) i=1m(Pn(xi)yi)2 =min(i=1,2,3,...,m)

(这表示m个数据点的偏差平方的和最小

   令 F ( a 0 , a 1 , . . . , a n ) = ∑ i = 1 m ( P n ( x i ) − y i ) 2 F(a_0,a_1,...,a_n)=\sum_{i=1}^m(P_n(x_i)-y_i)^2 F(a0,a1,...,an)=i=1m(Pn(xi)yi)2 注意这里对于函数 F ( a 0 , a 1 , . . . , a n ) F(a_0,a_1,...,a_n) F(a0,a1,...,an),未知量是 a 0 , a 1 , . . . , a n a_0,a_1,...,a_n a0,a1,...,an。上述拟合标准等效于:

   当 a 0 , a 1 , . . . , a n a_0,a_1,...,a_n a0,a1,...,an 取的何值时, F ( a 0 , a 1 , . . . , a n ) F(a_0,a_1,...,a_n) F(a0,a1,...,an) 取得最小值。

   至此,问题转化为了求多元函数极值点了,首先对多元函数 F ( a 0 , a 1 , . . . , a n ) F(a_0,a_1,...,a_n) F(a0,a1,...,an) 求偏导并令导数值为0,求出驻点:
{ ∂ F ( a 0 , a 1 , . . . , a n ) ∂ a 0 = 0 ∂ F ( a 0 , a 1 , . . . , a n ) ∂ a 1 = 0 ⋮ ∂ F ( a 0 , a 1 , . . . , a n ) ∂ a n = 0 \begin{cases} \frac{\partial F(a_0,a_1,...,a_n)}{\partial a_0}=0\\ \frac{\partial F(a_0,a_1,...,a_n)}{\partial a_1}=0\\ &&&&\vdots\\ \frac{\partial F(a_0,a_1,...,a_n)}{\partial a_n}=0& \end{cases} a0F(a0,a1,...,an)=0a1F(a0,a1,...,an)=0anF(a0,a1,...,an)=0
可导出如下n元线性方程组(省略繁杂的过程) ⇒ \Rightarrow
{ m a 0 + ( ∑ i = 1 m x i ) a 1 + ( ∑ i = 1 m x i 2 ) a 2 + . . . + ( ∑ i = 1 m x i n ) a n = ∑ i = 1 m y i ( ∑ i = 1 m x i ) a 0 + ( ∑ i = 1 m x i 2 ) a 1 + ( ∑ i = 1 m x i 3 ) a 2 + . . . + ( ∑ i = 1 m x i ( n + 1 ) a n = ∑ i = 1 m x i y i ( ∑ i = 1 m x i 2 ) a 0 + ( ∑ i = 1 m x i 3 ) a 1 + ( ∑ i = 1 m x i 4 ) a 2 + . . . + ( ∑ i = 1 m x i ( n + 2 ) a n = ∑ i = 1 m x i 2 y i ⋮ ( ∑ i = 1 m x i n ) a 0 + ( ∑ i = 1 m x i n + 1 ) a 1 + ( ∑ i = 1 m x i n + 2 ) a 2 + . . . + ( ∑ i = 1 m x i ( n + n ) a n = ∑ i = 1 m x i n y i \begin{cases} ma_0+(\sum_{i=1}^mx_i)a_1+(\sum_{i=1}^mx_i^2)a_2+...+(\sum_{i=1}^mx_i^n)a_n=\sum_{i=1}^my_i\\ (\sum_{i=1}^mx_i)a_0+(\sum_{i=1}^mx_i^2)a_1+(\sum_{i=1}^mx_i^3)a_2+...+(\sum_{i=1}^mx_i^{(n+1)}a_n=\sum_{i=1}^mx_iy_i\\ (\sum_{i=1}^mx_i^2)a_0+(\sum_{i=1}^mx_i^3)a_1+(\sum_{i=1}^mx_i^4)a_2+...+(\sum_{i=1}^mx_i^{(n+2)}a_n=\sum_{i=1}^mx_i^2y_i\\ &&&&\vdots\\ (\sum_{i=1}^mx_i^n)a_0+(\sum_{i=1}^mx_i^{n+1})a_1+(\sum_{i=1}^mx_i^{n+2})a_2+...+(\sum_{i=1}^mx_i^{(n+n)}a_n=\sum_{i=1}^mx_i^ny_i\\ \end{cases} ma0+(i=1mxi)a1+(i=1mxi2)a2+...+(i=1mxin)an=i=1myi(i=1mxi)a0+(i=1mxi2)a1+(i=1mxi3)a2+...+(i=1mxi(n+1)an=i=1mxiyi(i=1mxi2)a0+(i=1mxi3)a1+(i=1mxi4)a2+...+(i=1mxi(n+2)an=i=1mxi2yi(i=1mxin)a0+(i=1mxin+1)a1+(i=1mxin+2)a2+...+(i=1mxi(n+n)an=i=1mxinyi
这个方程组称之为法方程组,注意到 F ( a 0 , a 1 , . . . , a n ) F(a_0,a_1,...,a_n) F(a0,a1,...,an) 是二次非负函数没有最大值,故驻点必为极小值点。解该法方程组就能得到多项式函数的系数 a 0 , a 1 , . . . , a n a_0,a_1,...,a_n a0,a1,...,an ,从而得到拟合函数 P n ( x ) = a 0 + a 1 x + a 2 x 2 + . . . + a n x n P_n(x)=a_0+a_1x+a_2x^2+...+a_nx^n Pn(x)=a0+a1x+a2x2+...+anxn

  1.2 结论:

   由此,我们得到了多项式函数拟合的一般方法:
构造 F ( a 0 , a 1 , . . . , a n ) F(a_0,a_1,...,a_n) F(a0,a1,...,an) ⟶ \longrightarrow 求偏导 ⟶ \longrightarrow 解法方程组 ⟶ \longrightarrow a 0 , a 1 , . . . , a n a_0,a_1,...,a_n a0,a1,...,an ⟶ \longrightarrow 作为多项式 P n ( x ) = a 0 + a 1 x + a 2 x 2 + . . . + a n x n P_n(x)=a_0+a_1x+a_2x^2+...+a_nx^n Pn(x)=a0+a1x+a2x2+...+anxn 对应系数。

  1.3 案例1:

求下面数据表的最小二乘二次拟合多项式:

x i x_i xi y i y_i yi
-1-0.2209
-0.750.3295
-0.50.8826
-0.251.4392
02.0003
0.252.5645
0.53.1334
0.753.7601
14.2836

设多项式函数为: P n ( x ) = a 0 + a 1 x + a 2 x 2 P_n(x)=a_0+a_1x+a_2x^2 Pn(x)=a0+a1x+a2x2
将数据点带入法方程组
{ 9 a 0 + 0 1 + 3.75 a 2 = 18.1723 0 + 3.75 a 1 + 0 = 8.4842 3.75 a 0 + 0 + 2.7656 a 2 = 7.1673 \begin{cases} 9a_0+0_1+3.75a_2=18.1723\\ 0+3.75a_1+0=8.4842\\ 3.75a_0+0+2.7656a_2=7.1673\\ \end{cases} 9a0+01+3.75a2=18.17230+3.75a1+0=8.48423.75a0+0+2.7656a2=7.1673
解得: a 0 = 2.0034 , a 1 = 2.2625 , a 2 = 0.0378 a_0=2.0034, a_1=2.2625, a_2=0.0378 a0=2.0034,a1=2.2625,a2=0.0378 故多项式拟合函数为: P n ( x ) = 2.0034 + 2.2625 x + 0.0378 x 2 P_n(x)=2.0034+2.2625x+0.0378x^2 Pn(x)=2.0034+2.2625x+0.0378x2

2.最小二乘法的一般形式(线性)(非重点)

  有些时候,我们就偏不要用多项式函数拟合,又该怎么办呢?可以仿照上述步骤推导,那样的话,当又换了一个函数类,岂不是又得重新推导,实在麻烦!
因此,这里给出最小二乘法的一般形式。

 2.1 线性最小二乘法的一般形式推导

  设给定数据 ( x i , y i ) (x_i,y_i) (xi,yi) ,又 { φ k ( x ) } \left\{\varphi_k(x)\right\} {φk(x)} 为点集 { x i } i = 1 m {\left\{x_i\right\}}^m_{i=1} {xi}i=1m上的线性无关族,选取函数 φ ∈ ϕ = s p a n { ϕ 0 , ϕ 1 , . . . , ϕ n } \varphi \in \boldsymbol\phi = span\left\{\phi_0,\phi_1,...,\phi_n\right\} φϕ=span{ϕ0,ϕ1,...,ϕn}满足:
∑ i = 1 m ( y i − φ ( x i ) ) 2 = m i n h ∈ ϕ ∑ i = 1 m ( y i − h ( x i ) ) 2 \sqrt{\sum_{i=1}^m(y_i-\varphi(x_i))^2}=\sqrt{\underset {h \in \phi}{min}\sum_{i=1}^m(y_i-h(x_i))^2} i=1m(yiφ(xi))2 =hϕmini=1m(yih(xi))2
其中 h ( x i ) h(x_i) h(xi) 可由 { ϕ 0 , ϕ 1 , . . . , ϕ n } \left\{\phi_0,\phi_1,...,\phi_n\right\} {ϕ0,ϕ1,...,ϕn}线性组合得到,即 h x = a 0 ϕ 0 + a 1 ϕ 1 + . . . + a 0 ϕ n h_x=a_0\phi_0+a_1\phi_1+...+a_0\phi_n hx=a0ϕ0+a1ϕ1+...+a0ϕn

因此:

如上章所述解法,令 F ( a 0 , a 1 , . . . , a n ) = ∑ i = 1 m ( y i − h ( x i ) ) 2 = ∑ i = 1 m ( y i − ∑ k = 0 n a k φ k ( x i ) ) 2 F(a_0,a_1,...,a_n)=\sum_{i=1}^m(y_i-h(x_i))^2=\sum_{i=1}^m(y_i-\sum_{k=0}^na_k\varphi_k(x_i))^2 F(a0,a1,...,an)=i=1m(yih(xi))2=i=1m(yik=0nakφk(xi))2 求偏导令导数值为零:

{ ∂ F ( a 0 , a 1 , . . . , a n ) ∂ a 0 = 0 ∂ F ( a 0 , a 1 , . . . , a n ) ∂ a 1 = 0 ⋮ ∂ F ( a 0 , a 1 , . . . , a n ) ∂ a n = 0 \begin{cases} \frac{\partial F(a_0,a_1,...,a_n)}{\partial a_0}=0\\ \frac{\partial F(a_0,a_1,...,a_n)}{\partial a_1}=0\\ &\vdots\\ \frac{\partial F(a_0,a_1,...,a_n)}{\partial a_n}=0& \end{cases} a0F(a0,a1,...,an)=0a1F(a0,a1,...,an)=0anF(a0,a1,...,an)=0
二.1.1 导出法方程组 ⇒ \Rightarrow
{ ∑ k = 0 n ( ∑ i = 1 m φ k ( x i ) φ 0 ( x i ) ) a k = ∑ i = 1 m y i φ 0 ( x i ) ∑ k = 0 n ( ∑ i = 1 m φ k ( x i ) φ 1 ( x i ) ) a k = ∑ i = 1 m y i φ 1 ( x i ) ∑ k = 0 n ( ∑ i = 1 m φ k ( x i ) φ 2 ( x i ) ) a k = ∑ i = 1 m y i φ 2 ( x i ) ⋮ ∑ k = 0 n ( ∑ i = 1 m φ k ( x i ) φ n ( x i ) ) a k = ∑ i = 1 m y i φ n ( x i ) \begin{cases} \sum_{k=0}^n\big(\sum_{i=1}^m\varphi_k(x_i)\varphi_0(x_i)\big)a_k=\sum_{i=1}^my_i\varphi_0(x_i)\\ \sum_{k=0}^n\big(\sum_{i=1}^m\varphi_k(x_i)\varphi_1(x_i)\big)a_k=\sum_{i=1}^my_i\varphi_1(x_i)\\ \sum_{k=0}^n\big(\sum_{i=1}^m\varphi_k(x_i)\varphi_2(x_i)\big)a_k=\sum_{i=1}^my_i\varphi_2(x_i)\\ &&&&\vdots\\ \sum_{k=0}^n\big(\sum_{i=1}^m\varphi_k(x_i)\varphi_n(x_i)\big)a_k=\sum_{i=1}^my_i\varphi_n(x_i)\\ \end{cases} k=0n(i=1mφk(xi)φ0(xi))ak=i=1myiφ0(xi)k=0n(i=1mφk(xi)φ1(xi))ak=i=1myiφ1(xi)k=0n(i=1mφk(xi)φ2(xi))ak=i=1myiφ2(xi)k=0n(i=1mφk(xi)φn(xi))ak=i=1myiφn(xi)
为方便记忆和表示,由向量的运算法则,我们记:
φ j ⃗ = ( φ j ( x 1 ) , φ j ( x 2 ) , φ j ( x 3 ) , . . . , φ j ( x m ) ) \vec{\varphi_j}=\big(\varphi_j(x_1),\varphi_j(x_2),\varphi_j(x_3),...,\varphi_j(x_m)\big) φj =(φj(x1),φj(x2),φj(x3),...,φj(xm))    j = 0 , 1 , 2 , . . . , n j=0,1,2,...,n j=0,1,2,...,n

a ⃗ = ( a 0 , a 1 , . . . , a n ) T \vec{a} =(a_0,a_1,...,a_n)^T a =(a0,a1,...,an)T

y ⃗ = ( y 0 , y 1 , . . . , y n ) T \vec{y} =(y_0,y_1,...,y_n)^T y =(y0,y1,...,yn)T

G \boldsymbol G G 矩阵:

G = ( φ 0 ( x 0 ) φ 1 ( x 0 ) . . . φ n ( x 0 ) φ 0 ( x 1 ) φ 1 ( x 1 ) . . . φ n ( x 1 ) ⋮ φ 0 ( x m ) φ 1 ( x m ) . . . φ n ( x m ) ) G=\left(\begin{array}{ccccc} \varphi_0(x_0) & \varphi_1(x_0) & ... & \varphi_n(x_0)\\ \varphi_0(x_1) & \varphi_1(x_1) & ... & \varphi_n(x_1)\\ \varvdots\\ \varphi_0(x_m) & \varphi_1(x_m) & ... & \varphi_n(x_m)\\ \end{array}\right) G=φ0(x0)φ0(x1)φ0(xm)φ1(x0)φ1(x1)φ1(xm).........φn(x0)φn(x1)φn(xm)

可以验证(过程繁琐) 法方程组 即表示为:

G T G a ⃗ = G T y ⃗ \boldsymbol G^T \boldsymbol G \vec{a}=\boldsymbol G^T \vec{y} GTGa =GTy
同样的解该法方程组就能得到函数的系数 a 0 , a 1 , . . . , a n a_0,a_1,...,a_n a0,a1,...,an 从而构造出一般的拟合函数 h x = a 0 ϕ 0 + a 1 ϕ 1 + . . . + a 0 ϕ n h_x=a_0\phi_0+a_1\phi_1+...+a_0\phi_n hx=a0ϕ0+a1ϕ1+...+a0ϕn

 2.2 结论

   由此,我们得到了一般函数拟合的一般方法:构造拟合函数的G矩阵---->解法方程组 G T G a ⃗ = G T y ⃗ G^TG\vec{a}=G^T\vec{y} GTGa =GTy ----->解得a

 2.3 案例2

求下面数据表的最小二乘指数拟合:
目标拟合函数为: y ( x ) = a 0 + a 1 e x + a 2 e − x y(x)=a_0+a_1e^x+a_2e^{-x} y(x)=a0+a1ex+a2ex

x i x_i xi y i y_i yi
02
0.12.20254
0.22.40715
0.32.61592
0.42.83096
0.53.06448
0.63.28876

解:
  ① 由题意: φ 0 ( x ) = 1 , φ 1 ( x ) = e x , φ 2 ( x ) = e − x \varphi_0(x)=1,\varphi_1(x)=e^x,\varphi_2(x)=e^{-x} φ0(x)=1,φ1(x)=ex,φ2(x)=ex
  ② 先构造G矩阵:
G = ( φ 0 ( x 0 ) φ 1 ( x 0 ) φ 2 ( x 0 ) φ 0 ( x 1 ) φ 1 ( x 1 ) φ 2 ( x 1 ) φ 0 ( x 2 ) φ 1 ( x 2 ) φ 2 ( x 2 ) φ 0 ( x 3 ) φ 1 ( x 3 ) φ 2 ( x 3 ) φ 0 ( x 4 ) φ 1 ( x 4 ) φ 2 ( x 4 ) φ 0 ( x 5 ) φ 1 ( x 5 ) φ 2 ( x 5 ) φ 0 ( x 6 ) φ 1 ( x 6 ) φ 2 ( x 6 ) ) = ( 1 1 1 1 1.10517 0.90484 1 1.22140 0.81873 1 1.34986 0.74082 1 1.49182 0.67032 1 1.64872 0.60653 1 1.82212 0.54881 ) G=\left(\begin{array}{ccccc} \varphi_0(x_0) & \varphi_1(x_0) & \varphi_2(x_0)\\ \varphi_0(x_1) & \varphi_1(x_1) & \varphi_2(x_1)\\ \varphi_0(x_2) & \varphi_1(x_2) & \varphi_2(x_2)\\ \varphi_0(x_3) & \varphi_1(x_3) & \varphi_2(x_3)\\ \varphi_0(x_4) & \varphi_1(x_4) & \varphi_2(x_4)\\ \varphi_0(x_5) & \varphi_1(x_5) & \varphi_2(x_5)\\ \varphi_0(x_6) & \varphi_1(x_6) & \varphi_2(x_6)\\ \end{array}\right)=\left(\begin{array}{ccccc} 1 & 1 & 1\\ 1 & 1.10517 & 0.90484\\ 1 & 1.22140 & 0.81873\\ 1 & 1.34986 & 0.74082\\ 1 & 1.49182 & 0.67032\\ 1 & 1.64872 & 0.60653\\ 1 & 1.82212 & 0.54881\\ \end{array}\right) G=φ0(x0)φ0(x1)φ0(x2)φ0(x3)φ0(x4)φ0(x5)φ0(x6)φ1(x0)φ1(x1)φ1(x2)φ1(x3)φ1(x4)φ1(x5)φ1(x6)φ2(x0)φ2(x1)φ2(x2)φ2(x3)φ2(x4)φ2(x5)φ2(x6)=111111111.105171.221401.349861.491821.648721.8221210.904840.818730.740820.670320.606530.54881
  ③ 写出 y ⃗ \vec{y} y 向量:
y ⃗ = ( 2 2.20254 2.40715 2.61592 2.83096 3.05448 3.28876 ) \vec{y}=\left(\begin{array}{ccccc} 2\\ 2.20254\\ 2.40715\\ 2.61592\\ 2.83096\\ 3.05448\\ 3.28876\\ \end{array}\right) y =22.202542.407152.615922.830963.054483.28876
  ④ 解法方程组:

G T G a ⃗ = G T y ⃗ G^TG\vec{a}=G^T\vec{y} GTGa =GTy
  得到: a 0 = 1.98614 a 1 = 1.01700 a 2 = − 1.00304 a_0=1.98614\quad{a_1}=1.01700\quad{a_2}=-1.00304 a0=1.98614a1=1.01700a2=1.00304 故所求的拟合函数为: y = 1.98614 + 1.01700 e x − 1.00304 e x y=1.98614+1.01700e^x-1.00304e^x y=1.98614+1.01700ex1.00304ex


三、最小二乘法应用(matlab)

1. 自行编写代码实现

  拟合函数:三项偶次多项式 P n ( x ) = a 0 + a 2 x 2 + a 3 x 4 P_n(x)=a_0+a_2x^2+a_3x^4 Pn(x)=a0+a2x2+a3x4
  matlab代码如下:

%x,y为待拟合得数据,返回值p为拟合函数的系数(按x的升幂排列)
function [p]=polyfit_2(x,y)   
if length(x) ~= length(y)
warning('输入矩阵维度有误');
end
m=length(x);
A=[m sum(x.^2) sum(x.^4) ; sum(x.^2) sum(x.^4) sum(x.^6) ; sum(x.^4) sum(x.^6) sum(x.^8)]; %法方程组系数矩阵
b=[sum(y) ; sum(y.*(x.^2)) ; sum(y.*(x.^4))]; 
p=A\b; %求解法方程组
end

  采用一般形式的最小二乘法 代码更为简洁!:

%x,y为待拟合得数据,返回值p为拟合函数的系数(按x的升幂排列)
function [p]=polyfit_22(x,y)
if length(x) ~= length(y)
warning('输入矩阵维度有误');
end
g0=x.^0; 
g1=x.^2;
g2=x.^4;
G=[g0 g1 g2]; %G矩阵构造
%=====normal equation
A=G'*G; %法方程组的系数矩阵
b=G'*y;
p=A\b;  %求解法方程组
end

(掌握了原理,任何编程语言都可以实现拟合方法,甚至还可以自己写一个属于自己的拟合工具箱!!)

2. 利用Curving Fitting Tools工具箱

  自行编写代码还是太麻烦?其实matlab早为我们考虑了这个问题!利用Curving Fitting Tools帮助我们快速实现拟合。Curving Fitting Tools参考文档:https://www.mathworks.com/help/curvefit/curve-fitting.html?searchHighlight=curving fit&s_tid=srchtitle

2.1 命令行输入cftool即可打开工具箱

  1. 在命令框中输入 cftool 即可打开工具箱
    在命令框中输入cftool
    在这里插入图片描述
  2. 选定拟合的对象
    在这里插入图片描述
  3. 选定拟合函数类
    在这里插入图片描述
    例如选择多项式拟合:
    在这里插入图片描述
  4. 工具箱中个参数的含义

在这里插入图片描述
SSE(Sum Squared Residual):残差平方和,越接近0,表示与数据拟合的越好,但是要小心过拟合;
R-Square:确定系数, R − S q u a r e = ∑ i = 1 n ( y − y i ) 2 / ∑ i = 1 n ( y − y i ) 2 R-Square={\sum_{i=1}^n(y-y_i)^2}/{\sum_{i=1}^n(y-y_i)^2} RSquare=i=1n(yyi)2/i=1n(yyi)2,趋近于1较好
DFE:误差项自由度
RMSE(Root Mean Squared Error):均方根误差
#Coeff:模型的系数数量(非自定义模型时出现),相近拟合效果选择数量少的,防止过拟合。

2.2 拟合结果的调用

2.2.1生成代码(Generate Code)

  有些时候我们不仅需要拟合的图像,还需要拟合的结果。利用Curving Fitting Tools 得到的拟合模型可以直接生成代码非常方便!
点击窗口左上角:文件(Files)—> Generate Code
在这里插入图片描述
自动生成的函数保存下来,就可以直接调用了
在这里插入图片描述

2.2.2调用函数

创建脚本test 测试自动生成的函数
在这里插入图片描述
matlab默认为我们绘制了一幅图,同时返回了两个对象:fitresult 和 gof
在这里插入图片描述
在这里插入图片描述

2.2.3返回值fitresult 和 gof 的调用

① 直接将fitresult作为函数,可按照拟合公式返回数值解。
在这里插入图片描述
② fitresult.相关参数,返回相关拟合参数。
在这里插入图片描述


如有问题,欢迎讨论
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐