📄 最小二乘法多次曲线拟合.htm
字号:
COLOR: #ffffff; TEXT-DECORATION: none
}
</STYLE>
<META content="MSHTML 5.50.3825.1300" name=GENERATOR></HEAD>
<BODY text=#000000 bgColor=#ffffff>
<TABLE cellSpacing=0 cellPadding=10 width="100%" border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=1 cellPadding=4 width="100%" border=0>
<TBODY>
<TR>
<TD><FONT class=bigfont><B>最小二乘法多次曲线拟合</B></FONT></TD></TR>
<TR>
<TD><SPAN class=normalfont>2004-05-22
www.vbgood.com</SPAN></TD></TR>
<TR>
<TD><SPAN class=normalfont>打印自: <A
href="http://article.itebook.net/">免费电子图书下载:</A><BR>地址: <A
href="http://article.itebook.net/article.php/1467">http://article.itebook.net/article.php/1467</A></SPAN></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=1 cellPadding=4 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top>
<DIV class=subhead><B>最小二乘法多次曲线拟合</B></DIV></TD></TR>
<TR>
<TD vAlign=top>
<DIV class=content><FONT
color=#000000>本人项目用到最小二乘法多次曲线拟合,便抽时间写了一个实现的程序,不敢独享,如下:</FONT>
<P><FONT color=#000000>Option Explicit</FONT></P>
<P><FONT
color=#000000>'****************************************************************************************************<BR>'**
X()------Double 实型一维数组,长度为 n 。存放给定 n
个数据点的 X 坐标。
**<BR>'** Y()------Double 实型一维数组,长度为 n 。存放给定 n
个数据点的 Y 坐标。
**<BR>'** n-------Integer
变量。给定数据点的个数。
**<BR>'** a()------Double 实型一维数组,长度为 m 。返回 m-1 次拟合多项式的 m
个系数。
**<BR>'** m-------Integer 变量。拟合多项式的项数,即拟合多项式的最高次数为
m-1。
**<BR>'**
要求 m<=n 且m<=20。若 m>n 或 m>20 ,则本函数自动按 m=min{n,20}
处理。
**<BR>'**rdblAverageX--Double 变量,返回给定n个数据点的 X
坐标的平均值
**<BR>'** dt()------Double 实型一维数组,长度为
3。其中:
**<BR>'**
dt(0)
返回拟合多项式与数据点误差的平方各;
**<BR>'**
dt(1)
返回拟合多项式与数据点误差的绝对值之和;
**<BR>'**
dt(2)
返回拟合多项式与数据点误差绝对值的最大值。
**<BR>'*****************************************************************************************************</FONT></P>
<P><FONT color=#000000>Public Sub Iapcir(X() As Double,
_<BR>
Y() As Double,
_<BR>
ByVal n As Integer,
_<BR>
ByRef a() As Double,
_<BR>
ByVal m As Integer,
_<BR>
ByRef rdblAverageX As Double,
_<BR>
ByRef dt() As
Double)<BR>
<BR> Dim I As Integer, J As Integer, K As
Integer<BR> Dim Z As Double, P As Double, C As
Double, G As Double, Q As Double, D1 As Double, D2 As
Double<BR> Dim S(19) As Double, T(19) As Double,
B(19) As Double<BR> <BR> For I = 0 To
m - 1<BR> a(I) =
0<BR> Next I<BR> <BR> If m
> n Then m = n<BR> If m > 20 Then m =
20<BR> <BR> Z = 0#<BR>
<BR> For I = 0 To n -
1<BR> rdblAverageX =
rdblAverageX + X(I)<BR> Z = Z +
X(I) / (1# * n)<BR> Next I<BR>
rdblAverageX = rdblAverageX / n<BR>
<BR> B(0) = 1#<BR> D1 = 1# *
n<BR> P = 0#<BR> C =
0#<BR> <BR> For I = 0 To n -
1<BR> P = P + (X(I) -
Z)<BR> C = C +
Y(I)<BR> Next I<BR> <BR> C
= C / D1<BR> P = P / D1<BR> a(0) = C *
B(0)<BR> <BR> If m
> 1 Then<BR> T(1) =
1#<BR> T(0) = (-1) *
P<BR> D2 =
0#<BR> C =
0#<BR> G =
0#<BR> For I = 0 To n -
1<BR> Q = X(I)
- Z - P<BR> D2
= D2 + Q *
Q<BR> C = C +
Y(I) * Q<BR> G
= G + (X(I) - Z) * Q * Q<BR>
Next I<BR>
<BR> C = C /
D2<BR> P = G /
D2<BR> Q = D2 /
D1<BR> D1 =
D2<BR> a(1) = C *
T(1)<BR> a(0) = C * T(0) +
a(0)<BR> End If<BR> <BR>
For J = 2 To m - 1<BR> S(J) =
T(J - 1)<BR> S(J - 1) = (-1) * P
* T(J - 1) + T(J - 2)<BR>
<BR> If J >= 3
Then<BR> For K
= J - 2 To 1 Step
-1<BR>
S(K) = (-1) * P * T(K) + T(K - 1) - Q *
B(K)<BR> Next
K<BR> End
If<BR>
<BR> S(0) = (-1) * P * T(0) - Q
* B(0)<BR>
<BR> D2 =
0#<BR> C =
0#<BR> G =
0#<BR>
<BR> For I = 0 To n -
1<BR> Q =
S(J)<BR>
<BR> For K = J
- 1 To 0 Step
-1<BR>
Q = Q * (X(I) - Z) +
S(K)<BR> Next
K<BR>
<BR> D2 = D2 +
Q * Q<BR> C =
C + Y(I) *
Q<BR> G = G +
(X(I) - Z) * Q * Q<BR> Next
I<BR>
<BR> C = C /
D2<BR> P = G /
D2<BR> Q = D2 /
D1<BR> D1 =
D2<BR> a(J) = C *
S(J)<BR> T(J) =
S(J)<BR>
<BR> For K = J - 1 To 0 Step
-1<BR> a(K) =
C * S(K) +
a(K)<BR> B(K)
= T(K)<BR>
T(K) = S(K)<BR> Next
K<BR> Next J<BR> <BR>
dt(0) = 0#<BR> dt(1) = 0#<BR> dt(2) =
0#<BR> <BR> For I = 0 To n -
1<BR> Q = a(m -
1)<BR>
<BR> For K = m - 2 To 0 Step
-1<BR> Q =
a(K) + Q * (X(I) - Z)<BR> Next
K<BR>
<BR> P = Q -
Y(I)<BR>
<BR> If Abs(P) > dt(2)
Then<BR> dt(2)
= Abs(P)<BR> End
If<BR> dt(0) = dt(0) + P *
P<BR> dt(1) = dt(1) +
Abs(P)<BR> Next I<BR> <BR>End
Sub<BR></FONT></P></DIV></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD align=right>
<TR>
<TD vAlign=top align=right><SPAN class=normalfont><B>责任编辑:</B>
mousesure</SPAN></TD></TR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<SCRIPT language=JavaScript>
window.print();
</SCRIPT>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -