1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 最小二乘法函数拟合原理及matlab实现—数学笔记

最小二乘法函数拟合原理及matlab实现—数学笔记

时间:2018-11-17 10:32:45

相关推荐

最小二乘法函数拟合原理及matlab实现—数学笔记

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

——数值分析数学笔记


如有纰漏,欢迎指正

文章目录

最小二乘法函数拟合原理及matlab实现前言一、拟合标准1.使偏差向量满足 1 1 1 - 范数2.使偏差向量满足 ∞ \infty ∞ - 范数3.使偏差向量满足 2 2 2 - 范数 二、最小二乘法原理1.最小二乘法 多项式拟合(常用)1.1最小二乘法的多项式拟合公式 推导。1.2 结论:1.3 案例1: 2.最小二乘法的一般形式(线性)(非重点) 2.1 线性最小二乘法的一般形式推导 2.2 结论 2.3 案例2 三、最小二乘法应用(matlab)1. 自行编写代码实现2. 利用Curving Fitting Tools工具箱2.1 命令行输入cftool即可打开工具箱2.2 拟合结果的调用2.2.1生成代码(Generate Code)2.2.2调用函数2.2.3返回值fitresult 和 gof 的调用

前言

对大量实验数据 ( 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 的对应关系。

对于第一个特点,假设我们构造出了一个函数,结果发现很多甚至所有的实验数据都不在函数图像上?这合适吗?这很合适!因为带有误差的实验数据落在了函数曲线上,那就说明我们的曲线是存在误差的。如果我们得到的数据(一定不是实验的数据,可能是经过计算得到的数据)能够保证准确无误。那么应该优先考虑通过插值的方法构造函数。

对于第二个特点,若是实验数据很少,我们能否强行构造函数呢?能,但构造出的函数是没有意义的,它不能体现总体水平。因此我们需要大量的实验数据。

对于第三个特点,如果 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​) (这能记录每个数据点的偏差,即总体

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=1∑m​∣ri​∣=∣r1​∣+∣r2​∣+...+∣rm​∣=min

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

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

数学表达式: 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​ 最小,即最大的偏差都最小。既然最大的偏差都最小了,这个标准非常合适。这种拟合方式称之为最佳一致逼近。(但不是本文的内容,也暂不讨论)

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=1∑m​ri2​ ​=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​+a1​x+a2​x2+...+an​xn 就是想要的拟合函数,那么每个数据的偏差 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=1m​xi​)a1​+(∑i=1m​xi2​)a2​+...+(∑i=1m​xin​)an​=∑i=1m​yi​(∑i=1m​xi​)a0​+(∑i=1m​xi2​)a1​+(∑i=1m​xi3​)a2​+...+(∑i=1m​xi(n+1)​an​=∑i=1m​xi​yi​(∑i=1m​xi2​)a0​+(∑i=1m​xi3​)a1​+(∑i=1m​xi4​)a2​+...+(∑i=1m​xi(n+2)​an​=∑i=1m​xi2​yi​(∑i=1m​xin​)a0​+(∑i=1m​xin+1​)a1​+(∑i=1m​xin+2​)a2​+...+(∑i=1m​xi(n+n)​an​=∑i=1m​xin​yi​​​​​⋮​

这个方程组称之为法方程组,注意到 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​+a1​x+a2​x2+...+an​xn

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​+a1​x+a2​x2+...+an​xn 对应系数。

1.3 案例1:

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

设多项式函数为: 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​+a1​x+a2​x2

将数据点带入法方程组

{ 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=1∑m​(yi​−φ(xi​))2 ​=h∈ϕmin​i=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=0n​ak​φ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=1m​yi​φ0​(xi​)∑k=0n​(∑i=1m​φk​(xi​)φ1​(xi​))ak​=∑i=1m​yi​φ1​(xi​)∑k=0n​(∑i=1m​φk​(xi​)φ2​(xi​))ak​=∑i=1m​yi​φ2​(xi​)∑k=0n​(∑i=1m​φk​(xi​)φn​(xi​))ak​=∑i=1m​yi​φ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​+a1​ex+a2​e−x

解:

① 由题意: φ 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​)​⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞​=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛​1111111​11.105171.221401.349861.491821.648721.82212​10.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


三、最小二乘法应用(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​+a2​x2+a3​x4

matlab代码如下:

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

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

2. 利用Curving Fitting Tools工具箱

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

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

在命令框中输入 cftool 即可打开工具箱

选定拟合的对象

选定拟合函数类

例如选择多项式拟合:

工具箱中个参数的含义

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:模型的系数数量(非自定义模型时出现),相近拟合效果选择数量少的,防止过拟合。

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.相关参数,返回相关拟合参数。


如有问题,欢迎讨论

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。