——数值分析数学笔记
如有纰漏,欢迎指正
对大量实验数据 ( 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) ,那么数据有什么特点及要求呢?
对于第一个特点,假设我们构造出了一个函数,结果发现很多甚至所有的实验数据都不在函数图像上?这合适吗?这很合适!因为带有误差的实验数据落在了函数曲线上,那就说明我们的曲线是存在误差的。如果我们得到的数据(一定不是实验的数据,可能是经过计算得到的数据)能够保证准确无误。那么应该优先考虑通过插值的方法构造函数。
对于第二个特点,若是实验数据很少,我们能否强行构造函数呢?能,但构造出的函数是没有意义的,它不能体现总体水平。因此我们需要大量的实验数据。
对于第三个特点,如果 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=yi−yi∗(i=1,2,3,...,m) 注意在数理统计中,偏差又称残差,不是误差!
记偏差向量: r = ( r 1 , r 2 , . . . , r m ) \boldsymbol{r}=(r_1,r_2,...,r_m) r=(r1,r2,...,rm) (这能记录每个数据点的偏差,即总体)
数学表达式: ∑ 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=1∑m∣ri∣=∣r1∣+∣r2∣+...+∣rm∣=min
通俗的讲就是:要求每个实验数据的偏差绝对值之和最小。 这个标准很容易想到,也很合适,但在导出拟合函数的过程中,运算很麻烦,暂且抛弃该标准。
数学表达式: m a x ∣ r i ∣ = m i n max|\boldsymbol{r_i}|=min max∣ri∣=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 最小,即最大的偏差都最小。 既然最大的偏差都最小了,这个标准非常合适。这种拟合方式称之为最佳一致逼近。(但不是本文的内容,也暂不讨论)
数学表达式: ∑ 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=1∑mri2=r12+r22+...+rm2=min
通俗的讲就是:先把每个实验数据的偏差求平方,然后要求这些偏差平方的和最小。 这个标准通过平方把偏差放大,又要求偏差的平方之和开根号最小,因此很合适。而且该法在之后导出拟合函数的过程中,运算也不麻烦。这种拟合方式称之为最佳平方逼近。也称曲线拟合的最小二乘法
自此我们确立了三个拟合的标准。下面就曲线拟合的最小二乘法导出拟合的公式。
要构造函数,首先确定函数类别。几个基本的函数类:多项式函数、三角函数、指数函数…这里我们选择多项式函数。
在众多函数类中,为什么选择多项式函数?因为多项式函数的好处多多:运算简便,次数越高拟合结果越好(注意不能过高)
假设 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=1∑m(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} ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧∂a0∂F(a0,a1,...,an)=0∂a1∂F(a0,a1,...,an)=0∂an∂F(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
由此,我们得到了多项式函数拟合的一般方法:
构造 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 对应系数。
求下面数据表的最小二乘二次拟合多项式:
x i x_i xi | y i y_i yi |
---|---|
-1 | -0.2209 |
-0.75 | 0.3295 |
-0.5 | 0.8826 |
-0.25 | 1.4392 |
0 | 2.0003 |
0.25 | 2.5645 |
0.5 | 3.1334 |
0.75 | 3.7601 |
1 | 4.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
有些时候,我们就偏不要用多项式函数拟合,又该怎么办呢?可以仿照上述步骤推导,那样的话,当又换了一个函数类,岂不是又得重新推导,实在麻烦!
因此,这里给出最小二乘法的一般形式。
设给定数据 ( 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=1∑m(yi−φ(xi))2=h∈ϕmini=1∑m(yi−h(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(yi−h(xi))2=∑i=1m(yi−∑k=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} ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧∂a0∂F(a0,a1,...,an)=0∂a1∂F(a0,a1,...,an)=0∂an∂F(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
由此,我们得到了一般函数拟合的一般方法:构造拟合函数的G矩阵---->解法方程组 G T G a ⃗ = G T y ⃗ G^TG\vec{a}=G^T\vec{y} GTGa=GTy----->解得a
求下面数据表的最小二乘指数拟合:
目标拟合函数为: 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+a2e−x
x i x_i xi | y i y_i yi |
---|---|
0 | 2 |
0.1 | 2.20254 |
0.2 | 2.40715 |
0.3 | 2.61592 |
0.4 | 2.83096 |
0.5 | 3.06448 |
0.6 | 3.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)=e−x
② 先构造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.01700ex−1.00304ex
拟合函数:三项偶次多项式 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
(掌握了原理,任何编程语言都可以实现拟合方法,甚至还可以自己写一个属于自己的拟合工具箱!!)
自行编写代码还是太麻烦?其实matlab早为我们考虑了这个问题!利用Curving Fitting Tools帮助我们快速实现拟合。Curving Fitting Tools参考文档:https://www.mathworks.com/help/curvefit/curve-fitting.html?searchHighlight=curving fit&s_tid=srchtitle
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} R−Square=∑i=1n(y−yi)2/∑i=1n(y−yi)2,趋近于1较好
DFE:误差项自由度
RMSE(Root Mean Squared Error):均方根误差
#Coeff:模型的系数数量(非自定义模型时出现),相近拟合效果选择数量少的,防止过拟合。
有些时候我们不仅需要拟合的图像,还需要拟合的结果。利用Curving Fitting Tools 得到的拟合模型可以直接生成代码非常方便!
点击窗口左上角:文件(Files)—> Generate Code
自动生成的函数保存下来,就可以直接调用了
创建脚本test 测试自动生成的函数
matlab默认为我们绘制了一幅图,同时返回了两个对象:fitresult 和 gof
① 直接将fitresult作为函数,可按照拟合公式返回数值解。
② fitresult.相关参数,返回相关拟合参数。