vb中如何求一个矩阵的逆矩阵
请问各位大虾
如何在VB中要怎样才能实现一个矩阵的逆矩阵
谢谢大家指导啦
[解决办法]
' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
' 模块名:MatrixModule.bas
' 函数名:MCinv
' 功能: 实矩阵求逆的全选主元高斯-约当法
' 参数: n - Integer型变量,矩阵的阶数
' mtxAR - Double型二维数组,体积为n x n。存放原矩阵A的实部;返回时存放其逆矩阵A-的实部。
' mtxAI - Double型二维数组,体积为n x n。存放原矩阵A的虚部;返回时存放其逆矩阵A-的虚部。
' 返回值:Boolean型,失败为False,成功为True
' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
Function MCinv(n As Integer, mtxAR() As Double, mtxAI() As Double) As Boolean
' 局部变量
ReDim nIs(n) As Integer, nJs(n) As Integer
Dim i As Integer, j As Integer, k As Integer
Dim d As Double, p As Double, s As Double, t As Double, q As Double, b As Double
' 全选主元,消元
For k = 1 To n
d = 0#
For i = k To n
For j = k To n
p = mtxAR(i, j) * mtxAR(i, j) + mtxAI(i, j) * mtxAI(i, j)
If (p > d) Then
d = p
nIs(k) = i
nJs(k) = j
End If
Next j
Next i
' 求解失败
If (d + 1# = 1#) Then
MCinv = False
Exit Function
End If
If (nIs(k) <> k) Then
For j = 1 To n
t = mtxAR(k, j)
mtxAR(k, j) = mtxAR(nIs(k), j)
mtxAR(nIs(k), j) = t
t = mtxAI(k, j)
mtxAI(k, j) = mtxAI(nIs(k), j)
mtxAI(nIs(k), j) = t
Next j
End If
If (nJs(k) <> k) Then
For i = 1 To n
t = mtxAR(i, k)
mtxAR(i, k) = mtxAR(i, nJs(k))
mtxAR(i, nJs(k)) = t
t = mtxAI(i, k)
mtxAI(i, k) = mtxAI(i, nJs(k))
mtxAI(i, nJs(k)) = t
Next i
End If
mtxAR(k, k) = mtxAR(k, k) / d
mtxAI(k, k) = -mtxAI(k, k) / d
For j = 1 To n
If (j <> k) Then
p = mtxAR(k, j) * mtxAR(k, k)
q = mtxAI(k, j) * mtxAI(k, k)
s = (mtxAR(k, j) + mtxAI(k, j)) * (mtxAR(k, k) + mtxAI(k, k))
mtxAR(k, j) = p - q
mtxAI(k, j) = s - p - q
End If
Next j
For i = 1 To n
If (i <> k) Then
For j = 1 To n
If (j <> k) Then
p = mtxAR(k, j) * mtxAR(i, k)
q = mtxAI(k, j) * mtxAI(i, k)
s = (mtxAR(k, j) + mtxAI(k, j)) * (mtxAR(i, k) + mtxAI(i, k))
t = p - q
b = s - p - q
mtxAR(i, j) = mtxAR(i, j) - t
mtxAI(i, j) = mtxAI(i, j) - b
End If
Next j
End If
Next i
For i = 1 To n
If (i <> k) Then
p = mtxAR(i, k) * mtxAR(k, k)
q = mtxAI(i, k) * mtxAI(k, k)
s = (mtxAR(i, k) + mtxAI(i, k)) * (mtxAR(k, k) + mtxAI(k, k))
mtxAR(i, k) = q - p
mtxAI(i, k) = p + q - s
End If
Next i
Next k
' 调整恢复行列次序
For k = n To 1 Step -1
If (nJs(k) <> k) Then
For j = 1 To n
t = mtxAR(k, j)
mtxAR(k, j) = mtxAR(nJs(k), j)
mtxAR(nJs(k), j) = t
t = mtxAI(k, j)
mtxAI(k, j) = mtxAI(nJs(k), j)
mtxAI(nJs(k), j) = t
Next j
End If
If (nIs(k) <> k) Then
For i = 1 To n
t = mtxAR(i, k)
mtxAR(i, k) = mtxAR(i, nIs(k))
mtxAR(i, nIs(k)) = t
t = mtxAI(i, k)
mtxAI(i, k) = mtxAI(i, nIs(k))
mtxAI(i, nIs(k)) = t
Next i
End If
Next k
' 求解成功
MCinv = True
End Function
[解决办法]
http://www.celiang.net/celiang/article_view.asp?id=9