Escolar Documentos
Profissional Documentos
Cultura Documentos
Cálculo Numérico
Belém-Pa
Conteúdo Programático
A resolução de sistemas lineares pode ser obtida através de métodos numéricos que são
divididos em:
Métodos Diretos; e
Métodos Iterativos.
O Método de Decomposição LU é um dos métodos diretos, que são métodos que permitem
obter a solução do sistema linear realizando um número finito de operações.
Neste caso, a solução é exata, a menos de erros de arredondamento, e é possível determinar
o esforço computacional gasto para obter a solução.
Método da Decomposição LU
Neste método, usa-se o fato de que, nas condições necessárias, uma matriz quadrada
pode ser decomposta como um produto de duas matrizes triangulares.
Considerando um sistema linear 𝐴 ∙ 𝑋 = 𝐵, onde 𝐴 é uma matriz invertível (det 𝐴 ≠ 0).
Nessa condição, a matriz 𝐴 pode ser decomposta como o produto 𝐴 = 𝐿 ∙ 𝑈, onde 𝐿 é uma
matriz triangular inferior e 𝑈 é uma matriz triangular superior.
Teorema: Se a matriz 𝐴 é tal que det 𝐴 ≠ 0, então existe uma única matriz triangular
inferior 𝐿 = 𝑙𝑖𝑗 e uma matriz triangular superior 𝑈 = 𝑢𝑖𝑗 , tal que:
𝐴 =𝐿∙𝑈
Método da Decomposição LU
Pode-se reescrever o Teorema: se o método da eliminação de Gauss pode ser efetuado sobre
a matriz 𝐴, então pode ser escrita por 𝐴 = 𝐿 ∙ 𝑈.
A matriz 𝐿 é obtida pelos multiplicadores utilizados no processo da eliminação de Gauss,
𝑎𝑖𝑗
sendo 𝑙𝑖𝑗 = 𝑚𝑖𝑗 = , se 𝑖 > 𝑗 , 𝑙𝑖𝑖 = 1, 𝑙𝑖𝑗 = 0 se 𝑖 < 𝑗. E a matriz 𝑈 é a própria matriz
𝑎𝑗𝑗
triangular superior obtida no processo da decomposição de Gauss.
𝑥1 − 3𝑥2 + 2𝑥3 = 11
−2𝑥1 + 8𝑥2 − 𝑥3 = −15
4𝑥1 − 6𝑥2 + 5𝑥3 = 29
a) Inicialmente, monta-se as matrizes relacionadas ao sistema 𝐴 ∙ 𝑋 = 𝐵:
1 −3 2 𝑥1 11
𝐴 = −2 8 −1 , 𝑋 = 𝑥2 𝑒 𝐵 = −15
4 −6 5 𝑥3 29
1 −3 2 1 0 0 1 −3 2
𝐴= 0 2 3 , 𝐿 = −2 1 0 e𝑈= 0 𝑢22 𝑢23
0 6 −3 4 𝑙32 1 0 0 𝑢33
Método da Decomposição LU – Exemplo 1
Pivô da segunda coluna: 𝑎22 = 2. Zerar elementos da segunda coluna abaixo da diagonal
principal. Para isso, determina-se os multiplicadores de cada linha do pivô e se procede com o
método de Gauss para zerar os elementos abaixo do pivô:
6
𝑙32 = 𝑚32 = = 3 ⟶ 𝐿’3 = 𝐿3 − 𝑚32 𝐿2
2
1 −3 2 1 0 0 1 −3 2
𝐴= 0 2 3 , 𝐿 = −2 1 0 e𝑈= 0 2 3
0 0 −12 4 3 1 0 0 𝑢33
Método da Decomposição LU – Exemplo 1
Pivô da terceira coluna: 𝑎33 = −12. Neste caso, a linha e a coluna das matrizes 𝐿 e 𝑈,
respectivamente, já estão definidas.
1 −3 2 1 0 0 1 −3 2
𝐴= 0 2 3 , 𝐿 = −2 1 0 e𝑈= 0 2 3
0 0 −12 4 3 1 0 0 −12
1 −3 2 1 0 0 1 −3 2
𝐴 = 𝐿 ∙ 𝑈 ⇒ −2 8 −1 = −2 1 0 ∙ 0 2 3
4 −6 5 4 3 1 0 0 −12
Método da Decomposição LU – Exemplo 1
c) Calcular a solução do sistema 𝐿 ∙ 𝑌 = 𝐵:
1 0 0 𝑦1 11 𝑦1 = 11 11
−2 1 0 ∙ 𝑦2 = −15 → −2𝑦1 + 𝑦2 = −15 ⟹ 𝑌 = 7
4 3 1 𝑦3 29 4𝑦1 + 3𝑦2 + 𝑦3 = 29 −36
d) Calcular a solução do sistema 𝑈 ∙ 𝑋 = 𝑌, e por sua vez, a solução de 𝐴 ∙ 𝑋 = 𝐵:
1 −3 2 𝑥1 11 𝑥1 − 3𝑥2 + 2𝑥3 = 11 𝟐
0 2 3 ∙ 𝑥2 = 7 → 𝑥2 + 3𝑥3 = 7 ⟹ 𝑿 = −𝟏
0 0 −12 𝑥3 −36 −12𝑥3 = −36 𝟑
Resolver, pelo método da decomposição LU, o sistema linear, com duas casas decimais:
Pivô da segunda coluna: 𝑎22 = 0,495. Zerar elementos da segunda coluna abaixo da diagonal
principal. Para isso, determina-se os multiplicadores de cada linha do pivô e se procede com o
método de Gauss para zerar os elementos abaixo do pivô:
0,476
𝑙32 = 𝑚32 = = 0,962 ⟶ 𝐿’3 = 𝐿3 − 𝑚32 𝐿2
0,495
Pivô da terceira coluna: 𝑎33 = −0,262. Neste caso, a linha e a coluna das matrizes 𝐿 e 𝑈,
respectivamente, já estão definidas.
−𝟐𝟎, 𝟎𝟐𝟓
⟹ 𝑿 = 𝟎, 𝟗𝟖𝟖
𝟕, 𝟔𝟓𝟏
Decomposição LU – Código em Matlab
Decomposição LU – Código em C
#define MAX 30 // ordem máxima do sistema
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void PreencheMatrizes() {
int i, j;
printf("Entre com a ordem do sistema: n = ");
scanf("%d", &N);
printf("Informe a matriz expandida do sistema linear - ");
printf("\nDigite os valores separados por espaços:\n");
for (i = 0; i < N; i++) {
printf("Linha %d: ", i + 1);
for (j = 0; j < N; j++) {
scanf("%f", &(a[i][j]));
}
scanf("%f", &(b[i]));
}
…
Decomposição LU – Código em C
// Preenchimento das matrizes L e U
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (i > j) {
u[i][j] = 0;
l[i][j] = -100000;
}
else if (i == j) {
l[i][j] = 1;
u[i][j] = -100000;
}
else {
l[i][j] = 0;
u[i][j] = -100000;
}
}
}
printf("\nMatrizes Preenchidas\n");
Show(); //mostra as matrizes
}
Decomposição LU – Código em C
// Faz a Decomposicao das Matrizes L e U
void Decomposicao() {
int i, j, k;
int cont = 1;
for (k = 0; k <= N - 1; k++) {
printf("Iteração %d:\n", cont);
for (i = N - 1; i >= k; i--) {
if (i > k){
termo = a[i][k] / a[k][k];
l[i][k] = termo;
for (j = 0; j < N; j++) {
a[i][j] = a[i][j] - a[k][j] * termo;
}
}
u[k][i] = a[k][i];
}
cont++;
Show();
}
}
Decomposição LU – Código em C
/* Calcula a Matriz das Soluções Intermediárias */
void Solucaoy() {
int k, j;
float s;
for (k = 0; k < N; k++) {
s = 0;
for (j = k-1; j >= 0; j--) {
s = s + l[k][j] * y[j];
}
y[k] = (b[k] - s) / l[k][k];
}
}
/* Mostra o Resultado da Matriz de Soluções Intemediárias*/
void Imprimey() {
int i;
printf("\nSolução do Sistema Intermediário\n");
for (i = 0; i < N; i++) {
printf(”y(%d)= %.3f\n", i + 1, y[i]);
}
printf("\n");
}
Decomposição LU – Código em C
/* Calcula a Matriz das Soluções do Sistema */
void Solucaox() {
int k, j;
float s;
for (k = N - 1; k >= 0; k--) {
s = 0;
for (j = k + 1; j < N; j++) {
s = s + u[k][j] * x[j];
}
x[k] = (y[k] - s) / u[k][k];
}
}
/* Mostra o Resultado da Matriz de Soluções */
void Imprimex() {
int i;
printf("\nSolução do Sistema Linear\n");
for (i = 0; i < N; i++) {
printf("x(%d)= %.3f\n", i + 1, x[i]);
}
printf("\nProblema Encerrado.\n");
}
Decomposição LU – Código em C
Se 𝐴 é uma matriz quadrada, tal que det(𝐴) ≠ 0, então existe uma matriz 𝐴−1 , com a
mesma ordem de 𝐴, chamada inversa de 𝐴, tal que:
𝐴 ∙ 𝐴−1 = 𝐴−1 ∙ 𝐴 = 𝐼
Uma das melhores formas de determinar a inversa de uma matriz numericamente é através
da decomposição LU.
Tal método fornece uma forma eficaz de determinar a solução de um sistema 𝐴 ∙ 𝑋 = 𝐵,
para diversos valores do vetor 𝐵.
O problema consiste em, dada uma matriz quadrada 𝐴 de ordem 𝑛, se quer determinar 𝐴−1 ,
tal que:
𝐴 ∙ 𝐴−1 = 𝐼
Matriz Inversa e Decomposição LU
Assim, temos:
𝑎11 𝑎12 𝑎13 ⋯ 𝑎1𝑛 𝑥11 𝑥12 𝑥13
⋯ 𝑥1𝑛 1 0 0 ⋯ 0
𝑎21 𝑎22 𝑎23 ⋯ 𝑎2𝑛 𝑥21 𝑥22 𝑥23
⋯ 𝑥2𝑛 0 1 0 ⋯ 0
𝑎31 𝑎32 𝑎33 ⋯ 𝑎3𝑛 ∙ 𝑥31 𝑥32 𝑥33
⋯ 𝑥3𝑛 = 0 0 1 ⋯ 0
⋮ ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ ⋮ ⋮ ⋱ ⋮
𝑎𝑛1 𝑎𝑛2 𝑎𝑛3 ⋯ 𝑎𝑛𝑛 𝑥𝑛1 𝑥𝑛2 𝑥𝑛3
⋯ 𝑥𝑛𝑛 0 0 0 ⋯ 1
Pode-se determinar a inversa de 𝐴 com o auxílio da decomposição LU, resolvendo sistemas
do tipo: 𝐴 ∙ 𝑋𝑗 = 𝐼𝑗 , para 𝑗 = 1, 2, … , 𝑛. Onde:
𝑥1𝑗
𝑥2𝑗
𝑥𝑗 = 𝑥3𝑗
⋮
𝑥𝑛𝑗
É a 𝑗-ésima coluna de 𝐴−1 , e
Matriz Inversa e Decomposição LU
0
⋮
0
𝐼𝑗 = 𝑎𝑗𝑗 = 1
0
⋮
0
É a 𝑗-ésima coluna de 𝐼. Com a decomposição, obtém-se sistemas do tipo:
𝐴 ∙ 𝑋𝑗 = 𝐿 ∙ 𝑈 ∙ 𝑋𝑗 = 𝐼𝑗 , para 𝑗 = 1, 2, … , 𝑛.
Gerando os sistemas:
𝑈 ∙ 𝑋𝑗 = 𝑌𝑗 e 𝐿 ∙ 𝑌𝑗 = 𝐼𝑗
Como a matriz 𝐴 é comum em todos os sistemas, com uma única aplicação da eliminação
de Gauss, se consegue determinar os 𝑛 vetores 𝑥𝑗 que formam a matriz inversa.
Matriz Inversa - Exemplo
Pivô da primeira coluna: 𝑎11 = 1. Zerar elementos da primeira coluna abaixo da diagonal
principal. Para isso, determina-se os multiplicadores de cada linha do pivô e se procede com o
método de Gauss para zerar os elementos abaixo do pivô:
1
𝑙21 = 𝑚21 = = 1 ⟶ 𝐿’2 = 𝐿2 − 𝑚21 𝐿1
1
1
𝑙31 = 𝑚31 = = 1 ⟶ 𝐿’3 = 𝐿3 − 𝑚31 𝐿1
1
1 0 0 1 0 0 1 0 0
𝐴= 0 3 1 ,𝐿= 1 1 0 e 𝑈 = 0 𝑢22 𝑢23
0 2 0 1 𝑙32 1 0 0 𝑢33
Matriz Inversa - Exemplo
Pivô da segunda coluna: 𝑎22 = 3. Zerar elementos da segunda coluna abaixo da diagonal
principal. Para isso, determina-se os multiplicadores de cada linha do pivô e se procede com o
método de Gauss para zerar os elementos abaixo do pivô:
2
𝑙32 = 𝑚32 = ⟶ 𝐿’3 = 𝐿3 − 𝑚31 𝐿1
3
1 0 0 1 0 0 1 0 0
𝐴= 0 3 1 ,𝐿= 1 1 0 e𝑈= 0 3 1
0 0 −2/3 1 2/3 1 0 0 𝑢33
Matriz Inversa - Exemplo
Pivô da terceira coluna: 𝑎33 = −2/3. Neste caso, a linha e a coluna das matrizes 𝐿 e 𝑈,
respectivamente, já estão definidas:
1 0 0 1 0 0 1 0 0
𝐴= 0 3 1 ,𝐿= 1 1 0 e𝑈= 0 3 1
0 0 −2/3 1 2/3 1 0 0 −2/3
Matriz Inversa - Exemplo
b) Calcular a solução dos sistema 𝐿 ∙ 𝑌𝑗 = 𝐼𝑗 e 𝑌𝑗 = 𝑈 ∙ 𝑋𝑗
1 0 0 𝑦11 1 𝑦11 = 1 1
𝐿 ∙ 𝑌1 = 𝐼1 ⟹ 1 1 0 ∙ 𝑦21 = 0 → 𝑦11 + 𝑦21 = 0 ⟹ 𝑌1 = −1
1 2/3 1 𝑦31 0 𝑦11 + 2 3 𝑦21 + 𝑦31 = 0 −1/3
1 0 0 𝑥11 1 𝑥11 = 1
𝑈 ∙ 𝑋1 = 𝑌1 ⟹ 0 3 1 ∙ 𝑥21 = −1 → 3𝑥21 + 𝑥31 = −1
0 0 −2/3 𝑥31 −1/3 − 2 3 𝑥31 = − 1 3
1
⟹ 𝑋1 = −1/2
1/2
Matriz Inversa - Exemplo
1 0 0 𝑦12 0 𝑦12 = 0 0
𝐿 ∙ 𝑌2 = 𝐼2 ⟹ 1 1 0 ∙ 𝑦22 = 1 → 𝑦12 + 𝑦22 = 1 ⟹ 𝑌2 = 1
1 2/3 1 𝑦32 0 𝑦12 + 2 3 𝑦22 + 𝑦32 = 0 −2/3
1 0 0 𝑥12 0 𝑥12 = 0
𝑈 ∙ 𝑋2 = 𝑌2 ⟹ 0 3 1 ∙ 𝑥22 = 1 → 3𝑥22 + 𝑥32 = 1
0 0 −2/3 𝑥32 −2/3 − 2 3 𝑥32 = − 2 3
0
⟹ 𝑋2 = 0
1
Matriz Inversa - Exemplo
b.3) Para a coluna 𝑗 = 3:
1 0 0 𝑦13 0 𝑦13 = 0 0
𝐿 ∙ 𝑌3 = 𝐼3 ⟹ 1 1 0 ∙ 𝑦23 = 0 → 𝑦13 + 𝑦23 = 0 ⟹ 𝑌3 = 0
1 2/3 1 𝑦33 1 𝑦13 + 2 3 𝑦23 + 𝑦33 = 1 1
1 0 0 𝑥13 0 𝑥13 = 0
𝑈 ∙ 𝑋3 = 𝑌3 ⟹ 0 3 1 ∙ 𝑥23 = 0 → 3𝑥23 + 𝑥33 = 0
0 0 −2/3 𝑥33 1 − 2 3 𝑥33 = 1
0
⟹ 𝑋3 = 1/2
−3/2
c) Montar a matriz inversa 𝐴−1 :
1 0 0
𝐴−1 = 𝑋1 𝑋2 𝑋3 = −1/2 0 1/2
1/2 1 −3/2
Matriz Inversa – Exemplo (Pela Definição )
1 0 0
Determinar a inversa da matriz 𝐴 = 1 3 1
1 2 0
Solução:
𝐴𝐴−1 = 𝐼, definição de matriz inversa
1 0 0 𝑎 𝑏 𝑐 1 0 0
1 3 1 𝑑 𝑒 𝑓 = 0 1 0
1 2 0 𝑔 ℎ 𝑖 0 0 1
𝐹𝑎𝑧𝑒𝑟 …
Decomposição LU – Código em Matlab
Decomposição LU – Código em C
#define MAX 30 // ordem máxima do sistema
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void PreencheMatrizes() {
int i, j;
printf("Entre com a ordem da matriz: n = ");
scanf("%d", &N);
printf("Informe a matriz a ser calculada sua inversa ");
printf("\nDigite os valores separados por espaços:\n");
for (i = 0; i < N; i++) {
printf("Linha %d: ", i + 1);
for (j = 0; j < N; j++) {
scanf("%f", &(a[i][j]));
}
}
//Preenchimento da Matriz Identidade
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
if (i==j) id[i][j]=1;
else id[i][j]=0;
}
Decomposição LU – Código em C
// Preenchimento das matrizes L e U
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (i > j) {
u[i][j] = 0;
l[i][j] = -100000;
}
else if (i == j) {
l[i][j] = 1;
u[i][j] = -100000;
}
else {
l[i][j] = 0;
u[i][j] = -100000;
}
}
}
printf("\nMatrizes Preenchidas\n");
Show(); //mostra as matrizes
}
Decomposição LU – Código em C
// Faz a Decomposicao das Matrizes L e U
void Decomposicao() {
int i, j, k;
for (k = 0; k <= N - 1; k++) {
for (i = N - 1; i >= k; i--) {
if (i > k){
termo = a[i][k] / a[k][k];
l[i][k] = termo;
for (j = 0; j < N; j++) {
a[i][j] = a[i][j] - a[k][j] * termo;
}
}
u[k][i] = a[k][i];
}
}
printf("\nDecomposição Realizada\n");
Show();
}
Decomposição LU – Código em C
/* Calcula a Matriz das Soluções Intermediárias */
void Solucaoy(int m) {
int k, j;
float s;
for (k = 0; k < N; k++) {
s = 0;
for (j = k-1; j >= 0; j--) {
s = s + l[k][j] * y[j];
}
y[k] = (id[k][m] - s) / l[k][k];
}
}
/* Mostra o Resultado da Matriz de Soluções Intemediárias*/
void Imprimey() {
int i;
printf("\nSolução do Sistema Intermediário\n");
for (i = 0; i < N; i++) {
printf(”y(%d)= %.3f\n", i + 1, y[i]);
}
printf("\n");
}
Decomposição LU – Código em C
/* Calcula a Matriz das Soluções do Sistema */
void Solucaox(int m) {
int k, j, i; float s;
for (k = N - 1; k >= 0; k--) {
s = 0;
for (j = k + 1; j < N; j++) {
s = s + u[k][j] * x[j];
}
x[k] = (y[k] - s) / u[k][k];
}
for (i = 0; i < N; i++) {
inv[i][m] = x[i];
}
}
/* Mostra o Resultado da Matriz de Soluções */
void Imprimex() {
int i; printf("\nSolução do Sistema Linear\n");
for (i = 0; i < N; i++) {
printf("x(%d)= %.3f\n", i + 1, x[i]);
}
printf("\nProblema Encerrado.\n");
}
Decomposição LU – Código em C
void ImprimeInversa() {
int i, j; printf("Matriz Inversa:\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf("\t%10.2f", inv[i][j]);
printf("\n");
}
}
1. Resolver, pelo método da decomposição LU, o sistema linear, com três casas decimais:
0,2 −5 3 0,4 0
−0,5 1 7 −2 0,3
𝐴= 0,6 2 −4 3 0,1
3 0,8 2 −0,4 3
0,5 3 2 0,4 1
Exercícios
−1,410
1. 𝑋 = 1,398
2,427
2
4
2. 𝑋 =
−3
0,5