MÉTODOS NUMÉRICOS APLICAÇÃO NO MATLAB Professor: Lissandro Brito Viena e-mail: [email protected] [email protected] Site: www.ifba.edu.br/professores/lissandro EQUAÇÕES ALGÉBRICAS LINEARES E MATRIZES 1) NOTAÇÃO MATRICIAL Uma matriz consiste de um arranjo retangular de elementos. a11 A a n1 a1n a nn A matriz que tem “m” linhas e “n” colunas tem dimensão m x n. A matriz que possui apenas linhas ou colunas, é denominada de vetor linha ou vetor coluna respectivamente. EQUAÇÕES ALGÉBRICAS LINEARES E MATRIZES Exemplo de matriz linha denominada de vetor linha: b [b1 bn ] Exemplo de matriz coluna denominada de vetor coluna: c1 c c m Matriz quadrada é aquela que o número de linhas é igual ao número de colunas. (m = n). Matrizes quadradas são importantes no momento da resolução de um conjunto equações algébricas lineares. Para tais sistemas, o número de equações (linhas) e o número de variáveis (colunas) Matrizes quadradas são importantes no momento da resolução de um conjunto equações algébricas lineares. Para tais sistemas, o número de equações (linhas) e o número de variáveis (colunas) devem ser iguais para que exista apenas uma solução. Matriz simétrica: é uma matriz do tipo quadrada em que os elementos aij = aji. Matriz diagonal: é uma matriz do tipo quadrada em que todos os elementos fora da diagonal principal são nulos. Matriz identidade: matriz diagonal em que os elementos da diagonal principal são iguais a 1. Matriz triangular superior: é aquela matriz em que os elementos abaixo da diagonal principal são nulos. Matriz triangular inferior: é aquela matriz em que os elementos acima da diagonal principal são nulos. Para saber a dimensão de uma matruz no MATLAB usa-se o seguinte comando (size): [m, n] = size(matriz) Representando equações algébricas lineares na forma matricial Considere o sistema 3 x 3 abaixo: Representando equações algébricas lineares na forma matricial Considere o sistema 3 x 3 abaixo: a11x1 a12 x 2 a13 x 3 b1 a x a x a x b 21 1 22 2 23 2 2 a x a x a x b 3 31 1 32 2 33 3 O sistema acima pode ser representado pela seguinte notação: A x b A matriz é denominada de matriz dos coeficientes, a matriz b consiste de um vetor coluna de constantes e a matriz x consiste de um vetor coluna de variáveis. Representando equações algébricas lineares na forma matricial Uma forma de resolver esse sistema é multiplicar ambos lados pela inversa da matriz dos coeficientes: A x b A 1 A x A 1 b x A b 1 Para resolver equações algébricas lineares com MATLAB aplica-se o seguinte comando: x A \ b A segunda forma é usar matriz inversa: x inv(A) b NOÇÕES SOBRE ELMINAÇÃO DE GAUSS Para explicar o procedimento de resolver equações algébricas lineares pela eliminação de Gauss, o exemplo seguinte será usado: 3x1 0,1x 2 0, 2x 3 7,85 0,1x1 7x 2 0,3x 3 19,3 0,3x 1 0, 2x 2 10x 3 71, 4 O primeiro passo na solução do sistema é multiplicar a primeira equação por 0,1/3 e subtraia da segunda, resultando em: 7,0033x 2 0, 293333x 3 19,5617 Ao multiplicar a primeira equação por 0,3/3 e subtrair da última equação resulta no seguinte sistema: NOÇÕES SOBRE ELMINAÇÃO DE GAUSS 3x1 0,1x 2 0, 2x 3 7,85 7,0033x 2 0, 293333x 3 19,5617 0,19x 2 10,0200x 3 70,6150 Para completar a operação, x2 deve ser removida da terceira equação restando apenas x3 que pode ser encontrada facilmente. 3x1 0,1x 2 0, 2x 3 7,85 7,0033x 2 0, 293333x 3 19,5617 10,0120x 3 70,0843 70,0843 x3 7,00003 10,0120 Após isso, é necessário retornar nas outras equações para calcular as outras variáveis. NOÇÕES SOBRE ELMINAÇÃO DE GAUSS Após isso, é necessário retornar nas outras equações para calcular as outras variáveis. function [a_ampliada,x] = eliminagauss_lissandro(a,b) % a- matriz dos coeficientes % b - matriz dos termos independentes % x- vetor das variáveis [m,n]=size(a); nb=n+1; a_ampliada=[a b]; for k=1:(n-1) for h=(k+1):(n) a_ampliada(h,k:nb)=((a_ampliada(h,k))/(a_ampliada(k,k)))*a_ampliada(k,k:nb)- a_ampliada(h,k:nb); end end x=zeros(n,1); % define inicialmente um vetor solução de zeros, para depois serem atualizados % serve também para estabelecer que o vetor solução é do tipo coluna x(n)=a_ampliada(n,nb)/a_ampliada(n,n); for l=n-1:-1:1 for g =((l+1):n) x(l)=(a_ampliada(l,nb))/(a_ampliada(l,l))-((a_ampliada(l,l+1:n))*x(l+1:n))/((a_ampliada(l,l))); end MÉTODOS ITERATIVOS Os métodos iterativos ou métodos aproximados constituem um caminho alternativo aos métodos de eliminação. Sistemas lineares – Gauss Seidel É o método iterativo mais comumente usado para resolver equações algébricas lineares. Assuma que foi fornecido um conjunto de n equações na forma: A x b Para entender melhor esse método, limitaremos o sistema a 3 x 3: MÉTODOS ITERATIVOS a11x1 a12 x 2 a13 x 3 b1 a 21x1 a 22 x 2 a 23 x 3 b 2 a x a x a x b 3 31 1 32 2 33 3 Se os elementos da diagonal são todos não nulos, a primeira equação pode ser resolvida para x1, a segunda equação para x2, e a terceira para x3. j1 j1 b a x a x 13 3 x1j 1 12 2 a11 j j1 b a x a x x 2j 2 21 1 23 3 a 22 j j b a x a x x 3j 3 31 1 32 2 a 33 MÉTODOS ITERATIVOS Em que j e j-1 são iteração atual e a anterior respectivamente. Para começar o processo uma estimativa “chute” inicial deve dado para o valor das variáveis. Uma aproximação simples é considerar que todos valores são nulos. Para a convergência é necessário que: x ij x ij1 Exemplo prático: Use o método de Gauss Seidel para obter a solução do seguinte sistema: MÉTODOS ITERATIVOS 3x1 0.1x 2 0.2x 3 7,85 0,1x1 7x 2 0,3x 3 19,3 0,3x 0, 2x 10x 71, 4 1 2 3 A solução para o sistema é:[3 -2.5 7] Solução: Inicialmente deve-se resolver cada equação para variável da diagonal principal. 7,85 0.1x 2 0.2x 3 x1 3 19,3 0,1x1 0,3x 3 x2 7 71, 4 0,3x1 0, 2x 2 x3 10 MÉTODOS ITERATIVOS Assumindo x2 e x3 iguais a zero e substituindo na primeira equação para calcular a variável x1 . 7,85 0.1x 2 0.2x 3 7,85 0,1 (0) 0, 2 (0) x1 3 3 O valor acima juntamente com o valor definido para x3, encontra-se a variável x2. 19,3 0,1x1 0,3x 3 19,3 0,1 (2,616667) 0,3 (0) x2 7 7 x 2 2,794524 A primeira iteração é finalizada substituindo os valores x1 e x2 para o cálculo de x3. O slide seguinte mostra o cálculo. MÉTODOS ITERATIVOS O valor da variável x3 pode ser calculado da seguinte forma: 71, 4 0,3x1 0, 2x 2 x3 10 71, 4 0,3 2,616667 0, 2 2,794524 x3 10 x 3 7,005610 Para a segunda iteração, tem-se que: 7,85 0.1x 2 0.2x 3 x1 3 7,85 0,1 (2,794524) 0, 2 (7,005610) x1 3 x1 2,990557 MÉTODOS ITERATIVOS Para a segunda iteração, tem-se que: 7,85 0.1x 2 0.2x 3 x1 3 7,85 0,1 (2,794524) 0, 2 (7,005610) x1 3 x1 2,990557 O valor da variável x2 na segunda iteração: 19,3 0,1x1 0,3x 3 x2 7 19,3 0,1 (2,990557) 0,3 (7,005610) x2 7 x 2 2, 499625 MÉTODOS ITERATIVOS O valor da variável x3 na segunda iteração: 71, 4 0,3x1 0, 2x 2 x3 10 71, 4 0,3 2,990557 0, 2 2, 499625 x3 10 x 3 7,000291 OBS: A CADA NOVO VALOR DE “x” CALCULADO PELO MÉTODO DE GAUSS-SEIDEL É IMEDIATAMENTE USADO NA PRÓXIMA EQUAÇÃO PARA ENCONTRAR O OUTRO VALOR DE “x”. MÉTODOS ITERATIVOS function x = gseidel(a,b,es,maxit) % x=gseidel(a,b) % a- matriz dos coefientes % b- matriz dos termos independentes % es - critério de parada % maxit - máxima quantidade de iterações % x - vetor com a solução do sistema de equações % error - função matlab que mostra %uma mensagem de erro e cancela a função % nargin - número de argumentos de %entrada de uma determinada função. MÉTODOS ITERATIVOS %BIBLIOTECA DE FUNÇÕES DO MATLAB COM AS RESPECTIVAS APLICAÇÕES % error - função matlab que mostra uma mensagem de erro e cancela a função % nargin - número de argumentos de entrada de uma determinada função. O % nargin retorna o número de argumentos de entrada que foi usado para % chamar a função. % nargout - retorna o número de argumentos de saída da função. % isempty - isemty(y) retorna 1 se y é um array sem elemento e 0 caso % contrário if nargin<2 error('pelo menos dois argumentos de entrada são necessários') end if nargin <4 || isempty(maxit) maxit=50; end if nargin<3 ||isempty(es) es = 0.00001; end MÉTODOS ITERATIVOS [m,n]=size(a); if m~=n error('a matriz deve ser quadrada') end c=a; % x=xp; for i =1:n c(i,i)=0; x(i)=0; end x=x'; for i=1:n d(i)=b(i)/a(i,i); end for i=1:n c(i,1:n)=c(i,1:n)/a(i,i); end iter = 0; ea=1; % format long while ea>=es xvelho=x; for i=1:n x(i)=d(i)-c(i,:)*x; if x(i)~=0 ea(i)=abs(x(i)-xvelho(i)); end iter=iter+1; end x end MÉTODOS ITERATIVOS MÉTODO DE NEWTON-RAPHSON A expansão em série de Taylor de primeira ordem é dada por: f x i1 f x i (x i1 x i )f ' (x i ) Estimativa inicial x i1 x i Equivale ao ponto em que ocorre a intersecção com eixo x. Nesse ponto f(xi+1) = 0. f xi f ' (x i ) A equação acima corresponde ao método de Newton Raphson para apenas uma equação. MÉTODO DE NEWTON-RAPHSON f1 f1 (x1 , x 2 ) f1 (x1k , x 2k ) (x1 x1k ) x1 (x ,x ) 1k f1 x 2 (x 2 x 2k ) 0 (x1k ,x 2 k ) f 2 (x1 , x 2 ) f 2 (x1k , x 2k ) f 2 x 2 2k f 2 x1 (x 2 x 2k ) 0 (x1k ,x 2 k ) (x1 x1k ) (x1k ,x 2 k ) MÉTODO DE NEWTON-RAPHSON Na forma vetorial as equações ficam da seguinte maneira: f1 f1 (x1 , x 2 ) f1 (x1k , x 2k ) x1 f (x , x ) f (x , x ) f 2 1 2 2 1k 2k 2 x 1 f1 x 2 f 2 x 2 ( x (x1 x1k ) (x 2 x 2k ) 1k ,x 2 k ) 0 0 Podemos resolver a equação acima para (x1, x2). f1 x1,k 1 x1k x1 x x 2,k 1 2k f 2 x 1 f1 x 2 f 2 x 2 1 f1 (x1k , x 2k ) f (x , x ) 2 1k 2k (x1k ,x 2 k ) MÉTODO DE NEWTON-RAPHSON A seguir a notação resumida: x k1 x k J K f x k 1 Em que J é a matriz jacobiana das funções do sistema de equações algébricas. Podemos também fazer as seguintes considerações sobre o método de Newton. Considere a solução de uma equação de uma única variável dada por: f (x) c MÉTODO DE NEWTON-RAPHSON o Se xo é a estimativa inicial da solução e x é um pequeno desvio da solução correta, então: f (x o x o ) c Expandindo o lado esquerdo da equação por série de Taylor, tem-se que: 2 df 1 d f (0) (0) (0) 2 f (x ) x 2 x 2! dx dx c Assumindo um erro muito pequeno x (0) resulta que: df (0) c dx Em que: (0) x (0) c(0) c f x (0) MÉTODO DE NEWTON-RAPHSON O algoritmo de Newton Raphson é então colocado abaixo: c(k ) c f x (k ) x (k ) c(k ) df dx (k ) x (k 1) x (k ) x (k ) Para ilustrar a aplicação do método de Newton-Raphson, o seguinte exemplo será utilizado: f x x 3 6x 2 9x 4 MÉTODO DE NEWTON-RAPHSON Inicialmente calcula-se a derivada da função: f x x 3 6x 2 9x 4 df 3x 2 12x 9 dx c(0) c f x (k ) c(0) 0 63 6(6) 2 9(6) 4 50 0 2 df 3 6 12 6 9 45 dx x (0) c(0) 50 1,1111 0 45 df dx MÉTODO DE NEWTON-RAPHSON O resultado no final da primeira iteração é: x (1) x (0) x (0) x (1) 6 1,1111 4,8889 As iterações subsequentes resultam em: 13, 4431 (2) (1) (1) x x x 4,8889 4, 2789 22,037 2,9981 x (3) x (2) x (2) 4, 2789 4,0405 12,5797 0,3748 x (4) x (3) x (3) 4,0405 4,0011 9, 4914 0,0095 (5) (4) (4) x x x 4,0011 4,000 9,0126 MÉTODO DE NEWTON-RAPHSON Agora considere o problema que envolve uma quantidade maior de variáveis: f1 (x1 , x 2 , x n ) c1 f (x , x , x ) c n 2 2 1 2 f (x , x , x ) c n n n 1 2 MÉTODO DE NEWTON-RAPHSON Aplicando série de Taylor e desprezando os termos de ordem elevada resulta em: (0) 1 f1 (0) f1 (0) x 1 x 2 x1 x 2 f1 x n (0) x n c1 (0) n f n (0) f n (0) x 1 x 2 x1 x 2 f n x n (0) x n c n f f Colocando na forma matricial: MÉTODO DE NEWTON-RAPHSON Colocando na forma matricial: f (0) f (0) 1 1 x x 2 c1 f 10 (x) 1 c f 0 (x) (0) (0) n n f n f n x x 2 1 f1 (0) x n x 1 (0) (0) f n x n x n (0) Numa forma mais compacta, a notação seguinte torna-se mais apropriada. C (k ) J (k ) x (k ) MÉTODO DE NEWTON-RAPHSON Colocando na forma matricial: C (k ) J (k ) x J (k ) x 1(k ) (k ) C (k ) A atualização das variáveis é feita da seguinte maneira: x k 1 x x k (k ) MÉTODO DE NEWTON-RAPHSON Em que: x (k ) C (k ) x1(k ) (k ) x 2 (k ) x n f (k ) 1 x1 J (k ) (k ) (k ) f n c1 f1 x (k ) 1 c2 f 2 c f (k ) n n J (k ) - MATRIZ JACOBIANA f1 x 2 (k ) f n x 2 (k ) f1 x n (k ) f n x n (k ) MÉTODO DE NEWTON-RAPHSON Exemplo de aplicação do método de Newton-Raphson 1) Encontre a solução do seguinte sistema de equações x12 x 22 4 e x1 x 2 1 Passo 1: Construção da matriz jacobiana 2x1 j x1 e 2x 2 1 Passo 2: Preparar o algoritmo MÉTODO DE NEWTON-RAPHSON Exemplo de aplicação do método de Newton-Raphson deltax=1; % incremento da variável é ajustado em um valor alto x=input('Entre com a estimativa inicial -> '); iter = 0; disp(' iter deltac j deltax x') while abs(deltax)>0.0001 & iter<100 iter=iter+1; deltac=0-(x^3-6*x^2+9*x-4); j=3*x^2-12*x+9; deltax=deltac/j; x=x+deltax; % fprintf('%g', iter) disp([iter , deltac, j, deltax, x]) end MÉTODO DE NEWTON-RAPHSON Exemplo de aplicação do método de Newton-Raphson iter = 0; x=input('Entre com a estimativa inicial da solução - vetor coluna x=[x1;x2] - > '); deltax=[1;1]; c=[4;1]; disp('iter deltac jacobiana deltax x') while max(abs(deltax))>=0.0001 & iter<10 iter=iter+1; f=[x(1)^2+x(2)^2; exp(x(1))+x(2)]; deltac=c-f; j=[2*x(1) 2*x(2);exp(x(1)) 1]; deltax=j\deltac; x=x+deltax; fprintf('%g', iter) disp([ deltac, j, deltax, x] MÉTODO DE NEWTON-RAPHSON Exemplo de aplicação do método de Newton-Raphson Atividade: Partindo com valores iniciais x1, x2, x3 resolva o seguinte sistema de equações pelo método de Newton Raphson: x12 x 22 x 32 11 x1x 2 x 22 3x 3 3 x1 x1 x 3 x 2 x 3 6