微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

VB.Net矩阵求特征值

Public Function Math_Matrix_EigenValue(ByVal K1(,) As Single,ByVal n As Integer,ByVal LoopNumber As Integer,ByVal Errro As Int16,ByRef Ret(,) As Double) As Boolean 'ret里是n*2的数组,第一列是实数部分,第2列为虚数部分
        Dim i As Integer = K1.Length / n
        If i * n <> K1.Length Then
            Return False
        End If
        Dim j As Integer
        Dim k As Integer
        Dim t As Integer
        Dim m As Integer
        Dim A(0,0) As Single
        ReDim Ret(n - 1,1) 'uv
        Dim erro As Double = Math.Pow(0.1,Errro)
        Dim b As Single
        Dim c As Single
        Dim d As Single
        Dim g As Single
        Dim xy As Single
        Dim p As Single
        Dim q As Single
        Dim r As Single
        Dim x As Single
        Dim s As Single
        Dim e As Single
        Dim f As Single
        Dim z As Single
        Dim y As Single
        Dim loop1 As Integer = LoopNumber
        Math_Matrix_Hessenberg(K1,n,A) '将方阵K1转化成上Hessenberg矩阵A
        m = n
        While m <> 0
            t = m - 1
            While t > 0
                If Math.Abs(A(t,t - 1)) > erro * (Math.Abs(A(t - 1,t - 1)) + Math.Abs(A(t,t))) Then
                    t -= 1
                Else
                    Exit While
                End If
            End While
            If t = m - 1 Then
                Ret(m - 1,0) = A(m - 1,m - 1)
                Ret(m - 1,1) = 0
                m -= 1
                loop1 = LoopNumber
            ElseIf t = m - 2 Then
                b = -(A(m - 1,m - 1) + A(m - 2,m - 2))
                c = A(m - 1,m - 1) * A(m - 2,m - 2) - A(m - 1,m - 2) * A(m - 2,m - 1)
                d = b * b - 4 * c
                y = Math.Pow(Math.Abs(d),0.5)
                If d > 0 Then
                    xy = 1
                    If b < 0 Then
                        xy = -1
                    End If
                    Ret(m - 1,0) = -(b + xy * y) / 2
                    Ret(m - 1,1) = 0
                    Ret(m - 2,0) = c / Ret(m - 1,0)
                    Ret(m - 2,1) = 0
                Else
                    Ret(m - 1,0) = -b / 2
                    Ret(m - 2,0) = Ret(m - 1,0)
                    Ret(m - 1,1) = y / 2
                    Ret(m - 2,1) = -Ret(m - 1,1)
                End If
                m -= 2
                loop1 = LoopNumber
            Else
                If loop1 < 1 Then
                    Return False
                End If
                loop1 -= 1
                j = t + 2
                While j < m
                    A(j,j - 2) = 0
                    j += 1
                End While
                j = t + 3
                While j < m
                    A(j,j - 3) = 0
                    j += 1
                End While
                k = t
                While k < m - 1
                    If k <> t Then
                        p = A(k,k - 1)
                        q = A(k + 1,k - 1)
                        If k <> m - 2 Then
                            r = A(k + 2,k - 1)
                        Else
                            r = 0
                        End If
                    Else
                        b = A(m - 1,m - 1)
                        c = A(m - 2,m - 2)
                        x = b + c
                        y = c * b - A(m - 2,m - 1) * A(m - 1,m - 2)
                        p = A(t,t) * (A(t,t) - x) + A(t,t + 1) * A(t + 1,t) + y
                        q = A(t + 1,t) + A(t + 1,t + 1) - x)
                        r = A(t + 1,t) * A(t + 2,t + 1)
                    End If
                    If p <> 0 Or q <> 0 Or r <> 0 Then
                        If p < 0 Then
                            xy = -1
                        Else
                            xy = 1
                        End If
                        s = xy * Math.Pow(p * p + q * q + r * r,0.5)
                        If k <> t Then
                            A(k,k - 1) = -s
                        End If
                        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
                            b = A(k,j)
                            c = A(k + 1,j)
                            p = x * b + e * c
                            q = e * b + y * c
                            r = f * b + g * c
                            If k <> m - 2 Then
                                b = A(k + 2,j)
                                p += f * b
                                q += g * b
                                r += z * b
                                A(k + 2,j) = r
                            End If
                            A(k + 1,j) = q
                            A(k,j) = p
                        Next
                        j = k + 3
                        If j >= m - 1 Then
                            j = m - 1
                        End If
                        For i = t To j
                            b = A(i,k)
                            c = A(i,k + 1)
                            p = x * b + e * c
                            q = e * b + y * c
                            r = f * b + g * c
                            If k <> m - 2 Then
                                b = A(i,k + 2)
                                p += f * b
                                q += g * b
                                r += z * b
                                A(i,k + 2) = r
                            End If
                            A(i,k + 1) = q
                            A(i,k) = p
                        Next
                    End If
                    k += 1
                End While
            End If
        End While
        Return True
    End Function




Public Function Math_Matrix_Hessenberg(ByVal A(,ByRef ret(,) As Single) As Integer
        Dim i As Integer
        Dim j As Integer
        Dim k As Integer
        Dim temp As Single
        Dim Maxnumber As Integer
        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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr