Adjunta de una matriz
Hola nuevamente programadores un poco de teoria de:
http://es.wikipedia.org/wiki/Matriz_de_adjuntos
Dada una matriz cuadrada A, su matriz de adjuntos o matriz de cofactores cof(A) es la resultante de sustituir cada término aij de A por el cofactor aij de A. El término matriz adjunta adj(A) suele crear confusión, ya que en muchos tratados clásicos sobre álgebra lineal corresponde a la matriz de cofactores traspuesta,sin embargo, en otros textos, se corresponde a la matriz de cofactores, puesto que llaman de la misma manera adjunto al cofactor y de ahí que sea adjunta. Aparte, también se utiliza el símbolo adj( ) indistintamente a cof( ) para el cálculo en los elementos de una matriz, haciendo, si cabe, la confusión más amplia.
El interés principal de la matriz adjunta es que permite calcular la inversa de una matriz, ya que se cumple la relación:
Dada una matriz de 3 x 3:
Module Module1
Dim A(500, 500) As Double
Dim Adjunta(500, 500) As Double
Dim n As Integer
Sub Main()
Console.BackgroundColor = ConsoleColor.White
Console.Clear()
Console.ForegroundColor = ConsoleColor.Black
Console.Title = "ADJUNTA DE UNA MATRIZ"
Console.Write(vbLf) 'Da un enter
Console.Write("" & vbTab & " ADJUNTA DE UNA MATRIZ ")
Console.Write(vbLf)
Console.Write(vbLf)
Call Ingresar()
Call Presentar()
Call ADJ(A)
Call Imprimir()
End Sub
Sub Ingresar()
' Ingresa el tamaño de la matrix cuadrada
Console.Write("" & vbTab & "Ingrese el orden de la matriz (n): ", n)
n = Integer.Parse(Console.ReadLine())
' Lee los datos ingresados por teclado
Console.WriteLine("" & vbLf & " * Ingrese los elementos de la Matriz A * " & vbLf & "")
For i As Integer = 1 To n
For j As Integer = 1 To n
Console.Write("" & vbTab & "Elemento [{0},{1}] : ", i, j)
A(i, j) = Double.Parse(Console.ReadLine()) ' Lectura de datos
Next
Next
End Sub
Sub Presentar()
Console.WriteLine("" & vbLf & " * La Matriz A ingresada es : *" & vbLf & "")
For i As Integer = 1 To n
For j As Integer = 1 To n
Console.Write("" & vbTab & "{0,2:f4}", A(i, j))
Next
Console.Write("" & vbLf & "")
Next
End Sub
Sub ADJ(ByVal Aux(,) As Double)
Dim A2(500, 500), MCofa(500, 500) As Double
Dim temp, deter, mult As Double
Dim numero, r, q, p, j, l, g As Integer
Console.WriteLine("" & vbLf & " * La Matriz Adjunta es : " & vbLf & "")
' Calcula cada menor
For p = 1 To n
For s As Integer = 1 To n
r = 0
For i As Integer = 1 To n
q = 0
If p <> i Then
r = r + 1
End If
For j = 1 To n
If p <> i Then
If s <> j Then
q = q + 1
A2(r, q) = Aux(i, j)
End If
End If
Next j
Next i
deter = 1
For k As Integer = 1 To n - 1
If A2(k, k) = 0 Then
For y As Integer = k To n
If A2(y, k) <> 0 Then
l = y
Exit For
End If
Next y
For m As Integer = k To n
temp = A2(k, m)
A2(k, m) = A2(l, m)
A2(l, m) = temp
Next m
deter = -deter
End If
For y As Integer = k + 1 To n + 1
If A2(y, k) <> 0 Then
mult = A2(y, k) / A2(k, k)
For m As Integer = k To n
A2(y, m) = A2(y, m) - A2(k, m) * mult
Next m
End If
Next y
Next k
' Saca la determinante para cada cofactor
For y As Integer = 1 To n - 1
deter = deter * A2(y, y)
'Calculo El Cofactor o Adjunto: Cij=(-1)^(i+j)
numero = (s + p)
For i As Integer = 1 To 100
numero += -2
If numero = 0 Then
g = 1
Else
If numero = 1 Then
g = -1
End If
End If
Next i
'Matriz de Cofactores
MCofa(p, s) = g * deter
Next y
Next s
Next p
'Transpone la Matriz de Cofactores
For i As Integer = 1 To n
For j = 1 To n
Adjunta(i, j) = MCofa(j, i)
Next j
Next i
' ADJ = deter
End Sub
Sub Imprimir()
For i As Integer = 1 To n
For j As Integer = 1 To n
Console.Write("" & vbTab & "{0,2:f2}", Adjunta(i, j))
Next j
Console.Write("" & vbLf & "")
Next i
Console.ReadLine()
End Sub
End Module
Mi captura al ejecutar
Los códigos presentados por mi son, para matrices de nxn osea cuadradas. Espero tus comentarios o preguntas a mi correo, no vemos en otra publicación
http://es.wikipedia.org/wiki/Matriz_de_adjuntos
Dada una matriz cuadrada A, su matriz de adjuntos o matriz de cofactores cof(A) es la resultante de sustituir cada término aij de A por el cofactor aij de A. El término matriz adjunta adj(A) suele crear confusión, ya que en muchos tratados clásicos sobre álgebra lineal corresponde a la matriz de cofactores traspuesta,sin embargo, en otros textos, se corresponde a la matriz de cofactores, puesto que llaman de la misma manera adjunto al cofactor y de ahí que sea adjunta. Aparte, también se utiliza el símbolo adj( ) indistintamente a cof( ) para el cálculo en los elementos de una matriz, haciendo, si cabe, la confusión más amplia.
El interés principal de la matriz adjunta es que permite calcular la inversa de una matriz, ya que se cumple la relación:
donde adj(A) corresponde a la matriz de cofactores traspuesta, o sea,
- .
Dada una matriz de 3 x 3:
Su matriz de cofactores viene dada por:
y por lo tanto la transpuesta de la matriz de cofactores es la matriz Adjunta:
Para matrices de 3x3 también puede usarse la siguiente fórmula:
Ejemplo
Un ejemplo sería el siguiente:Matrices n x n
Para matrices con n grande, el costo computacional del cálculo de adjuntos es grande, por lo que si el objetivo es calcular la inversa de una matriz, se recurre a otros algoritmos de cálculos que no impliquen calcular primero la matriz de adjuntos. Para el cálculo de la matriz de adjuntos en el caso general, puede emplearse la siguiente fórmula:Al final lo que se busca la implementacion en VB 2010 en Consola
Module Module1
Dim A(500, 500) As Double
Dim Adjunta(500, 500) As Double
Dim n As Integer
Sub Main()
Console.BackgroundColor = ConsoleColor.White
Console.Clear()
Console.ForegroundColor = ConsoleColor.Black
Console.Title = "ADJUNTA DE UNA MATRIZ"
Console.Write(vbLf) 'Da un enter
Console.Write("" & vbTab & " ADJUNTA DE UNA MATRIZ ")
Console.Write(vbLf)
Console.Write(vbLf)
Call Ingresar()
Call Presentar()
Call ADJ(A)
Call Imprimir()
End Sub
Sub Ingresar()
' Ingresa el tamaño de la matrix cuadrada
Console.Write("" & vbTab & "Ingrese el orden de la matriz (n): ", n)
n = Integer.Parse(Console.ReadLine())
' Lee los datos ingresados por teclado
Console.WriteLine("" & vbLf & " * Ingrese los elementos de la Matriz A * " & vbLf & "")
For i As Integer = 1 To n
For j As Integer = 1 To n
Console.Write("" & vbTab & "Elemento [{0},{1}] : ", i, j)
A(i, j) = Double.Parse(Console.ReadLine()) ' Lectura de datos
Next
Next
End Sub
Sub Presentar()
Console.WriteLine("" & vbLf & " * La Matriz A ingresada es : *" & vbLf & "")
For i As Integer = 1 To n
For j As Integer = 1 To n
Console.Write("" & vbTab & "{0,2:f4}", A(i, j))
Next
Console.Write("" & vbLf & "")
Next
End Sub
Sub ADJ(ByVal Aux(,) As Double)
Dim A2(500, 500), MCofa(500, 500) As Double
Dim temp, deter, mult As Double
Dim numero, r, q, p, j, l, g As Integer
Console.WriteLine("" & vbLf & " * La Matriz Adjunta es : " & vbLf & "")
' Calcula cada menor
For p = 1 To n
For s As Integer = 1 To n
r = 0
For i As Integer = 1 To n
q = 0
If p <> i Then
r = r + 1
End If
For j = 1 To n
If p <> i Then
If s <> j Then
q = q + 1
A2(r, q) = Aux(i, j)
End If
End If
Next j
Next i
deter = 1
For k As Integer = 1 To n - 1
If A2(k, k) = 0 Then
For y As Integer = k To n
If A2(y, k) <> 0 Then
l = y
Exit For
End If
Next y
For m As Integer = k To n
temp = A2(k, m)
A2(k, m) = A2(l, m)
A2(l, m) = temp
Next m
deter = -deter
End If
For y As Integer = k + 1 To n + 1
If A2(y, k) <> 0 Then
mult = A2(y, k) / A2(k, k)
For m As Integer = k To n
A2(y, m) = A2(y, m) - A2(k, m) * mult
Next m
End If
Next y
Next k
' Saca la determinante para cada cofactor
For y As Integer = 1 To n - 1
deter = deter * A2(y, y)
'Calculo El Cofactor o Adjunto: Cij=(-1)^(i+j)
numero = (s + p)
For i As Integer = 1 To 100
numero += -2
If numero = 0 Then
g = 1
Else
If numero = 1 Then
g = -1
End If
End If
Next i
'Matriz de Cofactores
MCofa(p, s) = g * deter
Next y
Next s
Next p
'Transpone la Matriz de Cofactores
For i As Integer = 1 To n
For j = 1 To n
Adjunta(i, j) = MCofa(j, i)
Next j
Next i
' ADJ = deter
End Sub
Sub Imprimir()
For i As Integer = 1 To n
For j As Integer = 1 To n
Console.Write("" & vbTab & "{0,2:f2}", Adjunta(i, j))
Next j
Console.Write("" & vbLf & "")
Next i
Console.ReadLine()
End Sub
End Module
Mi captura al ejecutar
Los códigos presentados por mi son, para matrices de nxn osea cuadradas. Espero tus comentarios o preguntas a mi correo, no vemos en otra publicación
amigo gracias por el aporte, pero me gustaria que me explicaras como acomodar el codigo a lo visual, me refiero establecer formularios para que se aprecie visualmente elegante, como para realizar una presentacion.
ResponderEliminarUna de las formas es presentando la matriz en una grid para ser directo en una datagridview
ResponderEliminarMuy buena explicaciòn, gracias funciona 100%
ResponderEliminar