MATLAB Avançado Melissa Weber Mendonça 1 1 Universidade Federal de Santa Catarina 2011.2 M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 1 / 46
Exemplo >> x = -3:0.1:3; >> [x,y] = meshgrid(x); >> z = x.^2+3*y-x.*y.^2 >> h = surf(x,y,z); >> set(h, cdata,rand(size(z))) >> set(h, edgecolor, k ) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 2 / 46
Outros comandos: trimesh, trisurf Às vezes, é mais conveniente mostrarmos os gráficos usando uma triangulação do domínio. Para isto, usamos os comandos trimesh ou trisurf junto com o comando delaunay, que cria a triangulação do domínio: Exemplo: >> [x,y] = meshgrid(-3:0.5:3); >> tri = delaunay(x,y) >> z = x.^2+3*y-x.*y.^2; >> trimesh(tri,x,y,z) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 3 / 46
Volumes: slice Quando temos um gráfico de volume, por exemplo, de um sólido preenchido, podemos visualizar seções bidimensionais deste volume usando o comando >> slice(x,y,z,v,xslice,yslice,zslice) para visualizarmos o volume definido por v = f (x, y, z) na superfície definida por xslice, yslice, zslice. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 4 / 46
Exemplo Queremos visualizar o volume definido por v = xe ( x2 y 2 z 2 ) com 2 x 2, 2 y 2 e 2 z 2. >> [x,y,z] = meshgrid(-2:.2:2); >> v = x.*exp(-x.^2-y.^2-z.^2); >> xslice = [-1.2,.8,2]; >> yslice = 0; >> zslice = []; >> slice(x,y,z,v,xslice,yslice,zslice) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 5 / 46
Gráficos com funções anônimas Suponha que queremos passar uma função como argumento para outra função: por exemplo, gostaríamos de usar um comando do tipo >> plot(x,f(x)) para a função f (x) = x 2 + 1. Para isso, podemos definir uma função anônima usando a seguinte sintaxe: e, em seguida >> f = @(x) x.^2+1 >> x = -1:0.1:1 >> plot(x,f(x)) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 6 / 46
Funções anônimas Se quisermos criar uma função anônima com mais de uma variável, usamos >> f = @(x,y,z,t) x+y+z+t Exemplo: >> x = -3:0.1:3; >> [x,y] = meshgrid(x); >> f = @(x,y) x.^2+3*y-x.*y.^2 >> surf(x,y,f(x,y)); M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 7 / 46
Resolução de equações lineares e não-lineares em MATLAB M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 8 / 46
Comandos básicos de álgebra linear: det Para calcularmos o determinante de uma matriz quadrada A, usamos o comando >> det(a) Exemplo: >> A = [1 2 0; 3 1 4; 5 2 1] >> det(a) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 9 / 46
Comandos básicos de álgebra linear: det Para calcularmos o determinante de uma matriz quadrada A, usamos o comando >> det(a) Exemplo: >> A = [1 2 0; 3 1 4; 5 2 1] >> det(a) >> B = [1 2 3;4 5 6;7 8 9] >> det(b) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 9 / 46
Comandos básicos de álgebra linear: eig Para calcularmos os autovalores de (A), usamos >> eig(a) Para calcularmos também os autovetores, usamos >> [V,D] = eig(a) onde V tem os autovetores de A nas colunas, e D é uma diagonal com os autovalores de A. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 10 / 46
Exemplo >> eig(eye(n,n)) >> [V,D] = eig(eye(n,n)) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 11 / 46
Exemplo >> A = [1 2 3;4 5 6;7 8 9]; >> [V,D] = eig(a) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 11 / 46
Comandos básicos de álgebra linear: inv Para calcularmos a inversa de uma matriz quadrada e inversível A, usamos o comando >> inv(a) Exemplo: >> M = [1 4 3;2 1 0;0 0 1]; >> inv(m) >> inv(m)*m M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 12 / 46
Comandos básicos de álgebra linear: inv Para calcularmos a inversa de uma matriz quadrada e inversível A, usamos o comando >> inv(a) Exemplo: >> A = [1 2 3;4 5 6;7 8 9]; >> inv(a) >> inv(a)*a M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 12 / 46
Resolução Sistemas Lineares no MATLAB Aqui, vamos supor que queremos resolver um sistema linear, ou seja, um problema do tipo Encontrar x R n tal que Ax = b com A R m n e b R m. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 13 / 46
Sistemas quadrados: usando inv Primeiramente, se a matriz A for quadrada e inversível, podemos encontrar x = A 1 b. usando o comando >> x = inv(a)*b M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 14 / 46
Sistemas quadrados: o operador \ Se, por outro lado, não for desejável encontrar a inversa da matriz A, podemos usar o operador \ para resolver Ax = b: >> x = A\b Se A for inversível, x = inv(a)*b. Senão, a solução não é confiável! M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 15 / 46
Sistemas quadrados: decomposição LU Sabemos que a eliminação gaussiana leva uma matriz A em duas matrizes L e U tais que A = LU Assim, Ax = b (LU)x = b { Ly = b Ux = y M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 16 / 46
Sistemas quadrados: lu Para encontrarmos a decomposição LU de uma matriz A no MATLAB, usamos o comando >> [L,U] = lu(a) Podemos em seguida resolver o sistema Ax = b fazendo >> y = L\b >> x = U\y M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 17 / 46
Sistemas quadrados: linsolve Se não quisermos nos preocupar com o algoritmo usado na resolução do sistema, temos uma outra opção no comando linsolve. >> x = linsolve(a,b) resolve o sistema linear Ax = b usando a fatoração LU caso a matriz seja quadrada. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 18 / 46
Exemplos Testar a solução com inv(a)*b A\b [L,U] = lu(a); U\(L\b) linsolve(a,b) 3 17 10 1 1. A = 2 4 2, b = 2 6 18 12 3 M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 19 / 46
Exemplos Testar a solução com inv(a)*b A\b [L,U] = lu(a); U\(L\b) linsolve(a,b) 3 17 10 1 1.85417 1. A = 2 4 2, b = 2 x = 0.35417 6 18 12 3 0.14583 M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 19 / 46
Exemplos Testar a solução com inv(a)*b A\b [L,U] = lu(a); U\(L\b) linsolve(a,b) 1 4 7 1 2. A = 2 5 8, b = 2 2 5 8 3 M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 20 / 46
Exemplos Testar a solução com inv(a)*b A\b [L,U] = lu(a); U\(L\b) linsolve(a,b) 1 4 7 1 2. A = 2 5 8, b = 2 x =?? 2 5 8 3 M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 20 / 46
Exemplos Testar a solução com inv(a)*b A\b [L,U] = lu(a); U\(L\b) linsolve(a,b) 3. A = ( ) 10 1, b = 1 1 ( ) 1 1 M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 21 / 46
Exemplos Testar a solução com inv(a)*b A\b [L,U] = lu(a); U\(L\b) linsolve(a,b) 3. A = ( ) 10 1, b = 1 1 ( ) 1 1 x = ( ) 0 1 M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 21 / 46
Exemplos Testar a solução com inv(a)*b A\b [L,U] = lu(a); U\(L\b) linsolve(a,b) 4. A = ( ) 1.0001 1, b = 1 1 ( ) 2 2 M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 22 / 46
Exemplos Testar a solução com inv(a)*b A\b [L,U] = lu(a); U\(L\b) linsolve(a,b) 4. A = ( ) 1.0001 1, b = 1 1 ( ) 2 2 x = ( ) 0 2 M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 22 / 46
Exemplos Testar a solução com inv(a)*b A\b [L,U] = lu(a); U\(L\b) linsolve(a,b) 4. A = ( ) 1.0001 1, b = 1 1 ( ) 2.0001 2 M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 22 / 46
Exemplos Testar a solução com inv(a)*b A\b [L,U] = lu(a); U\(L\b) linsolve(a,b) 4. A = ( ) 1.0001 1, b = 1 1 ( ) 2.0001 2 x = ( ) 1 1 Este sistema é chamado mal-condicionado: uma mudança pequena no lado direito muda completamente a solução. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 22 / 46
Sistemas retangulares Para resolver sistemas em que A é m n mas m n, podemos repetir os comandos, com algumas ressalvas: inv(a)*b agora não funciona! A 1 não está definida para matrizes retangulares. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 23 / 46
Sistemas retangulares Para resolver sistemas em que A é m n mas m n, podemos repetir os comandos, com algumas ressalvas: x = A\b é a solução exata, caso esta exista; senão, é a solução do sistema em mínimos quadrados. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 23 / 46
Sistemas retangulares Para resolver sistemas em que A é m n mas m n, podemos repetir os comandos, com algumas ressalvas: [L,U] = lu(a); U\(L\b) continua funcionando, mas agora U é do tamanho de A e L é quadrada. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 23 / 46
Sistemas retangulares Para resolver sistemas em que A é m n mas m n, podemos repetir os comandos, com algumas ressalvas: linsolve(a,b) resolve o sistema através da decomposição QR de A: A = QR, onde Q é ortogonal e quadrada, e R é (quase) triangular superior. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 23 / 46
Exemplo Testar a resolução usando x = A\b [L,U] = lu(a); U\(L\b) linsolve(a,b) x 1 2 0 1 1 0 1 1 0 x 2 1 x 1 2 1 1 3 = 1 1 x 4 M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 24 / 46
Exemplo Testar a resolução usando x = A\b [L,U] = lu(a); U\(L\b) linsolve(a,b) x 1 2 0 1 1 0 1 1 0 x 2 4 x 1 2 0 1 3 = 2 4 x 4 M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 25 / 46
Exemplo Testar a resolução usando x = A\b [L,U] = lu(a); U\(L\b) linsolve(a,b) x 1 2 0 1 1 0 1 1 0 x 2 1 x 1 2 0 1 3 = 5 1 x 4 M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 26 / 46
Métodos Iterativos para Sistemas Lineares pcg Gradiente conjugado precondicionado bicg Gradiente bi-conjugado (gradiente conjugado para matrizes não necessariamente simétricas) gmres Generalized minimum residual method (com restarts) lsqr LSQR (quadrados mínimos) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 27 / 46
Resolução de equações não-lineares Agora, queremos resolver o problema de encontrar x R n tal que F (x) = 0 onde F : R n R m (onde m ou n podem ser iguais a 1). M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 28 / 46
Equação não linear a uma variável: fzero Aqui, o problema que nos interessa é encontrar uma raiz da equação onde f : R R. Para isto usamos o comando f (x) = 0 >> x = fzero(fun,x0) Mas: quem é fun? É a referência (function handle) da função f! M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 29 / 46
Referências a funções definidas inline Podemos usar funções anônimas para chamar fzero. Exemplo: ou ainda >> quadratica = @(x) x.^2-4; >> x = fzero(quadratica,6) >> x = fzero(@(x) x.^2-4,6) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 30 / 46
Referências a funções definidas em arquivo Se a função para a qual gostaríamos de encontrar uma raiz estiver em um arquivo próprio, no formato [y] = minhafuncao(x) comandos Podemos chamar a função fzero a partir do ponto x0, escrevendo >> x = fzero(@minhafuncao,x0) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 31 / 46
Exemplo Encontrar uma das raizes de f (x) = x 2 4 a partir do ponto x = 6. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 32 / 46
Exemplo Encontrar uma das raizes de f (x) = x 2 4 a partir do ponto x = 6. >> quadratica = @(x) x.^2-4; >> fzero(quadratica,-6) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 32 / 46
Exemplo Encontrar uma raiz de f (x) = e 2x 3. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 33 / 46
Exemplo Encontrar uma raiz de f (x) = e 2x 3. >> fun = @(x) exp(2*x)-3; >> fzero(fun,0) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 33 / 46
Raizes de um polinômio: roots Para encontrar as raizes de um polinômio de grau n da forma p(x) = a 0 + a 1 x + a 2 x 2 +... + a n x n primeiramente representamos este polinômio como um vetor linha p no MATLAB, cujas componentes são os coeficientes dos termos em ordem descendente de grau, ou seja, Em seguida, usamos o comando >> p = [a n a n 1 a 2 a 1 a 0 ] >> r = roots(p) resultando em um vetor coluna r com as raizes deste polinômio. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 34 / 46
Exemplo p(x) = t 3 + 2t 2 5t 6 >> p = [1 2-5 -6] >> roots(p) Figura: p(x) = t 3 + 2t 2 5t 6 e suas raizes. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 35 / 46
Sistema de equações não lineares: fsolve Para encontrarmos a solução de um sistema de equações não lineares da forma F (x) = 0 onde F : R n R m, usamos a função fsolve, identicamente à função fzero: >> fsolve(@minhafuncao,x0) se utilizarmos uma função em arquivo, ou se utilizarmos uma função anônima. >> fsolve(fun,x0) Observação: Este comando faz parte da Optimization Toolbox, que pode não estar disponível na sua instalação do MATLAB. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 36 / 46
Exemplo Resolver o sistema de equações { y1 = 3x 2 1 + 4x 2 2 16 y 2 = 2x 2 1 3x 2 2 5 M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 37 / 46
Exemplo Resolver o sistema de equações { y1 = 3x 2 1 + 4x 2 2 16 y 2 = 2x 2 1 3x 2 2 5 >> fun = @(x) [3*x(1).^2+4*x(2).^2-16; 2*x(1).^2-3*x(2).^2-5]; >> fsolve(fun,[1;1]) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 37 / 46
Exemplo Encontrar a raiz de [ x F (x) = 1 2 + x ] 2x 3 sin(x 1 + 2x 2 3x 3 ) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 38 / 46
Exemplo Encontrar a raiz de [ x F (x) = 1 2 + x ] 2x 3 sin(x 1 + 2x 2 3x 3 ) >> fun = @(x) [x(1).^2+x(2).*x(3); sin(x(1)+2*x(2)-3*x(3))]; >> fsolve(fun,[1;1;1]) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 38 / 46
Exemplo Encontrar a raiz de [ x F (x) = 1 2 + x ] 2x 3 sin(x 1 + 2x 2 3x 3 ) >> fun = @(x) [x(1).^2+x(2).*x(3); sin(x(1)+2*x(2)-3*x(3))]; >> fsolve(fun,[1;1;1]) >> fsolve(fun,[0;0;0]) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 38 / 46
Otimização: Minimização de funções Agora, queremos resolver o problema minimizar f (x). M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 39 / 46
Minimização de uma função de várias variáveis: fminsearch Para encontrarmos o mínimo de uma função real de várias variáveis, a partir de um ponto inicial x0, usamos o comando >> x = fminsearch(@funcao,x0) Se quisermos também saber o valor da função no ponto de mínimo, usamos a sintaxe >> [x,fval] = fminsearch(@funcao,x0) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 40 / 46
Exemplo Minimizar a função a partir do ponto inicial x 0 = (0, 0). f = e x 1 (4x 2 1 + 2x 2 2 + 4x 1 x 2 + 2x 2 + 1) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 41 / 46
Exemplo Minimizar a função a partir do ponto inicial x 0 = (0, 0). f = e x 1 (4x 2 1 + 2x 2 2 + 4x 1 x 2 + 2x 2 + 1) >> f=@(x)exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1); >> fminsearch(f,[0;0]) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 41 / 46
Exemplo Minimizar f (x) = 100(x 2 x 2 1 ) 2 + (1 x 1 ) 2 M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 42 / 46
Exemplo Minimizar f (x) = 100(x 2 x 2 1 ) 2 + (1 x 1 ) 2 >> f = @(x) 100*(x(2)-x(1).^2).^2+(1-x(1)).^2 >> fminsearch(f,[0;0]) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 42 / 46
Minimização de uma função de uma variável com restrições: fminbnd Para encontrarmos o mínimo de uma função de uma variável dentro de um intervalo [a, b], usamos o comando >> x = fminbnd(@funcao,a,b) Se quisermos também saber o valor da função no ponto de mínimo, usamos a sintaxe >> [x,fval] = fminbnd(@funcao,a,b) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 43 / 46
Exemplo Minimizar f (x) = x nos intervalos [0, 1] e [ 10, 1]. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 44 / 46
Exemplo Minimizar f (x) = x nos intervalos [0, 1] e [ 10, 1]. >> f = @(x) x; >> fminbnd(f,0,1) >> fminbnd(f,-10,1) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 44 / 46
Exemplo Minimizar f (x) = x 2 1 no intervalo [1, 3]. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 45 / 46
Exemplo Minimizar f (x) = x 2 1 no intervalo [1, 3]. >> f = @(x) x.^2; >> fminbnd(f,1,3) M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 45 / 46
interp1, interp2, interp3 e interpn Para interpolarmos um conjunto de pontos em 1D, 2D, 3D ou em N dimensões, usamos os comandos interp1 interp2 interp3 interpn respectivamente. M. Weber Mendonça (UFSC) MATLAB Avançado 2011.2 46 / 46