将方阵化为上Hessenberg矩阵

来源:互联网 发布:恒久软件 编辑:程序博客网 时间:2024/05/16 15:23

上Hessenberg矩阵

形如把

b =

[ 54.0000000000000  40.0000000000000  10.0000000000000  76.0000000000000

  47.0000000000000  20.0000000000000  94.0000000000000  49.0000000000000

  26.0000000000000  80.0000000000000  94.0000000000000  70.0000000000000

  3.00000000000000  92.0000000000000  83.0000000000000  45.0000000000000 ]

化为:

b1 =

[ 54.0000000000000  50.3829787234043  82.9789551473672  10.0000000000000

  47.0000000000000  75.1276595744681  114.602178385252  94.0000000000000

  0.00000000000000  135.991851516523  95.6102950602596  77.0000000000000

  0.00000000000000  0.00000000000000  5.47923255500914  -11.737954634727 ]

的这种矩阵。b1的特点是在矩阵的下三角部分的次对焦线元素不为0外,其它元素均为0,则b1就叫做b的上H(Hessenberg)矩阵 。

注意:Hessenberg矩阵与原矩阵的行列式、特征值均相同。

//*********************************************************************************************************************************

下面是代码的实现。

Math_Matrix_Hessenberg(A,n,ret)

A:我们要转化的n阶方阵

n:方阵A的阶数

ret:转化成功的n阶方阵(其就是我们要的值)

函数返回值为n

Public Function Math_Matrix_Hessenberg(ByVal A(,) As DoubleByVal n As Int16ByRef ret(,) As DoubleAs Int16

        Dim i As Int16

        Dim j As Int16

        Dim k As Int16

        Dim temp As Double

        Dim MaxNumber As Int16

        n -= 1

        ReDim ret(n, n)

        For k = 1 To n - 1

            i = k - 1

            MaxNumber = k

            temp = Math.Abs(A(k, i))

            For j = k + 1 To n

                If Math.Abs(A(j, i)) > temp Then

                    MaxNumber = j

                End If

            Next

            ret(0, 0) = A(MaxNumber, i) '储存最大值

            i = MaxNumber

            If ret(0, 0) <> 0 Then

                If i <> k Then

                    For j = k - 1 To n

                        temp = A(i, j)

                        A(i, j) = A(k, j)

                        A(k, j) = temp

                    Next

                    For j = 0 To n

                        temp = A(j, i)

                        A(j, i) = A(j, k)

                        A(j, k) = temp

                    Next

                End If

                For i = k + 1 To n

                    temp = A(i, k - 1) / ret(0, 0)

                    A(i, k - 1) = 0

                    For j = k To n

                        A(i, j) -= temp * A(k, j)

                    Next

                    For j = 0 To n

                        A(j, k) += temp * A(j, i)

                    Next

                Next

            End If

        Next

        For i = 0 To n

            For j = 0 To n

                ret(i, j) = A(i, j)

            Next

        Next

        Return n + 1

    End Function

0 0
原创粉丝点击