MATLAB Avan˘cado - mtm.ufsc.brmtm.ufsc.br/~melissa/20112/curso_matlab/aula_03.pdf · Para resolver...
-
Upload
nguyenthuan -
Category
Documents
-
view
215 -
download
0
Transcript of MATLAB Avan˘cado - mtm.ufsc.brmtm.ufsc.br/~melissa/20112/curso_matlab/aula_03.pdf · Para resolver...
MATLAB Avancado
Melissa Weber Mendonca1
1Universidade Federal de Santa Catarina
2011.2
M. Weber Mendonca (UFSC) MATLAB Avancado 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 Mendonca (UFSC) MATLAB Avancado 2011.2 2 / 46
Outros comandos: trimesh, trisurf
As vezes, e mais conveniente mostrarmos os graficos usando umatriangulacao do domınio. Para isto, usamos os comandos trimesh outrisurf junto com o comando delaunay, que cria a triangulacao dodomı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 Mendonca (UFSC) MATLAB Avancado 2011.2 3 / 46
Volumes: slice
Quando temos um grafico de volume, por exemplo, de um solidopreenchido, podemos visualizar secoes bidimensionais deste volume usandoo 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 Mendonca (UFSC) MATLAB Avancado 2011.2 4 / 46
Exemplo
Queremos visualizar o volume definido por
v = xe(−x2−y2−z2)
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 Mendonca (UFSC) MATLAB Avancado 2011.2 5 / 46
Graficos com funcoes anonimas
Suponha que queremos passar uma funcao como argumento para outrafuncao: por exemplo, gostarıamos de usar um comando do tipo
>> plot(x,f(x))
para a funcao f (x) = x2 + 1.Para isso, podemos definir uma funcao anonima usando a seguinte sintaxe:
>> f = @(x) x.^2+1
e, em seguida
>> x = -1:0.1:1
>> plot(x,f(x))
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 6 / 46
Funcoes anonimas
Se quisermos criar uma funcao anonima com mais de uma variavel, 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 Mendonca (UFSC) MATLAB Avancado 2011.2 7 / 46
Resolucao de equacoes lineares enao-lineares em MATLAB
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 8 / 46
Comandos basicos de algebra linear: det
Para calcularmos o determinante de uma matriz quadrada A, usamos ocomando
>> det(A)
Exemplo:
>> A = [1 2 0; 3 1 4; 5 2 1]
>> det(A)
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 9 / 46
Comandos basicos de algebra linear: det
Para calcularmos o determinante de uma matriz quadrada A, usamos ocomando
>> 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 Mendonca (UFSC) MATLAB Avancado 2011.2 9 / 46
Comandos basicos de algebra linear: eig
Para calcularmos os autovalores de (A), usamos
>> eig(A)
Para calcularmos tambem os autovetores, usamos
>> [V,D] = eig(A)
onde V tem os autovetores de A nas colunas, e D e uma diagonal com osautovalores de A.
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 10 / 46
Exemplo
>> eig(eye(n,n))
>> [V,D] = eig(eye(n,n))
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 11 / 46
Exemplo
>> A = [1 2 3;4 5 6;7 8 9];
>> [V,D] = eig(A)
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 11 / 46
Comandos basicos de algebra linear: inv
Para calcularmos a inversa de uma matriz quadrada e inversıvel A, usamoso comando
>> inv(A)
Exemplo:
>> M = [1 4 3;2 1 0;0 0 1];
>> inv(M)
>> inv(M)*M
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 12 / 46
Comandos basicos de algebra linear: inv
Para calcularmos a inversa de uma matriz quadrada e inversıvel A, usamoso comando
>> inv(A)
Exemplo:
>> A = [1 2 3;4 5 6;7 8 9];
>> inv(A)
>> inv(A)*A
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 12 / 46
Resolucao Sistemas Lineares no MATLAB
Aqui, vamos supor que queremos resolver um sistema linear, ou seja, umproblema do tipo
Encontrar x ∈ Rn tal que
Ax = b
com A ∈ Rm×n e b ∈ Rm.
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 13 / 46
Sistemas quadrados: usando inv
Primeiramente, se a matriz A for quadrada e inversıvel, podemos encontrar
x = A−1b.
usando o comando
>> x = inv(A)*b
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 14 / 46
Sistemas quadrados: o operador \
Se, por outro lado, nao for desejavel 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. Senao, a solucao nao e confiavel!
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 15 / 46
Sistemas quadrados: decomposicao LU
Sabemos que a eliminacao gaussiana leva uma matriz A em duas matrizesL e U tais que
A = LU
Assim,
Ax = b ⇔ (LU)x = b ⇔{
Ly = bUx = y
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 16 / 46
Sistemas quadrados: lu
Para encontrarmos a decomposicao 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 Mendonca (UFSC) MATLAB Avancado 2011.2 17 / 46
Sistemas quadrados: linsolve
Se nao quisermos nos preocupar com o algoritmo usado na resolucao dosistema, temos uma outra opcao no comando linsolve.
>> x = linsolve(A,b)
resolve o sistema linear Ax = b usando a fatoracao LU caso a matriz sejaquadrada.
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 18 / 46
Exemplos
Testar a solucao com
inv(A)*b
A\b[L,U] = lu(A); U\(L\b)linsolve(A,b)
1. A =
3 17 102 4 −26 18 −12
, b =
123
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 19 / 46
Exemplos
Testar a solucao com
inv(A)*b
A\b[L,U] = lu(A); U\(L\b)linsolve(A,b)
1. A =
3 17 102 4 −26 18 −12
, b =
123
x =
1.85417−0.354170.14583
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 19 / 46
Exemplos
Testar a solucao com
inv(A)*b
A\b[L,U] = lu(A); U\(L\b)linsolve(A,b)
2. A =
1 4 72 5 82 5 8
, b =
123
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 20 / 46
Exemplos
Testar a solucao com
inv(A)*b
A\b[L,U] = lu(A); U\(L\b)linsolve(A,b)
2. A =
1 4 72 5 82 5 8
, b =
123
x = ??
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 20 / 46
Exemplos
Testar a solucao com
inv(A)*b
A\b[L,U] = lu(A); U\(L\b)linsolve(A,b)
3. A =
(10 11 1
), b =
(11
)
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 21 / 46
Exemplos
Testar a solucao com
inv(A)*b
A\b[L,U] = lu(A); U\(L\b)linsolve(A,b)
3. A =
(10 11 1
), b =
(11
)x =
(01
)
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 21 / 46
Exemplos
Testar a solucao com
inv(A)*b
A\b[L,U] = lu(A); U\(L\b)linsolve(A,b)
4. A =
(1.0001 1
1 1
), b =
(22
)
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 22 / 46
Exemplos
Testar a solucao com
inv(A)*b
A\b[L,U] = lu(A); U\(L\b)linsolve(A,b)
4. A =
(1.0001 1
1 1
), b =
(22
)x =
(02
)
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 22 / 46
Exemplos
Testar a solucao com
inv(A)*b
A\b[L,U] = lu(A); U\(L\b)linsolve(A,b)
4. A =
(1.0001 1
1 1
), b =
(2.0001
2
)
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 22 / 46
Exemplos
Testar a solucao com
inv(A)*b
A\b[L,U] = lu(A); U\(L\b)linsolve(A,b)
4. A =
(1.0001 1
1 1
), b =
(2.0001
2
)x =
(11
)
Este sistema e chamado mal-condicionado: uma mudanca pequena nolado direito muda completamente a solucao.
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 22 / 46
Sistemas retangulares
Para resolver sistemas em que A e m × n mas m 6= n, podemos repetir oscomandos, com algumas ressalvas:
inv(A)*b agora nao funciona!
A−1 nao esta definida para matrizes retangulares.
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 23 / 46
Sistemas retangulares
Para resolver sistemas em que A e m × n mas m 6= n, podemos repetir oscomandos, com algumas ressalvas:
x = A\b e a solucao exata, caso esta exista; senao, e a solucao dosistema em mınimos quadrados.
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 23 / 46
Sistemas retangulares
Para resolver sistemas em que A e m × n mas m 6= n, podemos repetir oscomandos, com algumas ressalvas:
[L,U] = lu(A); U\(L\b) continua funcionando, mas agoraU e do tamanho de A e L e quadrada.
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 23 / 46
Sistemas retangulares
Para resolver sistemas em que A e m × n mas m 6= n, podemos repetir oscomandos, com algumas ressalvas:
linsolve(A,b) resolve o sistema atraves da decomposicao QR de A:
A = QR,
onde Q e ortogonal e quadrada, e R e (quase) triangular superior.
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 23 / 46
Exemplo
Testar a resolucao usando
x = A\b[L,U] = lu(A); U\(L\b)linsolve(A,b) 1 2 0 1
0 1 1 01 2 1 1
x1
x2
x3
x4
=
111
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 24 / 46
Exemplo
Testar a resolucao usando
x = A\b[L,U] = lu(A); U\(L\b)linsolve(A,b) 1 2 0 1
0 1 1 01 2 0 1
x1
x2
x3
x4
=
424
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 25 / 46
Exemplo
Testar a resolucao usando
x = A\b[L,U] = lu(A); U\(L\b)linsolve(A,b) 1 2 0 1
0 1 1 01 2 0 1
x1
x2
x3
x4
=
151
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 26 / 46
Metodos Iterativos para Sistemas Lineares
pcg Gradiente conjugado precondicionado
bicg Gradiente bi-conjugado (gradiente conjugado para matrizesnao necessariamente simetricas)
gmres Generalized minimum residual method (com restarts)
lsqr LSQR (quadrados mınimos)
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 27 / 46
Resolucao de equacoes nao-lineares
Agora, queremos resolver o problema de encontrar x ∈ Rn tal que
F (x) = 0
onde F : Rn → Rm (onde m ou n podem ser iguais a 1).
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 28 / 46
Equacao nao linear a uma variavel: fzero
Aqui, o problema que nos interessa e encontrar uma raiz da equacao
f (x) = 0
onde f : R→ R.Para isto usamos o comando
>> x = fzero(fun,x0)
Mas: quem e fun?E a referencia (function handle) da funcao f !
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 29 / 46
Referencias a funcoes definidas inline
Podemos usar funcoes anonimas para chamar fzero.
Exemplo:
>> quadratica = @(x) x.^2-4;
>> x = fzero(quadratica,6)
ou ainda
>> x = fzero(@(x) x.^2-4,6)
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 30 / 46
Referencias a funcoes definidas em arquivo
Se a funcao para a qual gostarıamos de encontrar uma raiz estiver em umarquivo proprio, no formato
[y] = minhafuncao(x)
comandos
Podemos chamar a funcao fzero a partir do ponto x0, escrevendo
>> x = fzero(@minhafuncao,x0)
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 31 / 46
Exemplo
Encontrar uma das raizes de f (x) = x2 − 4 a partir do ponto x = −6.
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 32 / 46
Exemplo
Encontrar uma das raizes de f (x) = x2 − 4 a partir do ponto x = −6.
>> quadratica = @(x) x.^2-4;
>> fzero(quadratica,-6)
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 32 / 46
Exemplo
Encontrar uma raiz de f (x) = e2x − 3.
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 33 / 46
Exemplo
Encontrar uma raiz de f (x) = e2x − 3.
>> fun = @(x) exp(2*x)-3;
>> fzero(fun,0)
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 33 / 46
Raizes de um polinomio: roots
Para encontrar as raizes de um polinomio de grau n da forma
p(x) = a0 + a1x + a2x2 + . . . + anxn
primeiramente representamos este polinomio como um vetor linha p noMATLAB, cujas componentes sao os coeficientes dos termos em ordemdescendente de grau, ou seja,
>> p = [an an−1 · · · a2 a1 a0]
Em seguida, usamos o comando
>> r = roots(p)
resultando em um vetor coluna r com as raizes deste polinomio.
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 34 / 46
Exemplop(x) = t3 + 2t2 − 5t − 6
>> p = [1 2 -5 -6]
>> roots(p)
Figura: p(x) = t3 + 2t2 − 5t − 6 e suas raizes.
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 35 / 46
Sistema de equacoes nao lineares: fsolve
Para encontrarmos a solucao de um sistema de equacoes nao lineares daforma
F (x) = 0
onde F : Rn → Rm, usamos a funcao fsolve, identicamente a funcaofzero:
>> fsolve(@minhafuncao,x0)
se utilizarmos uma funcao em arquivo, ou
>> fsolve(fun,x0)
se utilizarmos uma funcao anonima.
Observacao: Este comando faz parte da Optimization Toolbox, que podenao estar disponıvel na sua instalacao do MATLAB.
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 36 / 46
Exemplo
Resolver o sistema de equacoes{y1 = 3x2
1 + 4x22 − 16
y2 = 2x21 − 3x2
2 − 5
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 37 / 46
Exemplo
Resolver o sistema de equacoes{y1 = 3x2
1 + 4x22 − 16
y2 = 2x21 − 3x2
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 Mendonca (UFSC) MATLAB Avancado 2011.2 37 / 46
Exemplo
Encontrar a raiz de
F (x) =
[x2
1 + x2x3
sin(x1 + 2x2 − 3x3)
]
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 38 / 46
Exemplo
Encontrar a raiz de
F (x) =
[x2
1 + x2x3
sin(x1 + 2x2 − 3x3)
]>> 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 Mendonca (UFSC) MATLAB Avancado 2011.2 38 / 46
Exemplo
Encontrar a raiz de
F (x) =
[x2
1 + x2x3
sin(x1 + 2x2 − 3x3)
]>> 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 Mendonca (UFSC) MATLAB Avancado 2011.2 38 / 46
Otimizacao: Minimizacao de funcoes
Agora, queremos resolver o problema
minimizar f (x).
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 39 / 46
Minimizacao de uma funcao de varias variaveis:fminsearch
Para encontrarmos o mınimo de uma funcao real de varias variaveis, apartir de um ponto inicial x0, usamos o comando
>> x = fminsearch(@funcao,x0)
Se quisermos tambem saber o valor da funcao no ponto de mınimo,usamos a sintaxe
>> [x,fval] = fminsearch(@funcao,x0)
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 40 / 46
Exemplo
Minimizar a funcao
f = ex1(4x21 + 2x2
2 + 4x1x2 + 2x2 + 1)
a partir do ponto inicial x0 = (0, 0).
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 41 / 46
Exemplo
Minimizar a funcao
f = ex1(4x21 + 2x2
2 + 4x1x2 + 2x2 + 1)
a partir do ponto inicial x0 = (0, 0).
>> 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 Mendonca (UFSC) MATLAB Avancado 2011.2 41 / 46
Exemplo
Minimizarf (x) = 100(x2 − x2
1 )2 + (1− x1)2
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 42 / 46
Exemplo
Minimizarf (x) = 100(x2 − x2
1 )2 + (1− x1)2
>> f = @(x) 100*(x(2)-x(1).^2).^2+(1-x(1)).^2
>> fminsearch(f,[0;0])
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 42 / 46
Minimizacao de uma funcao de uma variavel comrestricoes: fminbnd
Para encontrarmos o mınimo de uma funcao de uma variavel dentro de umintervalo [a, b], usamos o comando
>> x = fminbnd(@funcao,a,b)
Se quisermos tambem saber o valor da funcao no ponto de mınimo,usamos a sintaxe
>> [x,fval] = fminbnd(@funcao,a,b)
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 43 / 46
Exemplo
Minimizar f (x) = x nos intervalos [0, 1] e [−10, 1].
M. Weber Mendonca (UFSC) MATLAB Avancado 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 Mendonca (UFSC) MATLAB Avancado 2011.2 44 / 46
Exemplo
Minimizar f (x) = x2 − 1 no intervalo [1, 3].
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 45 / 46
Exemplo
Minimizar f (x) = x2 − 1 no intervalo [1, 3].
>> f = @(x) x.^2;
>> fminbnd(f,1,3)
M. Weber Mendonca (UFSC) MATLAB Avancado 2011.2 45 / 46