Método de Gauss Seidel
- Guerrini Filho, Hélio
- 3 de jan. de 2018
- 3 min de leitura
Implementação em VBA do método numérico iterativo de Gauss Seidel para solução de sistemas lineares.
Clique na imagem acima e baixe a planilha VBA do método.
Com o sistema escrito na sua forma matricial [K].{U} = {R}, a matriz de coeficientes [K] deve ser digitada no campo em laranja e o vetor {R} de termos independentes deve ser digitado no campo em verde.
O fator de relaxação beta deve ser ajustado entre 1,3 e 1,9 (valores usuais). Após [K] , {R} e beta definidos na planilha clique no botão "Calcular - GS" para que a macro forneça no campo em azul o vetor {U} de valores das variáveis do sistema linear.
Exemplo de sistema linear

CÓDIGO VBA
General Declarations
Option Base 1 ' define a contagem da posição dos elementos da matriz a partir de 1
CommandButton1 Click
Private Sub CommandButton1_Click() 'Declaração de variáveis 'vetores dinâmicos da matrix [A] e dos vetores {b} Dim matrizA(), vetorB() As Double 'Fator de relaxação Beta e parâmetro de convergência Epsilon Dim Beta, Epsilon As Double 'Parâmetro de soma dos têrmos de uma linha Dim Soma, Soma2 As Double 'vetores {x} referente a iteração corrente (s) [vetorXs] e a próxima iteração (s+1) [vetorXs1] Dim vetorXs(), vetorXs1(), vetorDeltaX() As Double 'parâmetros de contagem Dim i, j, k, n, r As Integer
'Determinação da dimensão n das matrizes e vetores n = 0 Do ActiveSheet.Range("F7").Select If ActiveCell.Offset(0, n).Value = "" Then Exit Do n = n + 1 Loop
'Redimensionamento de matrizes e vetores ReDim matrizA(n, n) ReDim vetorB(n) ReDim vetorXs(n) ReDim vetorXs1(n) ReDim vetorDeltaX(n)
'Leitura do coeficiente Beta ActiveSheet.Range("F4").Select Beta = ActiveCell.Offset(0, 0).Value
'Leitura do vetor {b} ActiveSheet.Range("B7").Select 'Ativa a célula do 1º do vetor {B} For i = 1 To n vetorB(i) = ActiveCell.Offset(i - 1, 0).Value Next i
'Leitura da matrix [A] ActiveSheet.Range("F7").Select For i = 1 To n For j = 1 To n matrizA(i, j) = ActiveCell.Offset(i - 1, j - 1).Value Next j Next i
'Inicia os vetores vetorXs(), vetorXs1() For i = 1 To n vetorXs(i) = 0 vetorXs1(i) = 0 vetorDeltaX(i) = 0 Next i
'Método de Gauss - Seidel Do For k = 1 To n 'Obtém o vetorDeltaX correspondente a vetorDeltaX={b}-[A](L)*{x}(s+1), onde [A](L) 'é a matriz triangular inferior e {x}(s+1) é o vetor da próxima iteração. For l = 2 To n Soma = 0 For i = 1 To l - 1 Soma = Soma + (matrizA(l, i) * vetorXs1(i)) vetorDeltaX(l) = vetorB(l) - Soma Next i Next l vetorDeltaX(1) = vetorB(1) 'Obtém o vetorDeltaX correspondente a vetorDeltaX = vetorDeltaX-[A]T(L)*{x}(s), onde [A]T(L) 'é a matriz triangular inferior transposta e {x}(s) é o vetor da iteração corrente. For i = 1 To n - 1 For l = i + 1 To n vetorDeltaX(i) = vetorDeltaX(i) - (matrizA(i, l) * vetorXs(l)) Next l Next i
'Obtém o vetorDeltaX correspondente a vetorDeltaX = beta*[A]-1(D)*(vetorDeltaX-[A](D)*{x}(s)), ' onde [A](D) é a matriz diagonal e {x}(s) é o vetor da iteração corrente. For i = 1 To n vetorDeltaX(i) = vetorDeltaX(i) - (matrizA(i, i) * vetorXs(i)) vetorDeltaX(i) = Beta * (1 / matrizA(i, i)) * vetorDeltaX(i) 'obtém o vetorXs1 da próxima iteração vetorXs1(i) = vetorXs(i) + vetorDeltaX(i) Next i
Next k 'Conta o número de iterações iteracao = iteracao + 1 For j = 1 To iteracao For i = 1 To n ActiveCell.Offset(n + i, n + j).Value = vetorXs1(i) Next i Next j 'Verifica a tolerância de convergência Soma = 0: Soma2 = 0 For j = 1 To n Soma = Soma + (vetorXs1(j) - vetorXs(j)) ^ 2 Soma2 = Soma2 + (vetorXs1(j)) ^ 2 Next j Epsilon = (Soma ^ 0.5) / (Soma2 ^ 0.5) If Epsilon <= 0.00001 Then Exit Do
'Iguala o vetor {x}(s+1) ao {x}(s) For j = 1 To n vetorXs(j) = vetorXs1(j) Next j
Loop
'Escreve o valor do resultado obtido ActiveSheet.Range("D7").Select For j = 1 To n ActiveCell.Offset(j - 1, 0).Value = vetorXs1(j) Next j 'Escreve o número de iterações ActiveSheet.Range("I4").Select ActiveCell.Offset(0, 0).Value = iteracao End Sub
WorkSheet SelectionChange
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End Sub
Boa diversão!!!