ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 测量专用

[分享] vb 矩阵计算程序(转载)

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-2 14:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MSymTri
'  功能:  用豪斯荷尔德变换约化对称矩阵为对称三对角矩阵
'  参数:   n    - Integer型变量,对称矩阵的阶数。
'          dblA  - Double型二维数组,体积为n x n。存放n阶对称矩阵。
'          dblQ  - Double型二维数组,体积为n x n。返回时存放豪斯荷尔德变换的乘积矩阵Q。
'          dblT - Double型二维数组,体积为n x n。返回时存放对称三对角矩阵T。
'          dblB - Double型一维数组,长度为n。返回时存放对称三对角矩阵T主对角线上的元素。
'          dblC - Double型一维数组,长度为n。返回时前n-1个元素存放对称三对角矩阵T次对角线上的元素。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub MSymTri(n As Integer, dblA() As Double, dblQ() As Double, dblT() As Double, dblB() As Double, dblC() As Double)
    Dim i As Integer, j As Integer, k As Integer
    Dim h As Double, f As Double, g As Double, h2 As Double

    For i = 1 To n
        For j = 1 To n
            dblQ(i, j) = dblA(i, j)
        Next j
    Next i

    For i = n To 2 Step -1
        h = 0#
        If (i > 2) Then
            For k = 1 To i - 1
                h = h + dblQ(i, k) * dblQ(i, k)
            Next k
        End If

        If (h + 1# = 1#) Then
            dblC(i) = 0#
            If (i = 2) Then dblC(i) = dblQ(i, i - 1)
            dblB(i) = 0#
        Else
            dblC(i) = Sqr(h)
            
            If (dblQ(i, i - 1) > 0#) Then dblC(i) = -dblC(i)
            
            h = h - dblQ(i, i - 1) * dblC(i)
            dblQ(i, i - 1) = dblQ(i, i - 1) - dblC(i)
            f = 0#

            For j = 1 To i - 1
                dblQ(j, i) = dblQ(i, j) / h
                g = 0#
                For k = 1 To j
                  g = g + dblQ(j, k) * dblQ(i, k)
                Next k

                If (j + 1 <= i - 1) Then
                    For k = j + 1 To i - 1
                        g = g + dblQ(k, j) * dblQ(i, k)
                    Next k
                End If

                dblC(j) = g / h
                f = f + g * dblQ(j, i)
            Next j

            h2 = f / (h + h)
            For j = 1 To i - 1
                f = dblQ(i, j)
                g = dblC(j) - h2 * f
                dblC(j) = g
                For k = 1 To j
                    dblQ(j, k) = dblQ(j, k) - f * dblC(k) - g * dblQ(i, k)
                Next k
            Next j

            dblB(i) = h
        End If
    Next i

    For i = 1 To n - 1
        dblC(i) = dblC(i + 1)
    Next i

    dblC(n) = 0#
    dblB(1) = 0#
    For i = 1 To n
        If ((dblB(i) <> 0#) And (i - 1 >= 0)) Then
          For j = 1 To i - 1
                g = 0#
                For k = 1 To i - 1
                    g = g + dblQ(i, k) * dblQ(k, j)
                Next k
                For k = 1 To i - 1
                    dblQ(k, j) = dblQ(k, j) - g * dblQ(k, i)
                Next k
          Next j
        End If

        dblB(i) = dblQ(i, i)
        dblQ(i, i) = 1#
        If (i - 1 >= 0) Then
            For j = 1 To i - 1
                dblQ(i, j) = 0#
                dblQ(j, i) = 0#
            Next j
        End If
    Next i
   
    ' 构造对称三对角矩阵
    For i = 1 To n
        For j = 1 To n
            dblT(i, j) = 0
            k = i - j
            If k = 0 Then dblT(i, j) = dblB(j)
            If k = 1 Then dblT(i, j) = dblC(j)
            If k = -1 Then dblT(i, j) = dblC(i)
        Next j
    Next i
   
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-2 14:54 | 显示全部楼层
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MSymTriEigenv
'  功能:  用变形QR方法计算对称三对角矩阵的全部特征值和特征向量
'  参数:   n    - Integer型变量,对称三对角矩阵的阶数。
'          dblB - Double型一维数组,长度为n,存放对称三对角矩阵T主对角线上的元素。返回时,存放全部特征值。
'          dblC - Double型一维数组,长度为n,前n-1个元素存放对称三对角矩阵T次对角线上的元素。
'          dblQ - Double型二维数组,体积为n x n。
'                 1)如果存放单位矩阵,则返回n阶对称三对角矩阵的特征向量组。
'                 2)如果存放对称矩阵A的豪斯荷尔德变换的乘积矩阵Q(可由函数MSymTri求得),则返回n阶对称矩阵A的特征向量组。
'                    其中dblQ中的第j列为与数组dblB中第j个特征值对应的特征向量。
'          eps  - Double型变量。迭代过程中的控制精度参数。
'          nMaxItNum    - Integer。为求得一个特征值所允许的最大迭代次数。
'  返回值: Boolean型。False,失败无解;True, 成功
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function MSymTriEigenv(n As Integer, dblB() As Double, dblC() As Double, dblQ() As Double, eps As Double, nMaxItNum As Integer) As Boolean
    ' 局部变量
    Dim i As Integer, j As Integer, k As Integer, m As Integer, it As Integer
    Dim d As Double, f As Double, h As Double, g As Double, p As Double, r As Double, e As Double, s As Double

    dblC(n) = 0#
    d = 0#
    f = 0#
   
    For j = 1 To n
        it = 0
        h = eps * (Abs(dblB(j)) + Abs(dblC(j)))
        If (h > d) Then d = h
        m = j
        While ((m <= n) And (Abs(dblC(m)) > d))
            m = m + 1
        Wend

        If (m <> j) Then
            Do
                If (it = nMaxItNum) Then
                    MSymTriEigenv = False
                    Exit Function
                End If

                it = it + 1
                g = dblB(j)
                p = (dblB(j + 1) - g) / (2# * dblC(j))
                r = Sqr(p * p + 1#)

                If (p >= 0#) Then
                    dblB(j) = dblC(j) / (p + r)
                Else
                    dblB(j) = dblC(j) / (p - r)
                End If

                h = g - dblB(j)
                For i = j + 1 To n
                  dblB(i) = dblB(i) - h
                Next i

                f = f + h
                p = dblB(m)
                e = 1#
                s = 0#
               
                For i = m - 1 To j Step -1
                    g = e * dblC(i)
                    h = e * p
                    If (Abs(p) >= Abs(dblC(i))) Then
                        e = dblC(i) / p
                        r = Sqr(e * e + 1#)
                        dblC(i + 1) = s * p * r
                        s = e / r
                        e = 1# / r
                    Else
                        e = p / dblC(i)
                        r = Sqr(e * e + 1#)
                        dblC(i + 1) = s * dblC(i) * r
                        s = 1# / r
                        e = e / r
                    End If

                    p = e * dblB(i) - s * g
                    dblB(i + 1) = h + s * (e * g + s * dblB(i))
                    For k = 1 To n
                        h = dblQ(k, i + 1)
                        dblQ(k, i + 1) = s * dblQ(k, i) + e * h
                        dblQ(k, i) = e * dblQ(k, i) - s * h
                    Next k
                Next i

                dblC(j) = s * p
                dblB(j) = e * p

            Loop While (Abs(dblC(j)) > d)

        End If

        dblB(j) = dblB(j) + f

    Next j

    For i = 1 To n
        k = i
        p = dblB(i)
        If (i + 1 <= n) Then
            j = i + 1
            While ((j <= n) And (dblB(j) <= p))
                k = j
                p = dblB(j)
                j = j + 1
            Wend
        End If

        If (k <> i) Then
            dblB(k) = dblB(i)
            dblB(i) = p
            
            For j = 1 To n
                p = dblQ(j, i)
                dblQ(j, i) = dblQ(j, k)
                dblQ(j, k) = p
            Next j
        End If
    Next i

    MSymTriEigenv = True
   
End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-2 14:59 | 显示全部楼层
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MHberg
'  功能:  用初等相似变换约化一般矩阵为赫申伯格(Hessen Berg)矩阵
'  参数:   n    - Integer型变量,矩阵的阶数。
'          mtxA  - Double型二维数组,体积为n x n。存放n阶矩阵;返回时存放矩阵的H矩阵。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub MHberg(n As Integer, mtxA() As Double)
    ' 局部变量
    Dim i As Integer, j As Integer, k As Integer
    Dim d As Double, t As Double

    For k = 2 To n - 1
        d = 0#
        For j = k To n
            t = mtxA(j, k - 1)
            If (Abs(t) > Abs(d)) Then
                d = t
                i = j
            End If
        Next j

        If (Abs(d) + 1# <> 1#) Then
            If (i <> k) Then
                For j = k - 1 To n
                    t = mtxA(i, j)
                    mtxA(i, j) = mtxA(k, j)
                    mtxA(k, j) = t
                Next j
                For j = 1 To n
                    t = mtxA(j, i)
                    mtxA(j, i) = mtxA(j, k)
                    mtxA(j, k) = t
                Next j
            End If

            For i = k + 1 To n
                t = mtxA(i, k - 1) / d
                mtxA(i, k - 1) = 0#

                For j = k To n
                    mtxA(i, j) = mtxA(i, j) - t * mtxA(k, j)
                Next j

                For j = 1 To n
                    mtxA(j, k) = mtxA(j, k) + t * mtxA(j, i)
                Next j
            Next i
        End If
    Next k
  
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-2 15:01 | 显示全部楼层
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MHbergEigenv
'  功能:  用QR方法计算赫申伯格(Hessen Berg)矩阵的全部特征值
'  参数:   n    - Integer型变量,赫申伯格矩阵的阶数。
'          dblA - Double型二维数组,体积为n x n。存放赫申伯格矩阵。
'          dblUR - Double型一维数组,长度为n,存放n个特征值的实部。
'          dblUI - Double型一维数组,长度为n,存放n个特征值的虚部。。
'          eps  - Double型变量。迭代过程中的控制精度参数。
'          nMaxItNum    - Integer。为求得一个特征值所允许的最大迭代次数。
'  返回值: Boolean型。False,失败无解;True, 成功
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function MHbergEigenv(n As Integer, dblA() As Double, dblUR() As Double, dblUI() As Double, eps As Double, nMaxItNum As Integer) As Boolean
    ' 局部变量
    Dim i As Integer, j As Integer, k As Integer, l As Integer, m As Integer, it As Integer
    Dim b As Double, c As Double, w As Double, g As Double, xy As Double, p As Double, q As Double
    Dim r As Double, x As Double, s As Double, e As Double, f As Double, z As Double, y As Double

    it = 0
    m = n + 1
   
    While (m <> 1)
        l = m - 1
        While ((l > 1) And (Abs(dblA(l, l - 1)) > eps * (Abs(dblA(l - 1, l - 1)) + Abs(dblA(l, l)))))
            l = l - 1
        Wend

        If (l = m - 1) Then
            dblUR(m - 1) = dblA(m - 1, m - 1)
            dblUI(m - 1) = 0#
            m = m - 1
            it = 0
        Else
            If (l = m - 2) Then
                b = -(dblA(m - 1, m - 1) + dblA(m - 2, m - 2))
                c = dblA(m - 1, m - 1) * dblA(m - 2, m - 2) - dblA(m - 1, m - 2) * dblA(m - 2, m - 1)
                w = b * b - 4# * c
                y = Sqr(Abs(w))

                If (w > 0#) Then
                    xy = 1#
                    If (b < 0#) Then xy = -1#
                    dblUR(m - 1) = (-b - xy * y) / 2#
                    dblUR(m - 2) = c / dblUR(m - 1)
                    dblUI(m - 1) = 0#
                    dblUI(m - 2) = 0#
                Else
                    dblUR(m - 1) = -b / 2#
                    dblUR(m - 2) = dblUR(m - 1)
                    dblUI(m - 1) = y / 2#
                    dblUI(m - 2) = -dblUI(m - 1)
                End If
               
                m = m - 2
                it = 0
            Else
                If (it >= nMaxItNum) Then
                    MHbergEigenv = False
                    Exit Function
                End If

                it = it + 1
                For j = l + 2 To m - 1
                  dblA(j, j - 2) = 0#
                Next j

                For j = l + 3 To m - 1
                  dblA(j, j - 3) = 0#
                Next j

                For k = l To m - 2
                    If (k <> l) Then
                        p = dblA(k, k - 1)
                        q = dblA(k + 1, k - 1)
                        r = 0#
                        If (k <> m - 2) Then r = dblA(k + 2, k - 1)
                    Else
                        x = dblA(m - 1, m - 1) + dblA(m - 2, m - 2)
                        y = dblA(m - 2, m - 2) * dblA(m - 1, m - 1) - dblA(m - 2, m - 1) * dblA(m - 1, m - 2)
                        
                        p = dblA(l, l) * (dblA(l, l) - x) + dblA(l, l + 1) * dblA(l + 1, l) + y
                        q = dblA(l + 1, l) * (dblA(l, l) + dblA(l + 1, l + 1) - x)
                        r = dblA(l + 1, l) * dblA(l + 2, l + 1)
                    End If

                    If ((Abs(p) + Abs(q) + Abs(r)) <> 0#) Then
                        xy = 1#
                        If (p < 0#) Then xy = -1#

                        s = xy * Sqr(p * p + q * q + r * r)
                        If (k <> l) Then dblA(k, k - 1) = -s
                        e = -q / s
                        f = -r / s
                        x = -p / s
                        y = -x - f * r / (p + s)
                        g = e * r / (p + s)
                        z = -x - e * q / (p + s)
                        For j = k To m - 1
                            p = x * dblA(k, j) + e * dblA(k + 1, j)
                            q = e * dblA(k, j) + y * dblA(k + 1, j)
                            r = f * dblA(k, j) + g * dblA(k + 1, j)

                            If (k <> m - 2) Then
                                p = p + f * dblA(k + 2, j)
                                q = q + g * dblA(k + 2, j)
                                r = r + z * dblA(k + 2, j)
                                dblA(k + 2, j) = r
                            End If

                            dblA(k + 1, j) = q
                            dblA(k, j) = p
                        Next j

                        j = k + 3
                        If (j >= m - 1) Then j = m - 1

                        For i = l To j
                            p = x * dblA(i, k) + e * dblA(i, k + 1)
                            q = e * dblA(i, k) + y * dblA(i, k + 1)
                            r = f * dblA(i, k) + g * dblA(i, k + 1)
                           
                            If (k <> m - 2) Then
                                p = p + f * dblA(i, k + 2)
                                q = q + g * dblA(i, k + 2)
                                r = r + z * dblA(i, k + 2)
                                dblA(i, k + 2) = r
                            End If

                            dblA(i, k + 1) = q
                            dblA(i, k) = p
                        Next i
                    End If
                Next k
            End If
        End If
    Wend

    MHbergEigenv = True

End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-2 15:03 | 显示全部楼层
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MJacobiEigenv
'  功能:  用雅可比法(Jacobi)计算对称矩阵的特征值和特征向量
'  参数:   n    - Integer型变量,对称矩阵的阶数。
'          dblA - Double型二维数组,体积为n x n。存放对称矩阵;返回时,对角线上存放求得的n个特征值。
'          dblV - Double型二维数组,体积为n x n。返回n个特征向量,其中第i列为第i个特征值dblA(i,i)对应的特征向量。
'          eps  - Double型变量。迭代过程中的控制精度参数。
'          nMaxItNum    - Integer。为求得一个特征值所允许的最大迭代次数。
'  返回值: Boolean型。False,失败无解;True, 成功
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function MJacobiEigenv(n As Integer, dblA() As Double, dblV() As Double, eps As Double, nMaxItNum As Integer) As Boolean
    ' 局部变量
    Dim i As Integer, j As Integer, p As Integer, q As Integer, l As Integer
    Dim fm As Double, cn As Double, sn As Double, omega As Double, x As Double, y As Double, d As Double
   
    l = 1
    For i = 1 To n
        dblV(i, i) = 1#
        For j = 1 To n
          If (i <> j) Then dblV(i, j) = 0#
        Next j
    Next i

    While (True)
        fm = 0#
        For i = 2 To n
            For j = 1 To i - 1
                d = Abs(dblA(i, j))
                If ((i <> j) And (d > fm)) Then
                    fm = d
                    p = i
                    q = j
                End If
            Next j
        Next i

        If (fm < eps) Then
            MJacobiEigenv = True
            Exit Function
        End If

        If (l > nMaxItNum) Then
            MJacobiEigenv = False
            Exit Function
        End If

        l = l + 1
        x = -dblA(p, q)
        y = (dblA(q, q) - dblA(p, p)) / 2#
        omega = x / Sqr(x * x + y * y)
        If (y < 0#) Then omega = -omega
        sn = 1# + Sqr(1# - omega * omega)
        sn = omega / Sqr(2# * sn)
        cn = Sqr(1# - sn * sn)
        fm = dblA(p, p)
        dblA(p, p) = fm * cn * cn + dblA(q, q) * sn * sn + dblA(p, q) * omega
        dblA(q, q) = fm * sn * sn + dblA(q, q) * cn * cn - dblA(p, q) * omega
        dblA(p, q) = 0#
        dblA(q, p) = 0#

        For j = 1 To n
            If ((j <> p) And (j <> q)) Then
                fm = dblA(p, j)
                dblA(p, j) = fm * cn + dblA(q, j) * sn
                dblA(q, j) = -fm * sn + dblA(q, j) * cn
            End If
        Next j

        For i = 1 To n
          If ((i <> p) And (i <> q)) Then
              fm = dblA(i, p)
              dblA(i, p) = fm * cn + dblA(i, q) * sn
              dblA(i, q) = -fm * sn + dblA(i, q) * cn
          End If
        Next i

        For i = 1 To n
            fm = dblV(i, p)
            dblV(i, p) = fm * cn + dblV(i, q) * sn
            dblV(i, q) = -fm * sn + dblV(i, q) * cn
        Next i
    Wend

End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-2 15:05 | 显示全部楼层
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MJacobiEigenv2
'  功能:  用雅可比(Jacobi)过关法计算对称矩阵的特征值和特征向量
'  参数:   n    - Integer型变量,对称矩阵的阶数。
'          dblA - Double型二维数组,体积为n x n。存放对称矩阵;返回时,对角线上存放求得的n个特征值。
'          dblV - Double型二维数组,体积为n x n。返回n个特征向量,其中第i列为第i个特征值dblA(i,i)对应的特征向量。
'          eps  - Double型变量。迭代过程中的控制精度参数。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub MJacobiEigenv2(n As Integer, dblA() As Double, dblV() As Double, eps As Double)
    ' 局部变量
    Dim i As Integer, j As Integer, p As Integer, q As Integer
    Dim ff As Double, fm As Double, cn As Double, sn As Double, omega As Double, x As Double, y As Double, d As Double
   
    For i = 1 To n
        dblV(i, i) = 1#
        For j = 1 To n
          If (i <> j) Then dblV(i, j) = 0#
        Next j
    Next i

    ff = 0#
    For i = 2 To n
        For j = 1 To i
            d = dblA(i, j)
            ff = ff + d * d
        Next j
    Next i

    ff = Sqr(2# * ff)

loop_0:

    ff = ff / (1# * n)

loop_1:

    For i = 2 To n
        For j = 1 To i - 1
            d = Abs(dblA(i, j))
            If (d > ff) Then
                p = i
                q = j
                GoTo loop_2
            End If
        Next j
    Next i

    ' 计算已达到精度要求,返回
    If (ff < eps) Then Exit Sub

    GoTo loop_0

loop_2:

     x = -dblA(p, q)
     y = (dblA(q, q) - dblA(p, p)) / 2#
     omega = x / Sqr(x * x + y * y)
     If (y < 0#) Then omega = -omega
     sn = 1# + Sqr(1# - omega * omega)
     sn = omega / Sqr(2# * sn)
     cn = Sqr(1# - sn * sn)
     fm = dblA(p, p)
     dblA(p, p) = fm * cn * cn + dblA(q, q) * sn * sn + dblA(p, q) * omega
     dblA(q, q) = fm * sn * sn + dblA(q, q) * cn * cn - dblA(p, q) * omega
     dblA(p, q) = 0#
     dblA(q, p) = 0#

     For j = 1 To n
         If ((j <> p) And (j <> q)) Then
             fm = dblA(p, j)
             dblA(p, j) = fm * cn + dblA(q, j) * sn
             dblA(q, j) = -fm * sn + dblA(q, j) * cn
         End If
     Next j

     For i = 1 To n
       If ((i <> p) And (i <> q)) Then
           fm = dblA(i, p)
           dblA(i, p) = fm * cn + dblA(i, q) * sn
           dblA(i, q) = -fm * sn + dblA(i, q) * cn
       End If
     Next i

     For i = 1 To n
         fm = dblV(i, p)
         dblV(i, p) = fm * cn + dblV(i, q) * sn
         dblV(i, q) = -fm * sn + dblV(i, q) * cn
     Next i

    GoTo loop_1
      
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-2 15:06 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-6-2 20:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
从哪弄来的,这些东东

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-2 22:26 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-6-2 22:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

什么地方,来个地址,我也去转转看看还有什么好东东
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-19 11:58 , Processed in 0.038371 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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