数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 3756|回复: 0

编程高手帮个忙,给我看看这个vb程序

  [复制链接]
发表于 2006-1-12 22:17:59 | 显示全部楼层 |阅读模式
<>这程序是用来求解一个线性拟合,先用最小二乘法建立函数,再通过Gasuss-Newton法求解</P>
<>程序如下:</P>
<>Private Sub Command1_Click()<BR>Dim a As Double<BR>Dim re(10), r(10), s(3), x(3), x1(3), f(10) As Double<BR>Dim j(10, 3), j1(3, 10), c(3, 1), d(3, 3) As Double<BR>   re(1) = 4658: re(23) = 5820: re(3) = 6525: re(4) = 7400: re(5) = 9045: re(6) = 10350: re(7) = 11050: re(8) = 11820: re(9) = 12850: re(10) = 13840<BR>   r(1) = 0.0399: r(2) = 0.0386: r(3) = 0.0368: r(4) = 0.0362: r(5) = 0.0349: r(6) = 0.0339: r(7) = 0.0341: r(8) = 0.0323: r(9) = 0.0324: r(10) = 0.0321<BR>   a = 0.001<BR> For i = 1 To 3<BR>  x(i) = 0<BR>  s(i) = 0.01<BR>  Next i<BR> While ((Abs(s(1)) + Abs(s(2)) + Abs(s(3))) &gt; 0.0001)<BR> For i = i To 3<BR>  <BR>  s(i) = 0<BR>  Next i<BR> For i = 1 To 10<BR>   j(i, 1) = 2 * Exp(x(2) * Log(re(i))) * (x(1) * Exp(x(2) * Log(re(i))) + x(3) - r(i))<BR>   j(i, 2) = 2 * x(1) * Log(re(i)) * Exp(x(2) * Log(re(i))) * (x(1) * Exp(x(2) * Log(re(i))) + x(3) - r(i))<BR>   j(i, 3) = 2 * (x(1) * Exp(x(2) * Log(re(i))) + x(3) - r(i))<BR>   f(i) = (x(1) * Exp(x(2) * Log(re(i))) + x(3) - r(i)) ^ 2<BR>   Next i<BR>   Call MTrans(10, 3, j(), j1())<BR>   Call MMul(3, 10, 1, j1(), f(), c())<BR>   Call MMul(3, 10, 3, j1(), j(), d())<BR>   Call MRinv(3, d())<BR>   Call MMul(3, 3, 1, d(), c(), s())<BR>   For i = 1 To 3<BR>    x1(i) = x(i) - a * s(i)<BR>    x(i) = x1(i)<BR>    Next i<BR>    Wend<BR>For i = 1 To 3<BR>  Print x(i)<BR>  Next i<BR>End Sub<BR>Function MRinv(n As Integer, mtxA() As Double) As Boolean<BR>    '求逆矩阵<BR>    ReDim nIs(n) As Integer, nJs(n) As Integer<BR>    Dim i As Integer, j As Integer, k As Integer<BR>    Dim d As Double, p As Double</P>
<P>   <BR>    For k = 1 To n<BR>        d = 0#<BR>        For i = k To n<BR>            For j = k To n<BR>                p = Abs(mtxA(i, j))<BR>                If (p &gt; d) Then<BR>                    d = p<BR>                    nIs(k) = i<BR>                    nJs(k) = j<BR>                End If<BR>            Next j<BR>        Next i<BR>        <BR>     <BR>        If (d + 1# = 1#) Then<BR>            MRinv = False<BR>            Exit Function<BR>        End If</P>
<P>        If (nIs(k) &lt;&gt; k) Then<BR>            For j = 1 To n<BR>                p = mtxA(k, j)<BR>                mtxA(k, j) = mtxA(nIs(k), j)<BR>                mtxA(nIs(k), j) = p<BR>            Next j<BR>        End If</P>
<P>        If (nJs(k) &lt;&gt; k) Then<BR>            For i = 1 To n<BR>                p = mtxA(i, k)<BR>                mtxA(i, k) = mtxA(i, nJs(k))<BR>                mtxA(i, nJs(k)) = p<BR>            Next i<BR>        End If</P>
<P>        mtxA(k, k) = 1# / mtxA(k, k)<BR>        For j = 1 To n<BR>            If (j &lt;&gt; k) Then mtxA(k, j) = mtxA(k, j) * mtxA(k, k)<BR>        Next j<BR>        For i = 1 To n<BR>            If (i &lt;&gt; k) Then<BR>                For j = 1 To n<BR>                    If (j &lt;&gt; k) Then mtxA(i, j) = mtxA(i, j) - mtxA(i, k) * mtxA(k, j)<BR>                Next j<BR>            End If<BR>        Next i<BR>        For i = 1 To n<BR>            If (i &lt;&gt; k) Then mtxA(i, k) = -mtxA(i, k) * mtxA(k, k)<BR>        Next i<BR>    Next k</P>
<P>  <BR>    For k = n To 1 Step -1<BR>        If (nJs(k) &lt;&gt; k) Then<BR>          For j = 1 To n<BR>              p = mtxA(k, j)<BR>              mtxA(k, j) = mtxA(nJs(k), j)<BR>              mtxA(nJs(k), j) = p<BR>          Next j<BR>        End If<BR>        If (nIs(k) &lt;&gt; k) Then<BR>          For i = 1 To n<BR>              p = mtxA(i, k)<BR>              mtxA(i, k) = mtxA(i, nIs(k))<BR>              mtxA(i, nIs(k)) = p<BR>          Next i<BR>        End If<BR>    Next k<BR>    <BR> <BR>    MRinv = True</P>
<P>End Function<BR>Sub MMul(m As Integer, n As Integer, l As Integer, mtxA() As Double, mtxB() As Double, mtxC() As Double)<BR>    Dim i As Integer, j As Integer, k As Integer<BR>  '矩阵乘法<BR>    For i = 1 To m<BR>        For j = 1 To l<BR>            mtxC(i, j) = 0#<BR>            For k = 1 To n<BR>                mtxC(i, j) = mtxC(i, j) + mtxA(i, k) * mtxB(k, j)<BR>            Next k<BR>        Next j<BR>    Next i</P>
<P>End Sub<BR>Sub MTrans(m As Integer, n As Integer, mtxA() As Double, mtxAT() As Double)<BR>    Dim i As Integer, j As Integer<BR>   '矩阵转置</P>
<P>    For i = 1 To m<BR>        For j = 1 To n<BR>            mtxAT(i, j) = mtxAT(j, i)<BR>        Next j<BR>    Next i</P>
<P>End Sub<BR>拜托各位拉!!!</P>
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 05:23 , Processed in 0.048921 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表