曲线拟合的数值方法 |
您所在的位置:网站首页 › 指数方程的解法步骤 › 曲线拟合的数值方法 |
《数值计算方法》系列总目录 第一章 误差序列实验 第二章 非线性方程f(x)=0求根的数值方法 第三章 CAD模型旋转和AX=B的数值方法 第四章 插值与多项式逼近的数值计算方法 第五章 曲线拟合的数值方法 第六章 数值微分计算方法 第七章 数值积分计算方法 第八章 数值优化方法 第五章 一、算法原理1、最小二乘拟合曲线2、曲线拟合原理3、样条插值4、贝塞尔曲线5、三角多项式原理 二、实验内容及核心算法代码1、最小二乘拟合曲线原理实现2、曲线拟合原理实现3、样条函数插值原理实现4、三角多项式原理实现5、贝塞尔曲线原理实现 三、结果分析1、最小二乘拟合曲线实例分析2、曲线拟合实例分析3、样条函数插值实例分析4、三角多项式实例分析5、贝塞尔曲线实例分析 四、结论 一、算法原理 1、最小二乘拟合曲线 在科学和工程试验中,经常产生一组数据(
x
1
,
y
1
x_1,y_1
x1,y1),…,(
x
N
,
y
N
x_N,y_N
xN,yN),这里的横坐标{
x
k
x_k
xk}是明确的的。数值方法的目标之一是确定一个将这些变量联系起来的函数
y
=
f
(
x
)
y = f(x)
y=f(x),即通过算法形成一种数学刻画的公式来寻求其中的规律。通常会选择一类可用的函数并确定它们的系数,然而这类函数不是随便选取的,必须根据实际的实验数据进行判断,选取最符合的函数模型,因此选择函数的可能性是多种多样的。一般会根据物理情况采用一个基本数学模型来确定函数的形式。这一节主要分析线性函数,其形式为
y
=
f
(
x
)
=
A
x
+
B
y = f(x) = Ax + B
y=f(x)=Ax+B 根据插值多项式逼近原理,如果所有的数值{
x
k
x_k
xk},{
y
k
y_k
yk}已知有多位有效数字精度,则能成功地使用多项式插值;否则,不能使用多项式插值。因为插值多项式是根据已有的精确的实验数据进行多项式拟合的,其拟合结果一定会经过插值点,如果插值点数据本身存在较大误差,则逼近结果就会出现更大误差。然而,许多试验数据可能并没有如此高的精度,而且通常在试验中还存在试验误差,所以尽管记录的{
x
k
x_k
xk},{
y
k
y_k
yk}有多位有效数字,但还是与其真实值存在范围外的误差,即真实值
f
(
x
k
)
f(x_k)
f(xk)满足
f
(
x
k
)
=
y
k
+
e
k
f(x_k)=y_k+e_k
f(xk)=yk+ek,其中,
e
k
e_k
ek表示测量误差,因此需要寻找一种经过测试点附近(不总是穿过)的最佳线性逼近表达式。下面首先对误差(又称偏差或残差)概念进行一个介绍:
e
k
=
f
(
x
k
)
−
y
k
,
f
o
r
1
≤
k
≤
N
{e_k} = f({x_k}) - {y_k},{\rm{ }}for{\rm{ }}1 \le k \le N
ek=f(xk)−yk,for1≤k≤N 其中,
y
k
y_k
yk测量实验值,
f
(
x
k
)
f(x_k)
f(xk)表示真实值,误差还有其他表示如下形式:
E
∞
(
f
)
=
max
1
≤
k
≤
N
{
∣
f
(
x
k
)
−
y
k
∣
}
{E_\infty }(f) = \mathop {\max }\limits_{1 \le k \le N} \{ |f({x_k}) - {y_k}|\}
E∞(f)=1≤k≤Nmax{∣f(xk)−yk∣}
E
1
(
f
)
=
1
N
∑
k
=
1
N
∣
f
(
x
k
)
−
y
k
∣
{E_1}(f) = \frac{1}{N}\sum\limits_{k = 1}^N {\left| {f({x_k}) - {y_k}} \right|}
E1(f)=N1k=1∑N∣f(xk)−yk∣
E
2
(
f
)
=
(
1
N
∑
k
=
1
N
∣
f
(
x
k
)
−
y
k
∣
2
)
1
/
2
{E_2}(f) = {\left( {\frac{1}{N}\sum\limits_{k = 1}^N {{{\left| {f({x_k}) - {y_k}} \right|}^2}} } \right)^{1/2}}
E2(f)=(N1k=1∑N∣f(xk)−yk∣2)1/2 那么如何确定系数
A
,
B
A,B
A,B使得曲线拟合达到我们想要的效果呢?其中,最小二乘法是在进行曲线拟合时常用的一种求解拟合曲线表达式的方法,无论是拟合何种曲线,其系数求解基本思想都是基于最小二乘法的。分析可知,设 是一个N个点的集合,其中横坐标是确定的。那么,理想的最小二乘拟合曲线 的拟合结果应满足是均方根误差最小的曲线。那么,所选定的
A
,
B
A,B
A,B构成的拟合曲线应当使
E
2
(
f
)
E_2(f)
E2(f)的值当且仅当所选取的
A
,
B
A,B
A,B值处最小。换言之,也就是说数据点到曲线的垂直距离平方和最小,即误差的平方和,其最小值为
N
(
E
2
(
f
)
2
)
=
∑
k
=
1
N
∣
A
x
k
+
B
−
y
k
∣
2
N({E_2}{(f)^2}) = \sum\limits_{k = 1}^N {{{\left| {A{x_k} + B - {y_k}} \right|}^2}}
N(E2(f)2)=k=1∑N∣Axk+B−yk∣2。那么,基于实验结果的所求出选取
A
,
B
A,B
A,B的值的表达式到底是怎样的呢?因此,有如下推导过程: 设
{
(
x
k
,
y
k
)
}
k
=
1
N
\{ ({x_k},{y_k})\} _{k = 1}^N
{(xk,yk)}k=1N有N个点,其中横坐标是确定的,当数据点到曲线的垂直距离平方和最小时,
A
,
B
A,B
A,B取值点应在误差表达式的极值处,即表达式对于
A
,
B
A,B
A,B两变量的偏导数为0,即
∂
E
(
A
,
B
)
∂
A
=
∑
k
=
1
N
2
(
A
x
k
+
B
−
y
k
)
x
k
=
0
∂
E
(
A
,
B
)
∂
B
=
∑
k
=
1
N
2
(
A
x
k
+
B
−
y
k
)
=
0
\frac{{\partial E(A,B)}}{{\partial A}} = \sum\limits_{k = 1}^N {2\left( {A{x_k} + B - {y_k}} \right){x_k}} = 0\\ \frac{{\partial E(A,B)}}{{\partial B}} = \sum\limits_{k = 1}^N {2\left( {A{x_k} + B - {y_k}} \right)} = 0
∂A∂E(A,B)=k=1∑N2(Axk+B−yk)xk=0∂B∂E(A,B)=k=1∑N2(Axk+B−yk)=0 通过移项变换即得到关于系数
A
,
B
A,B
A,B的表达式如下
(
∑
k
=
1
N
x
k
2
)
A
+
(
∑
k
=
1
N
x
k
)
B
=
∑
k
=
1
N
x
k
y
k
(
∑
k
=
1
N
x
k
)
A
+
N
B
=
∑
k
=
1
N
y
k
\left( {\sum\limits_{k = 1}^N {x_k^2} } \right)A + \left( {\sum\limits_{k = 1}^N {x_k^{}} } \right)B = \sum\limits_{k = 1}^N {{x_k}{y_k}} \\ \left( {\sum\limits_{k = 1}^N {x_k^{}} } \right)A + NB = \sum\limits_{k = 1}^N {{y_k}}
(k=1∑Nxk2)A+(k=1∑Nxk)B=k=1∑Nxkyk(k=1∑Nxk)A+NB=k=1∑Nyk 并称式(5)表示的方程组为正规方程。得到的曲线称为最小二乘拟合曲线。 除此之外,对于形如
f
(
x
)
=
A
x
M
f(x) = A{x^M}
f(x)=AxM幂函数拟合,其中M为已知常数,根据线性曲线的拟合推导过程,写出幂函数数据点到曲线的垂直距离平方和表达式,即
E
(
A
)
=
∑
k
=
1
N
(
A
x
k
M
−
y
k
)
2
E(A) = \sum\limits_{k = 1}^N {{{\left( {Ax_k^M - {y_k}} \right)}^2}}
E(A)=k=1∑N(AxkM−yk)2 求出A为其极小值点时候的值,即表达式对于A的偏导数为0,即
E
′
(
A
)
=
2
∑
k
=
1
N
(
A
x
k
M
−
y
k
)
x
k
M
=
2
∑
k
=
1
N
(
A
x
k
2
M
−
x
k
M
y
k
)
=
0
E'(A) = 2\sum\limits_{k = 1}^N {\left( {Ax_k^M - {y_k}} \right)} x_k^M = 2\sum\limits_{k = 1}^N {\left( {Ax_k^{2M} - x_k^M{y_k}} \right) = 0}
E′(A)=2k=1∑N(AxkM−yk)xkM=2k=1∑N(Axk2M−xkMyk)=0 最终可以得出幂函数拟合曲线的系数A的表达式为 对于不是线性关系的曲线拟合,可以对其进行线性化操作再利用最小二乘法求出其系数的表达式即可。也就是说,对于一组不具有线性关系的数据点集合,可以对其进行诸如取对数、指数的方法将其变换为具有线性关系的表达式,即将数据点
x
k
,
y
k
{xk,yk}
xk,yk变换成
X
Y
XY
XY平面上具有线性关系的点集
X
k
,
Y
k
{Xk,Yk}
Xk,Yk,再利用最小二乘法求出变换后的曲线表达式,最后再变换为原变量的表达式。这个过程称为数据线性化。例如,对于非线性函数[y = C{e^{Ax}}],可以对其进行取对数变化,即
ln
(
y
)
=
A
x
+
ln
(
C
)
\ln (y) = Ax + \ln (C)
ln(y)=Ax+ln(C) 并引入变量, ,得到变换后的线性关系式 ,根据最小二乘法的结果,系数
A
,
B
A,B
A,B表达式为
(
∑
k
=
1
N
X
k
2
)
A
+
(
∑
k
=
1
N
X
k
)
B
=
∑
k
=
1
N
X
k
Y
k
(
∑
k
=
1
N
X
k
)
A
+
N
B
=
∑
k
=
1
N
Y
k
\left( {\sum\limits_{k = 1}^N {X_k^2} } \right)A + \left( {\sum\limits_{k = 1}^N {X_k^{}} } \right)B = \sum\limits_{k = 1}^N {{X_k}{Y_k}} \\ \left( {\sum\limits_{k = 1}^N {X_k^{}} } \right)A + NB = \sum\limits_{k = 1}^N {{Y_k}}
(k=1∑NXk2)A+(k=1∑NXk)B=k=1∑NXkYk(k=1∑NXk)A+NB=k=1∑NYk
C
=
e
B
C = {e^B}
C=eB 则可以得到拟合曲线的表达式。然而,也可以直接写出数据点到曲线的垂直距离平方和表达式,并求出其极值点,即为拟合曲线的系数表达式,其推导过程如下:
E
(
A
,
C
)
=
∑
k
=
1
N
(
C
e
A
x
k
−
y
k
)
2
l
e
t
{
∂
E
∂
A
=
2
∑
k
=
1
N
(
C
e
A
x
k
−
y
k
)
(
C
x
k
e
A
x
k
)
=
0
∂
E
∂
C
=
2
∑
k
=
1
N
(
C
e
A
x
k
−
y
k
)
(
e
A
x
k
)
s
o
{
C
∑
k
=
1
N
x
k
e
2
A
x
k
−
∑
k
=
1
N
y
k
x
k
e
A
x
k
=
0
C
∑
k
=
1
N
e
A
x
k
−
∑
k
=
1
N
y
k
e
A
x
k
=
0
E(A,C) = \sum\limits_{k = 1}^N {{{\left( {C{e^{A{x_k}}} - {y_k}} \right)}^2}} \\ {\rm{let}}\left\{ \begin{array}{l} \frac{{\partial E}}{{\partial A}} = 2\sum\limits_{k = 1}^N {\left( {C{e^{A{x_k}}} - {y_k}} \right)} \left( {C{x_k}{e^{A{x_k}}}} \right){\rm{ = 0}}\\ \frac{{\partial E}}{{\partial C}} = 2\sum\limits_{k = 1}^N {\left( {C{e^{A{x_k}}} - {y_k}} \right)} \left( {{e^{A{x_k}}}} \right) \end{array} \right.\\ {\rm{so}}\\ \left\{ \begin{array}{l} C\sum\limits_{k = 1}^N {{x_k}{e^{2A{x_k}}} - } \sum\limits_{k = 1}^N {{y_k}{x_k}{e^{A{x_k}}}} = 0\\ C\sum\limits_{k = 1}^N {{e^{A{x_k}}} - } \sum\limits_{k = 1}^N {{y_k}{e^{A{x_k}}}} = 0 \end{array} \right.
E(A,C)=k=1∑N(CeAxk−yk)2let⎩⎪⎪⎨⎪⎪⎧∂A∂E=2k=1∑N(CeAxk−yk)(CxkeAxk)=0∂C∂E=2k=1∑N(CeAxk−yk)(eAxk)so⎩⎪⎪⎨⎪⎪⎧Ck=1∑Nxke2Axk−k=1∑NykxkeAxk=0Ck=1∑NeAxk−k=1∑NykeAxk=0 其中未知数
A
,
C
A,C
A,C是非线性的,可用牛顿法求解,可以看出,直接利用最小二乘法求解更加复杂。除此之外,在求解其他函数的拟合曲线的时候,也可以进行类似的数据线性变换。具体如下图所示。 对N+1个点 的多项式插值经常不令人满意。一个N阶多项式可能有N-1个相对极大值和极小值,同时曲线可能会摆动,以经过这些点。另一个方法是将图形分段,每段为一个低阶多项式
S
(
x
)
S(x)
S(x),并在相邻点
(
x
k
,
y
k
)
(x_k,y_k)
(xk,yk)和
(
x
k
+
1
,
y
k
+
1
)
(x_{k+1},y_{k+1})
(xk+1,yk+1)之间进行插值.这样可以保证插值多项式没有高阶多项式插值的摆动性,而且这种插值方法一般是N段的分段函数。这样的分段拟合的函数称之为样条函数。其中一个重要的性质就是插值多项式经过结点。那么,接下来要思考的问题就是每一小段的插值多项式应该选择什么样的多项式。 首先考虑一阶多项式,即一阶拉格朗日多项式。然而不难想到这种拟合方式在大多数情况下下是不适用的,因为拟合后的曲线为一段一段的折线段,显然不符合拟合的要求。然后再来考虑二阶多项式,二阶多项式能满足平滑的特点,但是会发现其在偶数结点处其曲率变化很大,这很有可能导致有非期望的弯曲或畸变。而且二次样条的导数在其结点处不连续。那么如果使用三次样条,则可以使其一阶二阶导数都连续,然而这个条件仅仅需要其多项式系数满足一定要求即可。不再继续考虑更高阶的样条函数是因为三次样条已经能满足需求,不必要牺牲产生震荡失真的代价去考虑高次样条,而且高次样条的系数增多,使求解变得极其困难。那么三次样条的多项式系数该如何确定呢? 首先,我们需要给出三次样条需要满足的条件使其是一个光滑连续的函数,即一阶二阶导数在结点处连续。 ![]() ![]() ![]() ![]() ![]() 综上所述,无论是哪种策略,其都给出了在端点处的一阶或二阶导数取值以及相应的线性方程组,以此来得出除端点外的所有结点二阶导数值,即 m k m_k mk。然后再通过五种策略的根据其他点二阶导数值来确定端点的二阶导数值,从而确定所有系数,最终求出三次样条插值函数。 4、贝塞尔曲线20世纪70年代,雷诺汽车公司的Pierre Bezier和雪铁龙汽车公司的Paul de Castaliau各自独立推导出了CAD/CAM应用中的贝塞尔(Bezier)曲线。这些参数多项式是一类逼近样条。贝塞尔曲线是计算机图形学(CAD/CAM,计算机辅助几何设计)中曲线和曲面表示的基本方法。最初推导的贝塞尔曲线是用递归方法隐式定义的。将它们用伯恩斯坦多项式(Bemnstein polynomial)显式地定义,有助于推导贝塞尔曲线的性质。 其中,N阶伯恩斯坦多项式的定义为 B i , N ( t ) = ( N i ) t i ( 1 − t ) N − i i = 0 , 1 , 2 , . . . , N ( N i ) = N ! t ! ( N − i ) ! {B_{i,N}}(t) = \left( \begin{array}{l} N\\ i \end{array} \right){t^i}{(1 - t)^{N - i}}{\rm{ }}i = 0,1,2,...,N{\rm{ }}\left( \begin{array}{l} N\\ i \end{array} \right) = \frac{{N!}}{{t!(N - i)!}} Bi,N(t)=(Ni)ti(1−t)N−ii=0,1,2,...,N(Ni)=t!(N−i)!N! 一般,N阶伯恩斯坦多项式由N+1项。其中,伯恩斯坦多项式具有几个重要的性质。首先,伯恩斯坦多项式具有递归关系,表现为 B 0 , 0 ( t ) = 1 , B i , N ( t ) = 0 , i < 0 o r i > N B i , N ( t ) = ( 1 − t ) B i , N − 1 ( t ) + t B i − 1 , N − 1 ( t ) = 0 , i = 1 , 2 , 3 , . . . , N − 1 {B_{0,0}}(t) = 1,{B_{i,N}}(t) = 0,{\rm{ }}i < 0{\rm{ }}or{\rm{ }}i > N\\ {B_{i,N}}(t) = \left( {1 - t} \right){B_{i,N - 1}}(t) + t{B_{i - 1,N - 1}}(t) = 0,{\rm{ }}i = 1,2,3,...,N - 1 B0,0(t)=1,Bi,N(t)=0,iNBi,N(t)=(1−t)Bi,N−1(t)+tBi−1,N−1(t)=0,i=1,2,3,...,N−1 因此,任意一个伯恩斯坦多项式可由其递归关系生成,并为后来的贝塞尔函数求解提供手段。其次,伯恩斯坦多项式还具有非负性,即在区间 [ 0 , 1 ] [0,1] [0,1]上是非负函数。因为伯恩斯坦多项式可以看作n次重复实验的伯努利分布的概率公式,其中t可以视为概率p,即只能在区间 [ 0 , 1 ] [0,1] [0,1]内取值,因此,其值也就是概率一定是处在 [ 0 , 1 ] [0,1] [0,1]内的非负数。第三个性质,伯恩斯坦多项式还具有规范性,即 ∑ i = 0 N B i , N ( t ) = 1 \sum\limits_{i = 0}^N {{B_{i,N}}(t)} = 1 i=0∑NBi,N(t)=1 其规范性可以由二项式定理证明。第四个性质,也就是伯恩斯坦多项式的导数性质,即 d d t B i , N ( t ) = N ( B i − 1 , N − 1 ( t ) − B i , N − 1 ( t ) ) \frac{d}{{dt}}{B_{i,N}}(t) = N\left( {{B_{i - 1,N - 1}}(t) - {B_{i,N - 1}}(t)} \right) dtdBi,N(t)=N(Bi−1,N−1(t)−Bi,N−1(t)) 可以对伯恩斯坦多项式的定义是直接求导,即可证明其导数性质。最后一个性质,也是其可以推导出贝塞尔曲线的最重要的一个性质,就是其可以作为基,即N阶伯恩斯坦多项式组成阶数小于等于N的所有多项式的一个基空间。性质5说明,任何阶数小于等于N的多项式都可以惟一地表示为伯恩斯坦多项式的线性组合。 给出贝塞尔曲线的定义,给定一个控制点集 ,一条N阶贝塞尔曲线定义为N阶伯恩斯坦多项式的加权和。即N阶贝塞尔曲线可以表示成 P ( t ) = ∑ i = 0 N P i B i , N ( t ) , i = 0 , 1 , . . . , N , t ∈ [ 0 , 1 ] P(t) = \sum\limits_{i = 0}^N {{P_i}{B_{i,N}}(t)} ,{\rm{ }}i = 0,1,...,N,t \in [0,1] P(t)=i=0∑NPiBi,N(t),i=0,1,...,N,t∈[0,1] 其中 为N阶伯恩斯坦多项式。控制点是表示平面中x和y坐标的有序对。可将控制点作为向量,而对应的伯恩斯坦多项式作为标量处理,这样公式(28)可参数化表示为 P ( t ) = ( x ( t ) , y ( t ) ) P(t)=(x(t),y(t)) P(t)=(x(t),y(t)).其中 x ( t ) = ∑ i = 0 N x i B i , N ( t ) , y ( t ) = ∑ i = 0 N y i B i , N ( t ) , x(t) = \sum\limits_{i = 0}^N {{x_i}{B_{i,N}}(t)} ,{\rm{ }}y(t) = \sum\limits_{i = 0}^N {{y_i}{B_{i,N}}(t)} ,{\rm{ }} x(t)=i=0∑NxiBi,N(t),y(t)=i=0∑NyiBi,N(t), 其中 0 < t < 1 0{P_i}{B_{i,N}}(0)} = {P_0},P(1) = \sum\limits_{i = 0}^N {{P_i}{B_{i,N}}(1)} = {P_N} |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |