Baixe o app para aproveitar ainda mais
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!
Compartilhar