Operac¸˜oes computacionais com matrizes para resoluc¸˜ao de
sistemas lineares
Felipe Schimith Batista1
1
Instituto de Matem´atica e Estat´ısitica - Universidade Estadual do Rio de Janeiro
felipeschimith@gmail.com
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.
2. Teoria de Matrizes
Este cap´ıtulo tem como objetivo apresentar as propriedades, teoremas e m´etodos da
´Algebra Linear que foram usados como base para implementar soluc¸˜oes computacionais.
2.1. Determinante de uma Matriz
Antes de nos aprofundarmos no m´etodo de Cramer, ´e necess´ario entender como obter o
de determinante de uma matriz. Por exemplo, um m´etodo para resolver o determinante de
uma 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 v´ertices 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. M´etodo de Cramer
Podemos identificar um sistema de equac¸˜oes lineares que pode ser aplicado o m´etodo de
Cramer quando:
• O n´umero de equac¸˜oes ´e igual ao n´umero de inc´ognitas.
• O determinante da matriz dos coeficientes ´e diferente de zero (det( A )=0).
Um Sistema de Cramer ´e, compat´ıvel e determinado, uma vez que posto (A) = n (no
de
inc´ognitas). Consideremos um Sistema de Cramer, ou seja, um sistema de n equac¸˜oes
lineares com n inc´ognitas, cuja express˜ao 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) =0. Cha-
maremos matriz associada a inc´ognita xi e a designaremos por Ai a matriz que se obtem
ao substituir na matriz do sistema a coluna i pela matriz coluna dos termos independentes,
ou seja:
[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 s˜ao compat´ıveis e determinados. O valor de cada
inc´ognita ´e obtido dividindo o determinante da matriz associada a esta inc´ognita pela
matriz do sistema (matriz dos coeficientes das inc´ognitas).
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 m´etodo de Gram-Schmidt, ´e necess´ario primeiramente
entender os conceitos de produto interno, Ortogonalidade e Ortonormalidade de vetores.
Primeiro, vamos definir o que um produto interno em um espac¸o vetorial. Produto
Interno ´e uma func¸˜ao que a cada par de vetores u e v de um espac¸o vetorial V - dito
euclidiano se contiver ao menos um destes produtos - (u, v) E V x V associa um n´umero
real denotado por uv em alguns casos, ou < u, v >. Chamamos de produto interno sobre
V 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 condic¸˜oes devem ser satisfeitas para todos os vetores u, v que
pertenc¸am a V e para todo α pertencente aos reais.
Desta forma, se uma condic¸˜ao n˜ao for satisfeita, as demais perdem seu valor e o
produto n˜ao ´e interno. Partindo destes conceitos, j´a se podem definir vetores ortogonais,
bases ortogonais e ortonormais.
Seja (V, <, >) espac¸o euclidiano, u, v E V s˜ao ortogonais se o produto interno
entre 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 s˜ao ortogonais em relac¸˜ao
`a esta m´etrica. Sendo todos os vetores integrantes de uma base de um espac¸o euclidiano
ortogonais entre si, dois a dois temos uma base ortogonal.
Al´em disso, se todos os vetores constantes nesta base forem unit´arios, isto ´e,
possu´ırem norma igual a 1, esta base ´e chamada ortonormal.Alguns exemplos de bases
ortonormais s˜ao as bases canˆonicas em relac¸˜ao aos produtos internos usuais. H´a muitas
outras bases ortonormais al´em das canˆonicas em relac¸˜ao aos v´arios produtos internos.
2.4. M´etodo de Gram Schmidt
Independente de qual produto interno seja usado, pode-se encontrar uma base ortonormal
de um espac¸o vetorial atrav´es do processo de ortogonalizac¸˜ao de Gram-Schimidt.
Dado um espac¸o vetorial euclidiano V e uma base qualquer B =
{v1, v2, v3, ..., vn} desse espac¸o, ´e poss´ıvel, a partir desta base, determinar uma base orto-
gonal de V.
Considerando que v1, v2, v3, ..., vn n˜ao s˜ao 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.
Assim, os vetores w1 e w2 s˜ao ortogonais.
Na sequˆencia, considere-se o vetor
w3 = v3 − a2w2 − a1w1
e encontre os valores de a2 e a1 de maneira que o vetor w3 seja ortogonal aos
vetores 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 s˜ao ortogonais.
Continue o processo at´e que tenham sido obtidos n-1 vetores w1, w2, ...wn−1 e
considere o vetor:
wn = vn − an−1wn−1 − ... − a2w2 − a1w1
sendo a1, a2, ... an−1 tais que o referido vetor wn seja ortogonal aos vetores
w1, w2, ... wn−1.
Os vetores a1, a2, ... an que aparecem na express˜ao de wn s˜ao:
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 base
ortogonal{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}.
3. Programas
Este cap´ıtulo apresenta os programas desenvolvidos utilizando como base os conheci-
mentos adquiridos na ´algebra linear. Algumas func¸˜oes secund´arias como obtenc¸˜ao das
matrizes a partir de arquivos textos e func¸˜ao de impress˜ao de matrizes foram omitidas dos
programas. Focarmos a apresentac¸˜ao nas partes essenciais de processamento de matrizes.
3.1. M´etodo de Cramer
Este programa consiste em substituir a i-´esima coluna de A com a coluna B e processar o
Det(Ai) dividindo pelo Det(A) obtendo o xi. Abaixo inclu´ımos o c´odigo utilizado para
processar computacionalmente essa operac¸˜ao.
public static double[] cramer(double[][] a,int numLin, int
numCol, double[] b) {
double det = determinante(a,numLin,numCol);
double detTemp = 0D;
int result =0;
if (quaseIgual(det, 0D))
throw new IllegalArgumentException("Determinante
da matriz igual a zero!");
double[] x = new double[numLin];
double tmp;
//Este for percorre todas as linhas de A
for (int i = 0; i < numLin; i++) {
// Este for troca a i-esima coluna com a coluna b
for (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 correto
for (int j = 0; j < numCol; j++) {
tmp = b[j];
b[j] = a[j][i];
a[j][i] = tmp;
}
}
return x;
}
Este programa consiste em obter o Det(A). Ele primeiramente obt´em a Triangular
Superior da Matriz A e depois multiplica os elementos da diagonal para obter o determi-
nante de A. Abaixo inclu´ımos o c´odigo utilizado para processar computacionalmente essa
operac¸˜ao.
public static double determinante(double[][] m,int numLin,
int numCol) {
if (numLin != numCol) throw new
IllegalArgumentException("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 matriz
for (int j = 0; j < n; j++) {
if (quaseIgual(a[j][j], 0)) { // pivota
int p = j + 1; int pmax = p;
// Buscando maximo pivo para minimizar os
erros de aproximacao
for (; 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 j
double det = 1;
System.out.printf("n Matriz Triangular Superior nn ");
imprimeMatriz(a, numLin,numCol);
// Produto da diagonal Principal
for (int i = 0; i < n; i++)
det *= a[i][i];
// Sinal do determinante
det *= (contaScambi % 2 == 0 ? 1 : -1);
return det;
}
3.2. M´etodo 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 seguinte
equac¸˜ao p/i de 1 a n: Vn - ((Vn . Wi) / (Wi . Wi)) x Wi). Abaixo inclu´ımos o c´odigo
utilizado para processar computacionalmente essa operac¸˜ao.
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 Wn
return v1;
}
4. Conclus˜ao
Podemos concluir que existem v´arias formas de processar e resolver sistemas lineares
utilizando conceitos de ´Algebra Linear de forma computacional, como o m´etodo de Cra-
mer. Mostramos tamb´em os conceitos de determinante de matrizes, ortogonalizac¸˜ao e
ortonormalizac¸˜ao de vetores que podem ser usados para simplificar operac¸˜oes com veto-
res e servir de insumo para outros estudos.
Com esse trabalho esperamos contribuir com o aprendizado da ´algebra linear
computacional no curso de Mestrado em ciˆencias computacionais, possibilitando que
esses programas sejam utilizadas e que inspirem a elaborac¸˜ao de teses, n˜ao apenas no
escopo da ´algebra linear, mas tamb´em em outras situac¸˜oes onde seja poss´ıvel discutir a
contribuic¸˜ao da matem´atica da soluc¸˜ao de problemas reais.
Referˆencias
ANTON, H. & BUSBY, R. (2006). Algebra Linear Contemporˆanea. BOOKMAN COM-
PANHIA EDITORA, 1th edition.
Silva, C. D. M. (2014). A ESSˆENCIA DOS DETERMINANTES NA SUA ORIGEM.
Master’s thesis, UNIVERSIDADE FEDERAL DO CEAR ´A, Juazeiro do Norte – CE.
5. Apˆendice
Nessa sess˜ao apresentamos os programas que serviram de apoio para o desenvolvimento
das operac¸˜oes com matrizes. S˜ao eles:
5.1. Produto Escalar de dois vetores
Essa func¸˜ao processa a soma do produto produto de cada elemento de dois vetores. Essa
func¸˜ao foi desenvolvida para padronizar o processo de Produto Escalar.
public static BigDecimal produtoEscalar(Vector a, Vector
b) {
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. Multiplicac¸˜ao de um Escalar por um vetor
Essa func¸˜ao processa o produto de cada elemento do vetor por um escalar. Essa func¸˜ao foi
desenvolvida para padronizar o processo de Multiplicac¸˜ao 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. Subtrac¸˜ao de um Escalar por um vetor
Essa func¸˜ao processa a subtrac¸˜ao de cada elemento do vetor por um escalar. Essa func¸˜ao
foi desenvolvida para padronizar o processo de Subtrac¸˜ao 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))
.subtract((BigDecimal)
b.elementAt(i));
c.add(value);
}
return c;
}
5.4. Transposta de uma Matriz
Essa func¸˜ao processa a Transposta de uma matriz, fazendo com que os elementos Aij
passema a ser Aji. Essa func¸˜ao foi desenvolvida para padronizar a obtenc¸˜ao da Transposta
de 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. Impress˜ao de Matriz
Essa func¸˜ao percorre todos os campos da matriz apresentando-os no log do console do
programa.
public static void imprimeMatriz(Double[][] matriz, int
numLin, 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]);
}
System.out.println();
}
}
5.6. Carrega a Matriz
Essa func¸˜ao carrega os campos de uma matriz que est˜ao armazenados em um arquivo
texto para uma array de Double. Essa func¸˜ao foi desenvolvida para facilitar o processo de
carga 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;
}

Algebra linear operações com matrizes

  • 1.
    Operac¸˜oes computacionais commatrizes para resoluc¸˜ao de sistemas lineares Felipe Schimith Batista1 1 Instituto de Matem´atica e Estat´ısitica - Universidade Estadual do Rio de Janeiro felipeschimith@gmail.com 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.
  • 2.
    2. Teoria deMatrizes Este cap´ıtulo tem como objetivo apresentar as propriedades, teoremas e m´etodos da ´Algebra Linear que foram usados como base para implementar soluc¸˜oes computacionais. 2.1. Determinante de uma Matriz Antes de nos aprofundarmos no m´etodo de Cramer, ´e necess´ario entender como obter o de determinante de uma matriz. Por exemplo, um m´etodo para resolver o determinante de uma 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 v´ertices 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. M´etodo de Cramer Podemos identificar um sistema de equac¸˜oes lineares que pode ser aplicado o m´etodo de Cramer quando: • O n´umero de equac¸˜oes ´e igual ao n´umero de inc´ognitas. • O determinante da matriz dos coeficientes ´e diferente de zero (det( A )=0). Um Sistema de Cramer ´e, compat´ıvel e determinado, uma vez que posto (A) = n (no de inc´ognitas). Consideremos um Sistema de Cramer, ou seja, um sistema de n equac¸˜oes lineares com n inc´ognitas, cuja express˜ao 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) =0. Cha- maremos matriz associada a inc´ognita xi e a designaremos por Ai a matriz que se obtem ao substituir na matriz do sistema a coluna i pela matriz coluna dos termos independentes, ou seja:
  • 3.
    [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 s˜ao compat´ıveis e determinados. O valor de cada inc´ognita ´e obtido dividindo o determinante da matriz associada a esta inc´ognita pela matriz do sistema (matriz dos coeficientes das inc´ognitas). 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 m´etodo de Gram-Schmidt, ´e necess´ario primeiramente entender os conceitos de produto interno, Ortogonalidade e Ortonormalidade de vetores. Primeiro, vamos definir o que um produto interno em um espac¸o vetorial. Produto Interno ´e uma func¸˜ao que a cada par de vetores u e v de um espac¸o vetorial V - dito
  • 4.
    euclidiano se contiverao menos um destes produtos - (u, v) E V x V associa um n´umero real denotado por uv em alguns casos, ou < u, v >. Chamamos de produto interno sobre V 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 condic¸˜oes devem ser satisfeitas para todos os vetores u, v que pertenc¸am a V e para todo α pertencente aos reais. Desta forma, se uma condic¸˜ao n˜ao for satisfeita, as demais perdem seu valor e o produto n˜ao ´e interno. Partindo destes conceitos, j´a se podem definir vetores ortogonais, bases ortogonais e ortonormais. Seja (V, <, >) espac¸o euclidiano, u, v E V s˜ao ortogonais se o produto interno entre 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 s˜ao ortogonais em relac¸˜ao `a esta m´etrica. Sendo todos os vetores integrantes de uma base de um espac¸o euclidiano ortogonais entre si, dois a dois temos uma base ortogonal. Al´em disso, se todos os vetores constantes nesta base forem unit´arios, isto ´e, possu´ırem norma igual a 1, esta base ´e chamada ortonormal.Alguns exemplos de bases ortonormais s˜ao as bases canˆonicas em relac¸˜ao aos produtos internos usuais. H´a muitas outras bases ortonormais al´em das canˆonicas em relac¸˜ao aos v´arios produtos internos. 2.4. M´etodo de Gram Schmidt Independente de qual produto interno seja usado, pode-se encontrar uma base ortonormal de um espac¸o vetorial atrav´es do processo de ortogonalizac¸˜ao de Gram-Schimidt. Dado um espac¸o vetorial euclidiano V e uma base qualquer B = {v1, v2, v3, ..., vn} desse espac¸o, ´e poss´ıvel, a partir desta base, determinar uma base orto- gonal de V. Considerando que v1, v2, v3, ..., vn n˜ao s˜ao 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.
  • 5.
    Assim, os vetoresw1 e w2 s˜ao ortogonais. Na sequˆencia, considere-se o vetor w3 = v3 − a2w2 − a1w1 e encontre os valores de a2 e a1 de maneira que o vetor w3 seja ortogonal aos vetores 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 s˜ao ortogonais. Continue o processo at´e que tenham sido obtidos n-1 vetores w1, w2, ...wn−1 e considere o vetor: wn = vn − an−1wn−1 − ... − a2w2 − a1w1 sendo a1, a2, ... an−1 tais que o referido vetor wn seja ortogonal aos vetores w1, w2, ... wn−1. Os vetores a1, a2, ... an que aparecem na express˜ao de wn s˜ao: 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 base ortogonal{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}.
  • 6.
    3. Programas Este cap´ıtuloapresenta os programas desenvolvidos utilizando como base os conheci- mentos adquiridos na ´algebra linear. Algumas func¸˜oes secund´arias como obtenc¸˜ao das matrizes a partir de arquivos textos e func¸˜ao de impress˜ao de matrizes foram omitidas dos programas. Focarmos a apresentac¸˜ao nas partes essenciais de processamento de matrizes. 3.1. M´etodo de Cramer Este programa consiste em substituir a i-´esima coluna de A com a coluna B e processar o Det(Ai) dividindo pelo Det(A) obtendo o xi. Abaixo inclu´ımos o c´odigo utilizado para processar computacionalmente essa operac¸˜ao. public static double[] cramer(double[][] a,int numLin, int numCol, double[] b) { double det = determinante(a,numLin,numCol); double detTemp = 0D; int result =0; if (quaseIgual(det, 0D)) throw new IllegalArgumentException("Determinante da matriz igual a zero!"); double[] x = new double[numLin]; double tmp; //Este for percorre todas as linhas de A for (int i = 0; i < numLin; i++) { // Este for troca a i-esima coluna com a coluna b for (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 correto for (int j = 0; j < numCol; j++) { tmp = b[j]; b[j] = a[j][i]; a[j][i] = tmp; } } return x; }
  • 7.
    Este programa consisteem obter o Det(A). Ele primeiramente obt´em a Triangular Superior da Matriz A e depois multiplica os elementos da diagonal para obter o determi- nante de A. Abaixo inclu´ımos o c´odigo utilizado para processar computacionalmente essa operac¸˜ao. public static double determinante(double[][] m,int numLin, int numCol) { if (numLin != numCol) throw new IllegalArgumentException("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 matriz for (int j = 0; j < n; j++) { if (quaseIgual(a[j][j], 0)) { // pivota int p = j + 1; int pmax = p; // Buscando maximo pivo para minimizar os erros de aproximacao for (; 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 j double det = 1; System.out.printf("n Matriz Triangular Superior nn "); imprimeMatriz(a, numLin,numCol); // Produto da diagonal Principal for (int i = 0; i < n; i++) det *= a[i][i]; // Sinal do determinante
  • 8.
    det *= (contaScambi% 2 == 0 ? 1 : -1); return det; } 3.2. M´etodo 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 seguinte equac¸˜ao p/i de 1 a n: Vn - ((Vn . Wi) / (Wi . Wi)) x Wi). Abaixo inclu´ımos o c´odigo utilizado para processar computacionalmente essa operac¸˜ao. 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 Wn return v1; }
  • 9.
    4. Conclus˜ao Podemos concluirque existem v´arias formas de processar e resolver sistemas lineares utilizando conceitos de ´Algebra Linear de forma computacional, como o m´etodo de Cra- mer. Mostramos tamb´em os conceitos de determinante de matrizes, ortogonalizac¸˜ao e ortonormalizac¸˜ao de vetores que podem ser usados para simplificar operac¸˜oes com veto- res e servir de insumo para outros estudos. Com esse trabalho esperamos contribuir com o aprendizado da ´algebra linear computacional no curso de Mestrado em ciˆencias computacionais, possibilitando que esses programas sejam utilizadas e que inspirem a elaborac¸˜ao de teses, n˜ao apenas no escopo da ´algebra linear, mas tamb´em em outras situac¸˜oes onde seja poss´ıvel discutir a contribuic¸˜ao da matem´atica da soluc¸˜ao de problemas reais. Referˆencias ANTON, H. & BUSBY, R. (2006). Algebra Linear Contemporˆanea. BOOKMAN COM- PANHIA EDITORA, 1th edition. Silva, C. D. M. (2014). A ESSˆENCIA DOS DETERMINANTES NA SUA ORIGEM. Master’s thesis, UNIVERSIDADE FEDERAL DO CEAR ´A, Juazeiro do Norte – CE.
  • 10.
    5. Apˆendice Nessa sess˜aoapresentamos os programas que serviram de apoio para o desenvolvimento das operac¸˜oes com matrizes. S˜ao eles: 5.1. Produto Escalar de dois vetores Essa func¸˜ao processa a soma do produto produto de cada elemento de dois vetores. Essa func¸˜ao foi desenvolvida para padronizar o processo de Produto Escalar. public static BigDecimal produtoEscalar(Vector a, Vector b) { 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. Multiplicac¸˜ao de um Escalar por um vetor Essa func¸˜ao processa o produto de cada elemento do vetor por um escalar. Essa func¸˜ao foi desenvolvida para padronizar o processo de Multiplicac¸˜ao 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. Subtrac¸˜ao de um Escalar por um vetor Essa func¸˜ao processa a subtrac¸˜ao de cada elemento do vetor por um escalar. Essa func¸˜ao foi desenvolvida para padronizar o processo de Subtrac¸˜ao 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))
  • 11.
    .subtract((BigDecimal) b.elementAt(i)); c.add(value); } return c; } 5.4. Transpostade uma Matriz Essa func¸˜ao processa a Transposta de uma matriz, fazendo com que os elementos Aij passema a ser Aji. Essa func¸˜ao foi desenvolvida para padronizar a obtenc¸˜ao da Transposta de 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. Impress˜ao de Matriz Essa func¸˜ao percorre todos os campos da matriz apresentando-os no log do console do programa. public static void imprimeMatriz(Double[][] matriz, int numLin, 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]);
  • 12.
    } System.out.println(); } } 5.6. Carrega aMatriz Essa func¸˜ao carrega os campos de uma matriz que est˜ao armazenados em um arquivo texto para uma array de Double. Essa func¸˜ao foi desenvolvida para facilitar o processo de carga 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; }