Algebra linear operações com matrizes

12
Operac ¸˜ oes computacionais com matrizes para resoluc ¸˜ ao de sistemas lineares Felipe Schimith Batista 1 1 Instituto de Matem´ atica e Estat´ ısitica - Universidade Estadual do Rio de Janeiro [email protected] Resumo. O trabalho visa contextualizar os teoremas e m´ etodos da ´ Algebra Li- near aplicados em soluc ¸˜ oes computacionais. Este trabalho apresenta o refe- rencial te´ orico utilizado como base para resolver computacionalmente siste- mas lineares. Apresentaremos o ”m´ etodo de Cramer”e o ”Processo de Gram- Schimidt”. A implementac ¸˜ ao foi feita na linguagem de programac ¸˜ ao Java e tamb´ em ser´ a documentada e comentada. 1. Introduc ¸˜ ao Na Matem´ atica um sistema de equac ¸˜ oes lineares ´ e um conjunto finito de equac ¸˜ oes lineares aplicadas num mesmo conjunto, igualmente finito, de vari´ aveis.[ANTON 2006] A noc ¸˜ ao de determinante desempenha um papel importante na Matem´ atica, apa- recendo em teoremas fundamentais como a Regra de Cramer. A id´ eia de determinante surgiu simultaneamente na Alemanha e no Jap˜ ao. Leib- nitz (1649- 1716), em uma carta escrita para L’Hospital (1661-1704), sugeriu usar combinac ¸˜ oes dos coeficientes para resolver sistemas de equac ¸˜ oes lineares e, al´ em disso, encontrou uma maneira de indexar tais coeficientes com n´ umeros. No mesmo ano, no Jap˜ ao, o matem´ atico Seki Kowa (1642-1708) escreveu um livro apresentando sistemas lineares sob a forma matricial, como j´ a tinha aparecido na matem´ atica chinesa. Seki foi o primeiro matem´ atico a calcular determinantes. [Silva 2014] O renascimento do m´ etodo ´ e devido a Cramer em seu livro ”Analyse des lignes courbes alg´ ebriques”publicado em Genebra, em 1750. Nele, Cramer apresentou uma forma de resolver um sistema linear de n equac ¸˜ oes e n inc ´ ognitas, assim conhecido como Regra de Cramer. [Silva 2014] Tamb´ em usamos nos mais variados ramos da matem´ atica as operac ¸˜ oes de soma e multiplicac ¸˜ ao por escalar, e como esta ciˆ encia estuda os padr ˜ oes, podemos observar v´ arios dentro destas operac ¸˜ oes e criar uma teoria geral sobre isso, encontrando v´ arias aplicac ¸˜ oes em diversas ´ areas da matem´ atica, como por exemplo no estudo de Espac ¸os Vetoriais. Muitos problemas envolvendo espac ¸os vetoriais necessitam da id´ eia de bases, e estes problemas tornam-se bastantes simplificados quando utilizamos bases cujos vetores s˜ ao ortogonais entre si, para isso podemos transformar bases quaisquer em bases ortogonais atrav´ es de um processo conhecido como Processo de Gram-Schmidt. Neste trabalho apesentaremos um referencial te´ orico e uma forma computacional de implementar o m´ etodo de Cramer e o Processo de Gram-Schmidt.

Transcript of Algebra linear operações com matrizes

Page 1: Algebra linear   operações com matrizes

Operacoes computacionais com matrizes para resolucao desistemas lineares

Felipe Schimith Batista1

1Instituto de Matematica e Estatısitica - Universidade Estadual do Rio de Janeiro

[email protected]

Resumo. O trabalho visa contextualizar os teoremas e metodos da Algebra Li-near aplicados em solucoes computacionais. Este trabalho apresenta o refe-rencial teorico utilizado como base para resolver computacionalmente siste-mas lineares. Apresentaremos o ”metodo de Cramer”e o ”Processo de Gram-Schimidt”. A implementacao foi feita na linguagem de programacao Java etambem sera documentada e comentada.

1. Introducao

Na Matematica um sistema de equacoes lineares e um conjunto finito de equacoes linearesaplicadas num mesmo conjunto, igualmente finito, de variaveis.[ANTON 2006]

A nocao de determinante desempenha um papel importante na Matematica, apa-recendo em teoremas fundamentais como a Regra de Cramer.

A ideia de determinante surgiu simultaneamente na Alemanha e no Japao. Leib-nitz (1649- 1716), em uma carta escrita para L’Hospital (1661-1704), sugeriu usarcombinacoes dos coeficientes para resolver sistemas de equacoes lineares e, alem disso,encontrou uma maneira de indexar tais coeficientes com numeros. No mesmo ano, noJapao, o matematico Seki Kowa (1642-1708) escreveu um livro apresentando sistemaslineares sob a forma matricial, como ja tinha aparecido na matematica chinesa. Seki foi oprimeiro matematico a calcular determinantes. [Silva 2014]

O renascimento do metodo e devido a Cramer em seu livro ”Analyse des lignescourbes algebriques”publicado em Genebra, em 1750. Nele, Cramer apresentou umaforma de resolver um sistema linear de n equacoes e n incognitas, assim conhecido comoRegra de Cramer. [Silva 2014]

Tambem usamos nos mais variados ramos da matematica as operacoes de soma emultiplicacao por escalar, e como esta ciencia estuda os padroes, podemos observar variosdentro destas operacoes e criar uma teoria geral sobre isso, encontrando varias aplicacoesem diversas areas da matematica, como por exemplo no estudo de Espacos Vetoriais.Muitos problemas envolvendo espacos vetoriais necessitam da ideia de bases, e estesproblemas tornam-se bastantes simplificados quando utilizamos bases cujos vetores saoortogonais entre si, para isso podemos transformar bases quaisquer em bases ortogonaisatraves de um processo conhecido como Processo de Gram-Schmidt.

Neste trabalho apesentaremos um referencial teorico e uma forma computacionalde implementar o metodo de Cramer e o Processo de Gram-Schmidt.

Page 2: Algebra linear   operações com matrizes

2. Teoria de Matrizes

Este capıtulo tem como objetivo apresentar as propriedades, teoremas e metodos daAlgebra Linear que foram usados como base para implementar solucoes computacionais.

2.1. Determinante de uma Matriz

Antes de nos aprofundarmos no metodo de Cramer, e necessario entender como obter ode determinante de uma matriz. Por exemplo, um metodo para resolver o determinante deuma matriz e utilizando a regra de Sarrus que consiste em:

Dado a matriz A.

[A] =

α11 α12 α13

α21 α22 α23

α31 α32 α33

Obter o produto dos elementos da diagonal principal e das diagonais paralelas

(acima e abaixo), com sinal ”+ ”.

(α11 ∗ α22 ∗ α33) + (α12 ∗ α23 ∗ α31) + (α13 ∗ α21 ∗ α32)

Somado aos produtos dos elementos da diagonal oposta e os das diagonais para-lelas (acima e abaixo), com seus correspondente vertices opostos, com sinal -”.

−(α13 ∗ α22 ∗ α31)− (α12 ∗ α21 ∗ α33)− (α11 ∗ α23 ∗ α32)

Sendo assim, para uma matriz 2x2 o Det(A):

Det[A] =

[α11 α12

α21 α22

]= (α11 ∗ α22) + (α12 ∗ α21)− (α12 ∗ α21)− (α11 ∗ α22)

2.2. Metodo de Cramer

Podemos identificar um sistema de equacoes lineares que pode ser aplicado o metodo deCramer quando:

• O numero de equacoes e igual ao numero de incognitas.• O determinante da matriz dos coeficientes e diferente de zero (det( A )6=0).

Um Sistema de Cramer e, compatıvel e determinado, uma vez que posto (A) = n (no deincognitas). Consideremos um Sistema de Cramer, ou seja, um sistema de n equacoeslineares com n incognitas, cuja expressao geral e:

[A|B] =

∣∣∣∣∣∣∣∣∣∣α11 ∗ x1 α12 ∗ x2 ... α1n ∗ xn β1α21 ∗ x1 α22 ∗ x2 ... α2n ∗ xn β2α31 ∗ x1 α32 ∗ x2 ... α3n ∗ xn β3... ... ... ...

αm1 ∗ x1 αm2 ∗ x2 ... αmn ∗ xn βm

∣∣∣∣∣∣∣∣∣∣Sejam A a matriz do sistema (matriz dos coeficientes), que tem det (A) 6=0. Cha-

maremos matriz associada a incognita xi e a designaremos por Ai a matriz que se obtemao substituir na matriz do sistema a coluna i pela matriz coluna dos termos independentes,ou seja:

Page 3: Algebra linear   operações com matrizes

[A] =

∣∣∣∣∣∣∣∣∣∣α11 α12 ... α1i ... α1n

α21 α22 ... α2i ... α2n

α31 α32 ... α3i ... α3n

... ... ... ...αm1 αm2 ... α4i ... αmn

∣∣∣∣∣∣∣∣∣∣[Ai] =

∣∣∣∣∣∣∣∣∣∣α11 α12 ... β1 ... α1n

α21 α22 ... β2 ... α2n

α31 α32 ... β3 ... α3n

... ... ... ...αm1 αm2 ... βm ... αmn

∣∣∣∣∣∣∣∣∣∣Todos os sistemas de Cramer sao compatıveis e determinados. O valor de cada

incognita e obtido dividindo o determinante da matriz associada a esta incognita pelamatriz do sistema (matriz dos coeficientes das incognitas).

xi =Det(Ai)Det(A)

p/i = 1, 2, 3...n

[A1] =

β1 α12 α1i ... α1n

β2 α22 α2i ... α2n

β3 α32 α3i ... α3n

... ... ... ...βm αm2 α4i ... αmn

= Det(A1)Det(A)

= x1

[A2] =

α11 β2 α1i ... α1n

α21 β2 α2i ... α2n

α31 β3 α3i ... α3n

... ... ... ...αm1 βm α4i ... αmn

= Det(A2)Det(A)

= x2

[A3] =

α11 α12 β1 ... α1n

α21 α22 β2 ... α2n

α31 α32 β3 ... α3n

... ... ... ...αm1 αm2 βm ... αmn

= Det(A3)Det(A)

= x3

[An] =

α11 α12 α1i ... β1α21 α22 α2i ... β2α31 α32 α3i ... β3... ... ... ...αm1 αm2 α4i ... βm

= Det(An)Det(A)

= xn

2.3. Vetories Ortogonais e bases Ortonormais

Antes de nos aprofundarmos no metodo de Gram-Schmidt, e necessario primeiramenteentender os conceitos de produto interno, Ortogonalidade e Ortonormalidade de vetores.

Primeiro, vamos definir o que um produto interno em um espaco vetorial. ProdutoInterno e uma funcao que a cada par de vetores u e v de um espaco vetorial V - dito

Page 4: Algebra linear   operações com matrizes

euclidiano se contiver ao menos um destes produtos - (u, v) E V x V associa um numeroreal denotado por uv em alguns casos, ou < u, v >. Chamamos de produto interno sobreV se satisfaz:

• < u, v >=< v, u >;• < u, v + w >=< u, v > + < u,w >;• < u, v >=< u, v >;• < u, u > e maior ou igual a zero e, se < u, u >= 0, u e o vetor nulo de V.

Todas estas condicoes devem ser satisfeitas para todos os vetores u, v quepertencam a V e para todo α pertencente aos reais.

Desta forma, se uma condicao nao for satisfeita, as demais perdem seu valor e oproduto nao e interno. Partindo destes conceitos, ja se podem definir vetores ortogonais,bases ortogonais e ortonormais.

Seja (V,<,>) espaco euclidiano, u, v E V sao ortogonais se o produto internoentre eles for igual a zero.

Adotando o produto escalar para u = (1, 0, 2) e v = (−1, 1, 1), sendo u.v =(1 ∗−1) + (0 ∗ 1) + (2 ∗ 1) = 0 , vemos que estes dois vetores sao ortogonais em relacaoa esta metrica. Sendo todos os vetores integrantes de uma base de um espaco euclidianoortogonais entre si, dois a dois temos uma base ortogonal.

Alem disso, se todos os vetores constantes nesta base forem unitarios, isto e,possuırem norma igual a 1, esta base e chamada ortonormal.Alguns exemplos de basesortonormais sao as bases canonicas em relacao aos produtos internos usuais. Ha muitasoutras bases ortonormais alem das canonicas em relacao aos varios produtos internos.

2.4. Metodo de Gram SchmidtIndependente de qual produto interno seja usado, pode-se encontrar uma base ortonormalde um espaco vetorial atraves do processo de ortogonalizacao de Gram-Schimidt.

Dado um espaco vetorial euclidiano V e uma base qualquer B ={v1, v2, v3, ..., vn} desse espaco, e possıvel, a partir desta base, determinar uma base orto-gonal de V.Considerando que v1, v2, v3, ..., vn nao sao ortogonais, considere-se

w1 = v1

e encontre o valor o valor de a1 de modo que o vetor

w2 = v2 − a1w1

seja ortogonal a w1.

Teremos:

(v2 − a1w1).w1 = 0

v2.w1 − a1(w1.w1) = 0

a1 =v2.w1

w1.w1

isto e,

w2 = v2 − ( v2.w1

w1.w1)w1.

Page 5: Algebra linear   operações com matrizes

Assim, os vetores w1 e w2 sao ortogonais.

Na sequencia, considere-se o vetor

w3 = v3 − a2w2 − a1w1

e encontre os valores de a2 e a1 de maneira que o vetor w3 seja ortogonal aosvetores w1 e w2:{

(v3 − a2w2 − a1w1).w1 = 0(v3 − a2w2 − a1w1).w2 = 0{(v3.w1 − a2(w2.w1)− a1(w1.w1) = 0(v3.w2 − a2(w2.w2)− a1(w1.w2) = 0

Tendo em vista que w1.w2 = 0, vem:{(v3.w1 − a1(w1.w1) = 0(v3.w2 − a2(w2.w2) = 0

e,

a1 =v3.w1

w1.w1;

a2 =v3.w2

w2.w2

isto e,

w3 = v3 − ( v3.w2

w2.w2)w2 − ( v3.w1

w1.w1)w1.

Assim, os vetores w1, w2 e w3 sao ortogonais.

Continue o processo ate que tenham sido obtidos n-1 vetores w1, w2, ...wn−1 econsidere o vetor:

wn = vn − an−1wn−1 − ... − a2w2 − a1w1

sendo a1, a2, ... an−1 tais que o referido vetor wn seja ortogonal aos vetoresw1, w2, ... wn−1.

Os vetores a1, a2, ... an que aparecem na expressao de wn sao:

a1 =vn.w1

w1.w1, a2 =

vn.w2

w2.w2, ..., an−1 =

vn.wn−1

wn−1.wn−1

Assim, a partir da base B = {v1, v2, ... , vn}, obtivemos a baseortogonal{w1, w2, ... , wn}.

Finalmente, para se obter a base ortonormal, basta normalizar cada vetor wi, fa-zendo

ui =wi

|wi| , para obter a base

C = {u1, u2 ... , un} que e a base ortonormal obtida a partir da base qualquer dada

B = {v1, v2, ... , vn}.

Page 6: Algebra linear   operações com matrizes

3. ProgramasEste capıtulo apresenta os programas desenvolvidos utilizando como base os conheci-mentos adquiridos na algebra linear. Algumas funcoes secundarias como obtencao dasmatrizes a partir de arquivos textos e funcao de impressao de matrizes foram omitidas dosprogramas. Focarmos a apresentacao nas partes essenciais de processamento de matrizes.

3.1. Metodo de Cramer

Este programa consiste em substituir a i-esima coluna de A com a coluna B e processar oDet(Ai) dividindo pelo Det(A) obtendo o xi. Abaixo incluımos o codigo utilizado paraprocessar computacionalmente essa operacao.

public static double[] cramer(double[][] a,int numLin, intnumCol, double[] b) {

double det = determinante(a,numLin,numCol);double detTemp = 0D;int result =0;if (quaseIgual(det, 0D))

throw new IllegalArgumentException("Determinanteda matriz igual a zero!");

double[] x = new double[numLin];double tmp;//Este for percorre todas as linhas de Afor (int i = 0; i < numLin; i++) {

// Este for troca a i-esima coluna com a coluna bfor (int j = 0; j < numCol; j++) {

tmp = b[j];b[j] = a[j][i];a[j][i] = tmp;

}

//Obtem o Det(Ai)detTemp =determinante(a,numLin,numCol);//Divide o Det(Ai) por Det(A)x[i] = detTemp / det;result =(int) x[i];

// Este for volta as colunas para o lugar corretofor (int j = 0; j < numCol; j++) {

tmp = b[j];b[j] = a[j][i];a[j][i] = tmp;

}}return x;}

Page 7: Algebra linear   operações com matrizes

Este programa consiste em obter oDet(A). Ele primeiramente obtem a TriangularSuperior da Matriz A e depois multiplica os elementos da diagonal para obter o determi-nante de A. Abaixo incluımos o codigo utilizado para processar computacionalmente essaoperacao.

public static double determinante(double[][] m,int numLin,int numCol) {

if (numLin != numCol) throw newIllegalArgumentException("Matriz nao quadrada!");

int n = numLin;double[][] a = new double[n][n];for (int i = 0; i < n; i++)

for (int j = 0; j < n; j++)a[i][j] = m[i][j];

int contaScambi = 0;// Triangularizando a matrizfor (int j = 0; j < n; j++) {

if (quaseIgual(a[j][j], 0)) { // pivotaint p = j + 1; int pmax = p;// Buscando maximo pivo para minimizar os

erros de aproximacaofor (; p < n; p++)

if (Math.abs(a[p][j]) >Math.abs(a[pmax][j])) pmax = p;

if (pmax == n || quaseIgual(a[pmax][j],0D)) return 0; // Sistema singular ->Determinante = 0

double[] tmp = a[j];a[j] = a[pmax];a[pmax] = tmp;contaScambi++;

}for (int i = j + 1; i < n; i++) {

if (!quaseIgual(a[i][j], 0D)) {double c = a[i][j] / a[j][j];for (int k = j; k < n; k++)

a[i][k] -= c * a[j][k];}

} // for i} // for jdouble det = 1;System.out.printf("\n Matriz Triangular Superior \n\n ");imprimeMatriz(a, numLin,numCol);// Produto da diagonal Principalfor (int i = 0; i < n; i++)

det *= a[i][i];// Sinal do determinante

Page 8: Algebra linear   operações com matrizes

det *= (contaScambi % 2 == 0 ? 1 : -1);return det;}

3.2. Metodo de Gram Schmidt

Este programa consiste em obter uma base ortogonal a partir de um conjunto de vetores.O processo consiste em obter o Wn a partir de Vn ortogonalizado utilizando a seguinteequacao p/i de 1 a n: Vn - ((Vn . Wi) / (Wi . Wi)) x Wi). Abaixo incluımos o codigoutilizado para processar computacionalmente essa operacao.

public static Vector<BigDecimal>[]GramSchmidt(Vector<BigDecimal>[] v) {

int n = v.length;int m = v[0].size();BigDecimal[][] a =new BigDecimal[m][n];Vector<BigDecimal>[] v1 = v.clone();

for (int i = 0; i < a.length; i++) {for (int j = 0; j < a[0].length; j++) {

a[i][j] = new BigDecimal("0");}

}for (int j = 1; j <= n - 1; j++) {

v1[j] = v[j];for (int i = 0; i <= (j - 1); i++) {

if (v1[i] == null || v[j] == null) {System.out.println("Erro: fora do

limite de Gram-Schmidt");System.exit(1);

}//Esta funcao processa// Aij = (Vn . Wi)/(Wi . Wi)a[i][j] = (produtoEscalar(v1[i],

v[j])).divide(produtoEscalar(v1[i]),MathContext.DECIMAL128);

//Esta funcao processa//Wn = Vn - (Aij x Wi)v1[j] = subtracao(v1[j],

(multiplicacaoEscalar(a[i][j], v1[i])));}

}//O retorno e Wnreturn v1;}

Page 9: Algebra linear   operações com matrizes

4. ConclusaoPodemos concluir que existem varias formas de processar e resolver sistemas linearesutilizando conceitos de Algebra Linear de forma computacional, como o metodo de Cra-mer. Mostramos tambem os conceitos de determinante de matrizes, ortogonalizacao eortonormalizacao de vetores que podem ser usados para simplificar operacoes com veto-res e servir de insumo para outros estudos.

Com esse trabalho esperamos contribuir com o aprendizado da algebra linearcomputacional no curso de Mestrado em ciencias computacionais, possibilitando queesses programas sejam utilizadas e que inspirem a elaboracao de teses, nao apenas noescopo da algebra linear, mas tambem em outras situacoes onde seja possıvel discutir acontribuicao da matematica da solucao de problemas reais.

ReferenciasANTON, H. & BUSBY, R. (2006). Algebra Linear Contemporanea. BOOKMAN COM-

PANHIA EDITORA, 1th edition.

Silva, C. D. M. (2014). A ESSENCIA DOS DETERMINANTES NA SUA ORIGEM.Master’s thesis, UNIVERSIDADE FEDERAL DO CEARA, Juazeiro do Norte – CE.

Page 10: Algebra linear   operações com matrizes

5. Apendice

Nessa sessao apresentamos os programas que serviram de apoio para o desenvolvimentodas operacoes com matrizes. Sao eles:

5.1. Produto Escalar de dois vetores

Essa funcao processa a soma do produto produto de cada elemento de dois vetores. Essafuncao foi desenvolvida para padronizar o processo de Produto Escalar.

public static BigDecimal produtoEscalar(Vector a, Vectorb) {

BigDecimal soma = new BigDecimal("0");for (int i = 0; i < a.size(); i++)

soma = soma.add((((BigDecimal) a.elementAt(i)).multiply((BigDecimal)

b.elementAt(i))));

return soma;}

5.2. Multiplicacao de um Escalar por um vetor

Essa funcao processa o produto de cada elemento do vetor por um escalar. Essa funcao foidesenvolvida para padronizar o processo de Multiplicacao de um Vetor por um Escalar.

public static Vector<BigDecimal>multiplicacaoEscalar(BigDecimal escalar,

Vector<BigDecimal> a) {Vector<BigDecimal> c = (Vector<BigDecimal>)

a.clone();for (int i = 0; i < a.size(); i++)

c.set(i, escalar.multiply(((BigDecimal)a.get(i))));

return c;}

5.3. Subtracao de um Escalar por um vetor

Essa funcao processa a subtracao de cada elemento do vetor por um escalar. Essa funcaofoi desenvolvida para padronizar o processo de Subtracao de um Vetor por um Escalar.

public static Vector<BigDecimal>subtracao(Vector<BigDecimal> a,

Vector<BigDecimal> b) {int m = a.size();Vector<BigDecimal> c = new Vector(m);for (int i = 0; i < m; i++) {

BigDecimal value = ((BigDecimal) a.elementAt(i))

Page 11: Algebra linear   operações com matrizes

.subtract((BigDecimal)b.elementAt(i));

c.add(value);}return c;}

5.4. Transposta de uma Matriz

Essa funcao processa a Transposta de uma matriz, fazendo com que os elementos Aijpassema a serAji. Essa funcao foi desenvolvida para padronizar a obtencao da Transpostade uma matriz.

public static Vector[] transposta(Vector[] b) {int n = b.length;int m = b[0].size();

Vector[] r = new Vector[m];

for (int i = 0; i < r.length; i++) {r[i] = new Vector(n);

}

// a b c// d e f

// a d// b e// c f

for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {

r[i].add(b[j].get(i));}

}return r;}

5.5. Impressao de Matriz

Essa funcao percorre todos os campos da matriz apresentando-os no log do console doprograma.

public static void imprimeMatriz(Double[][] matriz, intnumLin, int numCol) {

for (int linha = 0; linha < numLin; linha++) {for (int coluna = 0; coluna < numCol; coluna++) {

System.out.printf("\t %.2f \t",matriz[linha][coluna]);

Page 12: Algebra linear   operações com matrizes

}System.out.println();

}}

5.6. Carrega a Matriz

Essa funcao carrega os campos de uma matriz que estao armazenados em um arquivotexto para uma array de Double. Essa funcao foi desenvolvida para facilitar o processo decarga da matriz.

public static String carregaMatriz(Double[][] matriz,String nomeArquivo) {

Scanner arquivo;String linCol = "";try {

arquivo = new Scanner(new File(nomeArquivo));int j = 0;int i = 0;while (arquivo.hasNextLine()) {

String line = arquivo.nextLine();Scanner scanner = new Scanner(line);scanner.useDelimiter(",");j = 0;while (scanner.hasNextDouble()) {

matriz[i][j] =scanner.nextDouble();

j++;}scanner.close();i++;

}arquivo.close();linCol = Integer.toString(i) + "," +

Integer.toString(j);} catch (FileNotFoundException e) {

e.printStackTrace();}return linCol;}