Baixe o app para aproveitar ainda mais
Prévia do material em texto
UNIVERSIDADE EDUARDO MONDLANE FACULDADE DE CIÊNCIAS DEPARTAMENTO DE MATEMÁTICA E INFORMÁTICA LICENCIATURA EM INFORMÁTICA (Laboral) III.° Ano Tema: Método de Gauss-Jordan Discentes: Cláudio Raúl Sumburane José Eugénio Seie Docente: Rossana Soares Maputo, Novembro de 2017 Índice Introdução ..................................................................................................................... 2 Algoritmo de Resolução ............................................................................................... 3 Código ........................................................................................................................... 4 Método de Gauss-Jordan 2 Cláudio Sumburane && José Seie Introdução O trabalho a seguir apresentado fala sobre o método conhecido por Eliminação de Gauss- Jordan é uma versão da Eliminação de Gauss que zera os elementos acima e abaixo do elemento de pivotação, conforme ele percorre a matriz. Em outras palavras, a eliminação de Gauss-Jordan transforma a matriz em uma forma escalonada por colunas reduzida, enquanto a eliminação de Gauss transforma na forma escalonada por colunas. Método de Gauss-Jordan 3 Cláudio Sumburane && José Seie Algoritmo de Resolução Consideremos um sistema de equações, onde o número de equações é igual ao número de variáveis. Sendo cumprida esta condição já podemos aplicar o método de eliminação de Gauss Jordan basta seguir os seguintes passos: 1) O elemento da 1.ª linha, 1.ª coluna (𝒂𝟎𝟎) é a base para o método de Gauss Jordan, deve-se garantir que ele seja diferente de zero; 2) Multiplicar a 1.ª linha pelo inverso do pivô. Para a 1.ª linha o pivô é (𝒂𝟎𝟎), a) Ficamos assim com: 𝑳𝒊𝒏𝒉𝒂𝟎 = 𝑳𝒊𝒏𝒉𝒂𝟎 ∗ 𝟏 𝟐 𝒂𝟎𝟎. 3) Anular todos os coeficientes da coluna do elemento pivô. Para a primeira linha o pivô é: 𝒂𝟎𝟎; a) Para se anular os elementos da coluna do pivô, para cada linha calcula-se um multiplicador de seguida se realiza uma operação de soma entre as linhas, a seguir as fórmulas detalhadas. b) Fórmula para multiplicador de cada linha: 𝒎𝒖𝒍𝒕𝒊𝒑𝒍𝒊𝒄𝒂𝒅𝒐𝒓𝒊 = −(𝒂𝒊𝟎/𝒂𝟎𝟎), c) Operação soma de linhas: 𝑳𝒊𝒏𝒉𝒂𝒊 = 𝑳𝒊𝒏𝒉𝒂𝒊 + 𝒎𝒖𝒍𝒕𝒊𝒑𝒍𝒊𝒄𝒂𝒅𝒐𝒓 ∗ 𝑳𝒊𝒏𝒉𝒂𝟎 4) Seguem-se os passos 2 e 3 para cada pivô da matriz, onde o pivô será o elemento (𝒂𝒊𝒋) para cada linha. Método de Gauss-Jordan 4 Cláudio Sumburane && José Seie Código package controller; import java.math.BigDecimal; import javax.swing.JTextArea; import model.Matriz; public class GaussJordan { Matriz matriz; JTextArea taPassos = new JTextArea(); public GaussJordan(Matriz matriz) { this.matriz = matriz; } /** * TextArea onde vao sendo se registado os passos * @return */ public String getTextArea() { return this.taPassos.getText(); } Método de Gauss-Jordan 5 Cláudio Sumburane && José Seie /** * Método que divide uma determinada linha da matriz pelo pivot desta linha * @param posPivot */ public void divide(int posPivot) { double[][] matrizRecebida = this.matriz.getMatriz(); double pivot = matrizRecebida[posPivot][posPivot]; System.out.println("Linha" + posPivot + " / " + pivot + "\n"); for (int i = 0; i < this.matriz.getOrdem() + 1; i++) { // Na linha do pivot vai dividindo todas as colunas pelo pivot matrizRecebida[posPivot][i] = matrizRecebida[posPivot][i] / pivot; matrizRecebida[posPivot][i] = arredondar(matrizRecebida[posPivot][i], 2); } imprimirMatrizRecursivo(); this.matriz.setMatriz(matrizRecebida); } /** * Método que Zerra as linhas a baixo de um pivot * @param posPivot * @return */ public double[][] zerrarColunas(int posPivot) { double multiplicador; double[][] matrizRecebida = this.matriz.getMatriz(); for (int i = 0; i < this.matriz.getOrdem(); i++) { if (i != posPivot) { multiplicador = -matrizRecebida[i][posPivot]; for (int j = 0; j < this.matriz.getOrdem() + 1; j++) { matrizRecebida[i][j] = matrizRecebida[i][j] + multiplicador * matrizRecebida[posPivot][j]; matrizRecebida[i][j] = arredondar(matrizRecebida[i][j], 2); Método de Gauss-Jordan 6 Cláudio Sumburane && José Seie } } } imprimirMatrizRecursivo(); return matrizRecebida; } /** * Aplicação do Método Gauss Jordan */ public void aplicarMetodo() { int pivot = 0; imprimirMatrizRecursivo(); for (int i = 0; i < this.matriz.getOrdem(); i++) { for (int j = 0; j <= this.matriz.getOrdem(); j++) { if (i == j) { divide(i); pivot = i; } } zerrarColunas(pivot); if(infinidadeSol(zerrarColunas(pivot))){ i = this.matriz.getOrdem()-1; } } } Método de Gauss-Jordan 7 Cláudio Sumburane && José Seie public boolean infinidadeSol(double matrizRecebida[][]) { for (int linha = 0; linha < this.matriz.getOrdem(); linha++) { if(this.linhaNula(matrizRecebida, linha, 0, 0)){ return true; } } return false; } /** * Metodo que verifica se uma determinada linha e nula ou nao * @param matrizRecebida matriz recebida * @param linha posicao da linha a ser analisada * @param contColunas incrementa as colunas * @param ocorenciaZerro conta o numero de ocorencia de zerros na linha * @return */ public boolean linhaNula(double matrizRecebida[][], int linha, int contColunas, int ocorenciaZerro) { if (contColunas == this.matriz.getOrdem()) return ocorenciaZerro >= this.matriz.getOrdem(); else{ if(matrizRecebida[linha][contColunas] == 0) ocorenciaZerro++; return linhaNula(matrizRecebida, linha, contColunas + 1, ocorenciaZerro); } } Método de Gauss-Jordan 8 Cláudio Sumburane && José Seie /** * Método que chama o método imprimir matriz * */ public void imprimirMatrizRecursivo() { double[][] matrizRecebida = this.matriz.getMatriz(); System.out.println(percorreMatriz(matrizRecebida, -1, 0)); } /** * Método que percorre uma determinada matriz * @param matrizRecebida * @param i contador de linhas* @param j contador de colunas * @return */ public String percorreMatriz(double matrizRecebida[][], int i, int j) { if (i == this.matriz.getOrdem() - 1) return ""; else return percorreColuna(matrizRecebida, i + 1, j) + "\n\n" + percorreMatriz(matrizRecebida, i + 1, j); } /** * Método que percore colunas de uma determinada linha da matriz * @param matrizRecebida * @param linha linha * @param contColunas contador de colunas * @return */ Método de Gauss-Jordan 9 Cláudio Sumburane && José Seie public String percorreColuna(double matrizRecebida[][], int linha, int contColunas) { if (contColunas == this.matriz.getOrdem()) return matrizRecebida[linha][contColunas] + ""; else return matrizRecebida[linha][contColunas] + " " + percorreColuna(matrizRecebida, linha, contColunas + 1); } /** * Metodo que arredonda um numero real * * @param nrEntrada * @param nrCasas * @return */ private double arredondar(double nrEntrada, int nrCasas) { BigDecimal bd = new BigDecimal(nrEntrada); bd = bd.setScale(nrCasas, BigDecimal.ROUND_HALF_UP); return bd.doubleValue(); } }
Compartilhar