?? 最小二乘法多次曲線擬合.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 + -