Buscar

aula 07

Prévia do material em texto

Universidade de Brasília – UnB 
Faculdade UnB Gama – FGA 
Métodos Numéricos para Engenharia 
Prof. Ricardo Fragelli 
 
 
 
AULA 07 
Funções, Matrizes e Sistemas Lineares 
 
 
 
1. Funções no Matlab 
 
Lembram-se quando utilizamos o comando eval em algumas aulas anteriores? Por exemplo, se 
quisermos calcular o valor de uma função inserida pelo usuário e calcular alguns valores dessa 
função para , e , então, bastaria fazer o seguinte: 
 
 
funcao = input('insira uma função e iremos calcular f(1), f(2) e f(3)'); 
x=1; 
vf = eval(funcao); 
fprintf('f(1) = %f',vf); 
x=2; 
vf = eval(funcao); 
fprintf('f(2) = %f',vf); 
x=3; 
vf = eval(funcao); 
fprintf('f(3) = %f',vf); 
 
 
Mas, existe uma função no Matlab (inline) que transforma um literal em função. Com ela, o código 
poderia ser reduzido para o seguinte: 
 
 
funcao = input('insira uma função e iremos calcular f(1), f(2) e f(3): '); 
f = inline(funcao); 
fprintf('f(1) = %f\n',f(1)); 
fprintf('f(2) = %f\n',f(2)); 
fprintf('f(3) = %f\n',f(3)); 
 
 
Uma execução desse script está apresentada na figura 1. 
 
 
Figura 1 – Utilizando inline para transformar um literal em função. 
 
E se desejássemos criar nossas próprias funções? Isso também tornaria nossos códigos mais 
elegantes e inteligentes! 
Para criar uma função em um arquivo .m, utilizamos a seguinte notação: 
 
function [valores de saída] = nome da função (parâmetros de entrada) 
 
Para fazer nosso primeiro teste, vamos criar uma função simples chamada operacoes. Para isso, 
abra um novo arquivo clicando em novo>função e digite o seguinte código: 
 
 
 
function [ soma, sub, prod, div ] = operacoes( a, b ) 
 
soma = a+b; 
sub = a-b; 
prod = a*b; 
div = a/b; 
 
end 
 
 
 
Agora salve o arquivo com o mesmo nome da função e pode utilizá-la. A figura 2 mostra uma 
possível execução da função criada. 
 
 
Figura 2 – Execução de uma função criada no Matlab. 
 
Em um mesmo arquivo podem haver várias funções, mas a primeira deve ter o mesmo nome do 
arquivo e somente ela poderá ser executada diretamente pela janela de comandos. As demais 
funções somente serão utilizadas internamente pelas demais funções do mesmo arquivo. Veja um 
exemplo de como fazer: 
 
 
function [ soma, sub, prod, div ] = operacoes( a, b ) 
 
soma = qual_soma(a,b); 
sub = a-b; 
prod = a*b; 
div = a/b; 
 
end 
 
function resultado = qual_soma(a,b) 
 
resultado = a+b; 
 
end 
 
 
 
2. Matrizes 
 
Já vimos como definir um vetor no Matlab, mas, vamos relembrar (figura 3): 
 
a) unidimensional: 
 
>> x = [1 2 3 4 5] 
 
b) bidimensional: 
 
>> y = [1 2 3 4 5; 6 7 8 9 10] 
 
 
Figura 3 – Definindo vetores uni e bidimensionais. 
 
Para acessar um determinado elemento do vetor unidimensional, basta fazer x(elemento). Por 
exemplo, x(1) retornará o valor 1. Para duas dimensões, pode fazer y(linha, coluna) ou 
y(elemento). No nosso exemplo, y(1,2) retornará o valor 7 que também pode ser obtido fazendo 
y(4), pois o Matlab irá correr os valores de cada coluna até o sétimo valor. Então, responda: quem 
é y(7)? 
 
É possível obter uma parte do vetor. Por exemplo, y(2, 2:4) retornará [7 8 9], pois são os elementos 
da linha 2 e das colunas 2, 3 e 4. 
 
Para descobrirmos o número de linhas e colunas de y, utilizamos a função size: 
 
>> [l, c] = size(y) 
 
Para ver o quanto consegue fazer com as informações até o momento, vamos lançar um desafio: 
crie uma função chamada troca_linha que trocará duas linhas de uma matriz (vetor bidimensional) 
(figura 4). 
 
 
Figura 4 – Troca de linhas. 
 
Uma parte do código está colocada abaixo, mas ainda falta terminá-lo! 
 
 
function y = troca_linha( x, a, b ) 
 
[l,c] = size(x); 
 
for i=1:l 
 
 if (i~=a && i~=b) 
 
 y(i, 1:c) = x(i, 1:c); 
 
 end 
 
end 
 
% aqui ainda faltam algumas linhas neste código... 
 
 
 
Terminar esse código é fundamental para fazermos resolução de sistemas lineares, ok? 
 
 
3. Resolução de Sistemas Lineares 
 
Quando você se depara com a figura 5, qual é a primeira coisa que vem à sua mente? (pense por 
alguns segundos) 
 
 
Figura 5 – Ginasta brasileiro. 
 
Se já respondeu a primeira pergunta, pode seguir o texto. 
 
Logo em seguida vamos comentar sua primeira resposta provável, mas, antes, temos outro 
desafio: Olhe bem para a figura, analise todos os detalhes e veja se encontra algo que possa lhe 
chamar a atenção. 
 
Provavelmente você deve ter se impressionado pela flexibilidade do nosso ginasta e, ao ser 
desafiado para perceber os detalhes da figura, talvez tenha notado um cara de bigode ao lado de 
outro que está registrando o momento em um ângulo esquisito, duas mulheres que estão com 
almofadas vermelhas no colo, uma mulher com um relógio imenso, ou ainda dois caras com a mão 
no queixo fazendo pose de intelectual. São muitas as possibilidades, mas, não é o que 
gostaríamos que tivesse visto! 
 
É bem mais simples que isto, gostaríamos que tivesse notado que a barra horizontal está em 
flambagem, isto é, entortada por ação do ginasta (sofrendo momento fletor e força cisalhante) e 
das barras verticais de apoio. Além disso, as barras vermelhas que estão na vertical (sofrem 
apenas compressão) estão estaiadas com cabos de sustentação (que sofrem apenas tração). 
 
Uma barra resiste melhor às forças de tração e de compressão do que ao momento fletor e às 
forças cisalhantes. É baseado nesse princípio que as treliças são projetadas! 
 
Para fazer o projeto das barras de uma treliça, é preciso determinar as forças que estão sendo 
submetidas, e, toda estrutura treliçada resulta em um sistema linear. Veja o exemplo da figura 6: 
 
 
Figura 6 – Treliça bidimensional submetida a esforços externos. 
 
Para criar o sistema de equações da treliça, basta fazer a análise de equilíbrio de cada nó 
considerando que não existe movimento em ou e, por isso, o somatório de forças deve ser 
nulo. O apoio em A é um apoio móvel e, desse modo, só resiste movimentos em uma direção. O 
apoio em E trata-se de um apoio fixo e resiste em duas direções. 
 
O resultado é um sistema linear que pode ser escrito em forma matricial: 
 
 
 0 0 1 0 0 0 0 0 0 0 0 0 YA 0 
 1 1 0 0 0 0 0 0 0 0 0 0 FAB 0 
 0 0 0 0,707 1 0 0 0 0 0 0 0 FAF 0 
 0 -1 0 -0,707 0 0 0 0 0 0 0 0 FBF 50 
 0 0 -1 -0,707 0 0 0,707 1 0 0 0 0 FBC 0 
 0 0 0 0,707 0 1 0,707 0 0 0 0 0 FFC = 0 
 0 0 0 0 -1 0 0 0 1 0 0 0 FFD 0 
 0 0 0 0 0 -1 0 0 0 0 0 0 FFE 100 
 0 0 0 0 0 0 -0,707 0 -1 0 0 0 FCD 0 
 0 0 0 0 0 0 -0,707 0 0 -1 0 0 FDE 50 
 0 0 0 0 0 0 0 0 0 0 1 0 XE 0 
 0 0 0 0 0 0 0 0 0 1 0 1 YE 0 
 
 
O problema agora está em encontrar um método para resolver esse sistema. 
4. Regra de Cramer 
 
A Regra de Cramer é um método direto e consiste em encontrar a solução de um sistema linear por meio dos determinantes de matrizes. Por exemplo, um sistema do tipo: 
 { 
 
poderia ser escrito no formato matricial: 
 [ ] [ ] [ ] 
 
A solução do sistema segundo a regra de Cramer é dada por: 
 
 
 
 
Desse modo, temos que: 
 ( ) 
 ( ) 
 ( ) 
 ( ) 
 
 
 
 
No Matlab podemos calcular o determinante de uma matriz x fazendo det(x) (figura 6). 
 
Figura 6 – Solução de um sistema utilizando a Regra de Cramer. 
 
Como é possível calcular o determinante facilmente no computador e depois é só fazer a divisão 
entre esses determinantes para encontrar o conjunto solução do sistema, é fácil chegar a 
conclusão que o problema de encontrar um método eficiente para resolver sistemas lineares está 
concluído!Contudo, não é bem assim! No nosso problema da figura 5, uma treliça bidimensional e bastante 
simples, o sistema possui 12 incógnitas. Isso faz com que teríamos que calcular 11 determinantes 
de matrizes 12x12 mais uma série de adições e tornaria o método ineficiente para problemas 
práticos de Engenharia, que trabalham com sistemas lineares de grande porte. 
 
Veremos alguns métodos mais interessantes a seguir! 
 
 
5. Método de Eliminação de Gauss 
 
O método de eliminação de Gauss que consiste em transformar o sistema linear original num 
sistema linear equivalente que seja triangular superior. Se conseguirmos uma matriz triangular 
superior, então a solução do sistema é bastante simples, veja: 
 [ ] [ ] [ ] 
 
A solução é obtida fazendo o cálculo de baixo para cima, ou seja, calculamos o valor da última 
incógnita e, com esse valor, calculamos a penúltima e assim por diante. Veja: 
 
 ሺ ሻ 
 ሺ ሻ ሺ ሻ 
 
 
Para um sistema triangular , com , do tipo: 
 [ ] [ 
 ] [ 
 ] 
 
a solução é dada por retro-substituição por meio da seguinte fórmula de recorrência: 
 ቌ ∑ ቍ 
 
Para aplicar a fórmula de recorrência, o algoritmo para encontrar a solução da matriz triangular fica 
assim: 
 
 
 
Para n de (n-1) até 1 faça 
 
 
Para j de (i+1) até n faça 
 
 
Fim Para 
 ሺ ሻ 
 
Fim Para 
 
 
Agora, implemente o algoritmo no Matlab e teste com nosso exemplo anterior. 
 
Mas, ainda precisamos descobrir como reduzir um sistema linear para um sistema triangular 
equivalente e é com esse objetivo que surge o método da eliminação de Gauss. O método consiste 
em fazer operações simples que não alteram o sistema linear: 
 
a) Permutar as equações do sistema; 
b) Multiplicar uma equação do sistema por um número real não nulo; 
c) Somar a uma das equações do sistema uma outra equação desse sistema multiplicada 
por um número real. 
 
Antes de generalizarmos, considere o seguinte sistema: 
 
[ ] [ 
 ] [ 
 ] 
 
Note que é possível zerar os valores da coluna 1 que estão abaixo do valor 5 (conhecido como 
pivô) fazendo o seguinte: 
 
a) Multiplicando a linha 1 por -2/5 e depois somando com a linha 2, obtendo a nova linha 2 
do sistema; 
b) Multiplicando a linha 1 por -1/5 e depois somando com a linha 3, obtendo a nova linha 3; 
c) Multiplicando a linha 1 por 3/5 e depois somando com a linha 4, obtendo a nova linha 4. 
 
Fazendo isso, teríamos a seguinte matriz equivalente: 
 [ ] [ 
 ] [ 
 ] 
 
O que resulta em: 
 [ ] [ 
 ] [ 
 ] 
 
Note que conseguimos zerar os valores abaixo da primeira coluna que estão abaixo da diagonal. 
Poderíamos fazer o mesmo com a segunda coluna e, por fim, com a terceira, e teríamos uma 
matriz triangular superior. 
 
Os valores -2/5, -1/5 e 3/5 foram obtidos dividindo o valor da primeira coluna de cada linha abaixo 
da diagonal da matriz por 5 que é o valor que está exatamente na diagonal. Esse valor é chamado 
de pivô e será um para cada vez que o método for utilizado. Por exemplo, o próximo passo seria 
zerar os valores da segunda coluna que estão abaixo de -0,2 que é o pivô da segunda etapa. 
 
E é justamente aí que aparece o primeiro problema a ser considerado: E se o pivô fosse igual a 
zero ou muito próximo de zero? Certamente ocasionaria erro no algoritmo e precisamos tratar esse 
erro! 
 
Vamos discutir isso logo em seguida, mas, antes, implemente o seguinte algoritmo que dá a 
solução geral para o método de Eliminação de Gauss: 
 
 
 
Para j de 1 até (n-1) faça { varredura das colunas do sistema } 
 
Para i de (j+1) até n faça { varredura das linhas abaixo da diagonal da matriz para 
uma determinada coluna j } 
 
 
Para k de 1 até n { fazendo a soma dos elementos de uma linha i, k é 
utilizado para contar as colunas da matriz: de 1 a n } 
 
 
 
Fim Para 
 
Fim Para 
 
 
Fim Para 
 
 
Voltando ao problema de utilizar um pivô muito próximo de zero, a solução é simples: trocar duas 
linhas da matriz desde que estejam em uma linha abaixo da diagonal que contém o pivô atual. Para 
escolher o novo pivô, basta verificar aquele que tiver o maior valor em módulo. No nosso caso, 
bastaria trocar a segunda com a quarta linha, veja: 
 [ ] [ 
 ] [ 
 ] [
 ] [ 
 ] [ 
 ] 
 
Assim, o novo pivô para a segunda etapa se torna 3,8. Essa manipulação da matriz para se obter 
um pivô com maior valor absoluto se chama pivoteamento, mais especificamente pivoteamento 
parcial se trocamos apenas linhas da matriz. O pivoteamento completo é feito observando também 
os maiores valores entre as colunas da matriz. 
 
Para a Eliminação de Gauss com pivoteamento parcial, tem-se o seguinte algoritmo: 
 
 
Para j de 1 até (n-1) faça { varredura das colunas do sistema } 
 
{ pivoteamento parcial } 
 
 
Para i de (j+1) até n faça { Para uma coluna j, faz a varredura nas linhas } 
 
Se | | | | então 
Fim do Se 
 
Fim do Para 
 
Se então 
{ insira aqui a função que você criou nesta aula para trocar duas linhas da 
matriz e troque a linha x com a j } 
Fim do Se 
 
Para i de (j+1) até n faça { varredura das linhas abaixo da diagonal da matriz para 
uma determinada coluna j } 
 
 
Para k de 1 até n { fazendo a soma dos elementos de uma linha i, k é 
utilizado para contar as colunas da matriz: de 1 a n } 
 
 
Fim Para 
 
Fim Para 
 
 
Fim Para 
 
 
Implemente o algoritmo com pivoteamento no Matlab e faça testes resolvendo os exemplos desta 
aula. 
 
Um forte abraço e até a próxima!

Outros materiais

Materiais relacionados

Perguntas relacionadas

Perguntas Recentes