Escolar Documentos
Profissional Documentos
Cultura Documentos
Prefácio
3
4
Conteúdo
1 Introdução 7
1.1 Considerações Gerais . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1.1 Aritmética Básica . . . . . . . . . . . . . . . . . . . . . . 9
1.1.2 Funções Matemáticas Elementares . . . . . . . . . . . . . 10
1.1.3 Formatos e Limites de Utilização . . . . . . . . . . . . . 10
2 Vectores e Matrizes 13
2.1 Definições e Atribuições Básicas . . . . . . . . . . . . . . . . . . 13
2.2 Casos Especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3 Chamadas de Subvectores e Submatrizes . . . . . . . . . . . . . . 17
2.4 Operações Elementares . . . . . . . . . . . . . . . . . . . . . . . 18
2.4.1 Adição e Subtração . . . . . . . . . . . . . . . . . . . . . 18
2.4.2 Multiplicação Vectorial . . . . . . . . . . . . . . . . . . . 18
2.4.3 Potenciação Matricial . . . . . . . . . . . . . . . . . . . . 19
2.4.4 Operações Elemento a Elemento . . . . . . . . . . . . . . 20
2.4.5 Comandos Específicos . . . . . . . . . . . . . . . . . . . 22
3 Gráficos 23
3.1 Gráficos 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.1 O Comando plot . . . . . . . . . . . . . . . . . . . . . . 24
3.1.2 O Comando scatter . . . . . . . . . . . . . . . . . . . . . 27
3.1.3 Os Comandos semilogx, semilogy e loglog . . . . . . . . . 28
3.1.4 O Comando subplot . . . . . . . . . . . . . . . . . . . . 28
3.1.5 Os comando ezplot e fplot . . . . . . . . . . . . . . . . . 29
3.1.6 Outros gráficos . . . . . . . . . . . . . . . . . . . . . . . 32
3.2 Outros comandos . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2.1 O comando figure . . . . . . . . . . . . . . . . . . . . . . 33
3.2.2 O comando hold . . . . . . . . . . . . . . . . . . . . . . 33
3.2.3 O comando grid . . . . . . . . . . . . . . . . . . . . . . . 33
3.2.4 O comando ginput . . . . . . . . . . . . . . . . . . . . . 34
3.2.5 Legendas, eixos e labels . . . . . . . . . . . . . . . . . . 34
5
6 CONTEÚDO
5 O Help do MatLab 53
Introdução
Além destas três janelas, vale a pena referir ainda mais dois items
1 Se tal não acontecer, faça View > Desktop Layout > Default
7
8 CAPÍTULO 1. INTRODUÇÃO
>>quit
>>diary anum01
Operaçäo Símbolo
Soma +
Subtracção
Multiplicação ∗
Divisão �
Potenciação ∧
>>x=6/3
>>x=
2
>>y=6\3
>>y=
0.5
Além disso o operador \ tem também interesse nas operações com matrizes, como
será referido quando se falar de sistemas de equações lineares.
2 Para mais informações digite na janela de comando:
»helpmatlab/ops
10 CAPÍTULO 1. INTRODUÇÃO
Função Operador
Seno sin
Coseno cos
Tangente tan
Secante sec
Exponencial exp
ln log
log10 log10
Valor absoluto abs
Exemplo 1.3 Para calcular o valor da expressão | sin(eπ )|, basta executar o co
mando:
>>k=abs(sin(exp(pi)))
>>k=0.9126
»helpmatlab/elmat ou
»help specfun
4 Para mais informações digite na janela de comando:
»help format
1.1. CONSIDERAÇÕES GERAIS 11
>>format long
o que faz com que a partir desse momento todos os resultados sejam apresenta
dos com 15 dígitos. Pedindo agora o valor de k, (a variável definida no exemplo
anterior),
>>k
obtémse,
k=
0.91257759866928
>>realmax
ans=
1.797693134862316e+308
acima deste número real, o MatLab entra em overflow devolvendo o resultado inf.
Por outro lado, o menor número representável neste sistema antes de entrar em
underflow, é o
>>realmin
ans=
2.225073858507201e308
>>eps
ans=
2.220446049250313e016
Vectores e Matrizes
Uma das vantagens deste software é o facto de ser uma linguagem vectorial.
Isto significa que, por defeito, todas as variáveis definidas são entendidas como
sendo vectores (ou matrizes). Como tal deverá o novo utilizador relembrar alguns
conceitos de álgebra linear, não perdendo nunca de vista o facto acima referido.
Comecese então por referir alguns procedimentos básicos.
Exemplo 2.1 Para criar um vector linha,vl, formado pelos números 1,2,4 e 7 basta
fazer:
>>vl=[1,2,4,7]
ou
>>vl=[1 2 4 7]
Exemplo 2.2 Para criar um vector coluna,vc, formado pelos números 1,2,4 e 7
basta fazer:
13
14 CAPÍTULO 2. VECTORES E MATRIZES
>>vc=[1;2;4;7]
ou
>>vl=[1
2
4
7]
basta fazer:
>>vl=[1,2,4,7;3,11,12,13;5,9,10,14;8,15,16,18]
• Por fim, para colocar na segunda coluna da tabela, o valor da raiz quadrada
do elemento correspondente da primeira coluna, basta fazer
TabelaRaiz(:,2)=sqrt(TabelaRaiz(:,1));
aonde sqrt é o comando que corresponde à função raiz quadrada.
O vector assim definido tem como último elemento o valor de b, caso o espaça
mento h permita, começando em a, terminar exactamente em b. Caso contrário, o
último elemento do vector é último elemento da sucessão a,a+h,a+2h,... imediata
mente antes de b.
>>tempo=1:0.2:2
dá origem a,
>>tempo=
1 1.2 1.4 1.6 1.8 2
>>tempo=1:0.3:2
16 CAPÍTULO 2. VECTORES E MATRIZES
dá origem a,
>>tempo=
1 1.3 1.6 1.9
Notese que este comando substitui o habitual ciclo for, para este tipo de casos.
Embora este ciclo esteja também disponível em MatLab, deve ser substituído por
este comando sempre que possível, pois é bastante mais eficiente.
Da mesma forma também é possível utilizar esta sintaxe para criar vectores com
estruturas especiais, como podemos ver no exemplo seguinte.
>>p(1)=1;2
>>p(9)=1;
>>p(2:2:8)=4;
>>p(3:2:7)=2
dá origem a,
>>p=
1 4 2 4 2 4 2 4 1
Outro caso particular na criação de vectores com utilização frequente é o que cor
responde à instrução linspace. Esta instrução, que permite criar um vector com n
elementos igualmente espaçados, tem a sintaxe:
nomedavariavel=linspace(a,b,n)
onde:
>>ls=linspace(1,2,5)
2 Neste exemplo foram introduzidas informalmente duas noções que são importantes:
Primeiro, os indices dos vectores (e matrizes) em MatLab começam em 1 (por exemplo, o primeiro
elemento de um vector x é o elemento x(1)). Segundo, caso não seja necessário visualizar imediata
mente o resultado de uma instrução, podese omitilo (na janela de comando) colocando um ; no
final da instrução.
2.3. CHAMADAS DE SUBVECTORES E SUBMATRIZES 17
dá origem a,
>>ls=
1 1.25 1.5 1.75 2
>>ls(2)
dá origem a,
>>ans=
1.25
Em matrizes tudo se passa de forma semelhante: O comando A(i,j) chama o ele
mento da iésima linha, jésima coluna da matriz A.
Exemplo 2.11 Relembrando a matriz B atrás definida,
>>B(2,3)
>>ans=
9
Podemse também chamar vários elementos ao mesmo tempo através de uma con
jugação dos comandos vistos anteriormente.
Exemplo 2.12 Para criar uma matriz C, composta pelos elementos da matriz A
que estão na primeira e segunda linha e na terceira e quarta coluna, basta fazer
>>C=A(1:2,3:4)
>>C=
4 7
12 13
Outro facto que merece aqui uma referência, é a chamada e extracção de vectores a
partir de matrizes. Assim, para criar um novo vector a partir de uma linha (ou col
una) de uma matriz basta utilizar o comando ’:’ Este comando quando executado
na chamada de uma matriz, significa que se estão a chamar todas as linhas e/ou
colunas dessa matriz.
18 CAPÍTULO 2. VECTORES E MATRIZES
Exemplo 2.13 Criar uma matriz D, constituída pelos elementos de todas as linhas
da matriz A e das terceira e quarta colunas.
>>D=A(:,3:4)
>>D=
4 7
12 13
10 14
16 18
>>y=4:2:10;
>>z=x+y
>>z=
5 6 11 17
>>t=[3,4];
>>v=x+t
>>v=
???Error using=⇒ +
Matrix dimension must agree.
Como resultado dessa multiplicação obtémse uma matriz com o número de linhas
da primeira parcela e o número de colunas da segunda.
>>B=[4,1;1,2;0,4];
>>C=A*B
>>C=
4 13
0 16
5 15
>>D=B*A
>>D=
???Error using=⇒ *
Inner matrix dimension must agree.
>>A^2
>>ans=
4 3 12
4 4 12
4 3 16
>>B^2
>>B=
???Error using=⇒ ∧
Matrix must be square.
>>x*y
>>ans=
???Error using=⇒*
Inner matrix dimension must agree.
>>x.*y
>>ans=
4 0 24 70
>>x./y
>>ans=
0.25 0 0.375 0.70
>>A^2
>>ans=
4 3 12
4 4 12
4 3 16
>>A.^2
>>ans=
1 0 9
0 0 16
1 1 9
2.4. OPERAÇÕES ELEMENTARES 21
>>B^2
???Error using=⇒ ∧
Matrix must be square.
>>B.^2
>>ans=
16 1
1 4
0 16
1. A*B
2. B*A
3. A*x
4. A*y
5. x*A
6. y*A
7. x*A*y
8. yT *A*y
9. x*y
10. xT *y
11. A2
22 CAPÍTULO 2. VECTORES E MATRIZES
12. B3
13. x2
14. x*A2 *y
Operador Descrição
sum(x) Soma de todos os elementos do vector x
prod(x) Produto de todos os elementos do vector x
max(x) Devolve o maior elemento do vector x
min(x) Devolve o menor elemento do vector x
sort(x) Ordena por ordem crescente todos os elementos do vector x
norm(x) Devolve o valor da norma (2) de x.
det(A) Devolve o valor do determinante de A
eig(A) Devolve os valores próprios de A
»help/elfun
Capítulo 3
Gráficos
>>x=(0:0.1:2*pi);
23
24 CAPÍTULO 3. GRÁFICOS
Símbolo Marcador
. ponto
o circulo
Simbolo Côr x cruz
b azul * asterisco Símbolo Tipo de Linha
g verde s quadrado
contínua
r vermelho d losângulo
: pontos
c ciano v triângulo
. traçoponto
m magenta � triângulo
tracejada
y amarelo v triângulo
k preto < triângulo
> triângulo
p pentágono
h hexágono
>>y=exp(x).*abs(cos(x));
>>z=exp(x).*sin(x);
450
400
350
300
250
200
150
100
50
0
0 1 2 3 4 5 6 7
500
450
400
350
300
250
200
150
100
50
0
0 1 2 3 4 5 6 7
Reparese na diferença entre as figuras 3.1 e 3.3 ao nível do eixo dos xx.
26 CAPÍTULO 3. GRÁFICOS
500
450
400
350
300
250
200
150
100
50
0
0 10 20 30 40 50 60 70
500
400
300
200
100
−100
−200
0 1 2 3 4 5 6 7
Ao usar o comando plot existem outras propriedades que podem ser ajustadas.
Exemplo 3.3 Executando a instrução abaixo, obtémse uma linha que une os pon
tos de coordenadas (x,y) de largura 2, com os pontos representados por losangulos
(de tamanho 5) realçados a vermelho e com contorno amarelo.
>>plot(x,y,’cd’,’LineWidth’,2,’MarkerEdgeColor’,’y’,’MarkerFaceColor’,’r’,’MarkerSize’,5)
Exemplo 3.4
500
450
400
350
300
250
200
150
100
50
0
0 1 2 3 4 5 6 7
Exemplo 3.5 Na figura 3.6, podese ver um gráfico do tipo semilogy aplicado aos
conjuntos x,y do exemplo 3.1.
3
10
2
10
1
10
0
10
−1
10
0 1 2 3 4 5 6 7
Exemplo 3.6 Na figura 3.7, estão representados os 6 gráficos até agora apresen
tados neste capítulo, fazendo uso do comando subplot. As instruções para a sua
representação, foram:
>>subplot(3,2,1)
>>plot(x,y)
>>title(’plot(x,y)’)
>>subplot(3,2,2)
>>plot(x,y,’rs’)
>>title(’plot(x,y,rs)’)
>>subplot(3,2,3)
>>plot(y)
>>title(’plot(y)’)
>>subplot(3,2,4)
>>plot(x,y,’rd’,x,z,’bs’)
>>title(’plot(x,y,rd,x,z,bs)’)
>>subplot(3,2,5)
>>scatter(x,y,’filled’)
>>title(’scatter(x,y,filled)’)
>>subplot(3,2,6)
>>semilogy(x,y,’LineWidth’,2)
>>title(’semilogy(x,y),LineWidth,2’)
plot(x,y) plot(x,y,rs−)
600 600
400 400
200 200
0 0
0 2 4 6 8 0 2 4 6 8
plot(y) plot(x,y,r−d,x,z,bs−−)
600 600
400
400
200
200
0
0 −200
0 20 40 60 80 0 2 4 6 8
scatter(x,y,filled) semilogy(x,y),LineWidth,2
4
600 10
2
400 10
0
200 10
−2
0 10
0 2 4 6 8 0 2 4 6 8
A estrutura do ezplot consiste na sua forma mais básica numa sequência da forma,
ezplot(’fun’,[a,b]), onde ’fun’ é a expressão que define a função dentro de plicas
(que pode eventualmente ser substituída por uma function handle1 ). Quando o
[a,b] não está definido, o MatLab assume por defeito o [2π,2π]. Este comando
resolve na maioria dos casos o problema de desenhar um gráfico de uma forma
fácil e intuitiva.
>>ezplot(’cos(log10(x)+1)’,[1,8])
cos(log (x)+1)
10
0.6
0.5
0.4
0.3
0.2
0.1
−0.1
−0.2
−0.3
1 2 3 4 5 6 7 8
x
No entanto, o uso do ezplot pode às vezes não ser suficiente. Por exemplo, quando
se pretende que o gráfico tenha uma determinada precisão ou a função varia muito
rapidamente, este comando pode não ser útil, pois não permite ao utilizador acres
centar mais pontos ao gráfico para o tornar mais preciso. Neste caso, o comando
fplot pode trazer grandes vantagens pois permite ao utilizador, entre outras opções,
definir qual a precisão que pretende no gráfico. O comando fplot é geralmente
utilizado na forma fplot(’fun’,[a,b],tol) onde ’fun’ e [a,b] sejam como no caso do
ezplot (embora seja obrigatório definir [a,b] no fplot) e tol é um parâmetro que
define qual a tolerância do erro relativo admitido (caso este parâmetro não seja
definido pelo utilizador é tomado o valor predefinido de 0.002).
Exemplo 3.8 Comparação entre os comandos ezplot e fplot com a função cos(1/x)
em [0.5,0.5].
>>subplot(2,1,1)
>>ezplot(’cos(1/x)’,[0.5,0.5])
>>subplot(2,1,2)
>>fplot(’cos(1/x)’,[0.5,0.5])
cos(1/x)
0.5
−0.5
−1
−0.5 −0.4 −0.3 −0.2 −0.1 0 0.1 0.2 0.3 0.4 0.5
x
0.5
−0.5
−1
−0.5 −0.4 −0.3 −0.2 −0.1 0 0.1 0.2 0.3 0.4 0.5
Gráfico Descrição
errorbar Gráficos com erros associados
polar Gráficos em coordenadas polares
plot3 Gráficos de linhas e pontos em 3D
plotyy Gráficos com eixo dos yy marcados à direita e à esquerda
ezpolar Gráficos de uso intuitivo para coordenadas polares
bar Gráficos de barras
hist Histograma
sphere Gera Esfera
cylinder Gera Cilindro
comet Gráfico xy animado
3.2. OUTROS COMANDOS 33
Exemplo 3.9 Os comandos seguintes permitem criar os gráficos das funções sen(x)
e cos(x) (no intervalo [2π,2π]) em duas janelas diferentes.
>>fplot(’sin(x)’,[2*pi,2*pi])
>>figure(2)
>>fplot(’cos(x)’,[2*pi,2*pi])
>>fplot(’sin(x)’,[2*pi,2*pi])
>>hold on
>>fplot(’cos(x)’,[2*pi,2*pi])
>>grid on
34 CAPÍTULO 3. GRÁFICOS
0.8
0.6
0.4
0.2
−0.2
−0.4
−0.6
−0.8
−1
−6 −4 −2 0 2 4 6
Instruções Básicas de
Programação
35
36 CAPÍTULO 4. INSTRUÇÕES BÁSICAS DE PROGRAMAÇÃO
function [s1,s2,...,sn]=nomedafunção(e1,e2,...,em)
%Comentários para serem lidos ao fazer help nomedafunção
instruções da função
onde,
• s1,...,sn parâmetros de saída da função
• e1,...,ek parâmetros de entrada da função
Depois de definir as instruções devese guardar (save as) a função com o nome que
se lhe pretende chamar. Devese neste ponto ter o cuidado de não usar um nome já
anteriormente definido. De seguida, o directório aonde a função foi guardada (por
defeito o MatLab usa o directório C:\...\MATLAB6p5\work) deve ser adicionado
(caso ainda não esteja) aos directórios aonde o programa vai procurar ficheiros
na janela file, fazer set path, e de seguida add folder. De seguida apresentase um
exemplo básico.
Exemplo 4.1 Construir a função f1, que dado um vector de valores numéricos x,
2
devolva para cada um deles o valor de ecos(x ) .
1 Este assunto será abordado mais em pormenor na secção 4.4
4.1. DEFINIÇÃO DE UMA FUNÇÃO MATEMÁTICA 37
y=cos(exp(x.∧ 2));
Mais uma vez foi o leitor confrontado com a utilização da multiplicação elemento a
elemento. Tal operação utilizase para ser possível dar como entrada da função um
conjunto de valores (armazenados num vector) e receber como resposta a imagem
desse conjunto pela função. O ; utilizase para que quando a função for chamada
não apresente os valores de y na janela de comando, armazenandoos directamente
no workspace.
Executando na janela de comando,
>>s=0:0.25:2;
>>t=f1(s);
o MatLab cria um vector t no workspace que contém a imagem dos pontos contidos
2
em s (i.e,0,0.25,0.5,...,1.75,2) pela função f1, (i.e., pela função ecos(x ) ).
A partir deste momento, e a não ser que o mfile de nome f1 seja apagado do disco,
podese repetir esta instrução, bastando só explicitar o argumento.
As primeiras linhas de comentário da função, são as que são apresentadas quando
se faz help nomedafunção. No caso da função f1,
>>help f1
devolve,
>>help f1
Esta função retorna em y o valor de exp(cos(x$^\wedge$2))
Uma das principais vantagens deste tipo de definição de função é que, ao con
trário do que acontece com outras definições, apenas exige a existência em disco
do MatLab sem necessitar de qualquer toolbox adicional. Além disso, também
é um bom processo do utilizador se habituar a construir programas básicos, que
poderão fornecer alguma base para a execução de rotinas mais complexas.
No entanto, este tipo de definição tem alguns pontos negativos, como seja a impos
sibilidade de tratar a função como um objecto matemático, o que impossibilita o
cálculo de derivadas, integrais etc... Além disso não é um método simples para uso
temporário, i.e, se o utilizador pretender usar a função uma só vez terá de a apagar
(literalmente) do disco, pois não será prático cada vez que se definir uma função
38 CAPÍTULO 4. INSTRUÇÕES BÁSICAS DE PROGRAMAÇÃO
para fazer meia dúzia de cálculos ter de inventar um novo nome para ela.
nomedafunção=inline(expressão)
ou então,
nomedafunção=inline(expressão,arg1,arg2,arg3,...)
>>f=inline(’cos(alfa*x+theta)’)
f=
inline function
f(alfa,theta,x) = cos(alfa*x+theta)
no entanto a ordem das variáveis não vem como foi pedida. Se isso fizer difer
ença, podese utilizar o comando:
>>f=inline(’cos(alfa*x+theta)’,’x’,’theta’,’alfa’)
f=
inline function
f(x,theta,alfa) = cos(alfa*x+theta)
dade isso é feito através da rotina vectorize.m). Como tal, usando o comando inline
não há necessidade de colocar o .(ponto) antes daquelas operações.
A função f agora definida, pode ser usada como habitualmente. Por exemplo,
>>y=f(1,pi/2,pi/4)
y=
0.70710678118655
>>x=[0,2,3,4];
>>y=f(x,0,pi/12);
No entanto, esta forma de definir uma função matemática, embora de fácil imple
mentação, não tira partido total2 das capacidades do MatLab como por exemplo
em termos de derivação ou integração. Vai ser agora introduzida uma nova forma
de definir funções matemáticas, que permite usar essas capacidades de forma fácil
e intuitiva.
onde,
Depois da função definida desta forma basta usar o comando subs para poder sub
stituir a variável por uma constante (ou por um vector de valores). A estrutura deste
comando, é a seguinte:
y=subs(nomedafunção,{var1,var2,...,varn},{p1,p2,...,pn})
onde,
• var1,var2,...,varn variáveis da função
>>f=cos(alfa*x+theta)
f=
cos(alfa*x+theta)
Para estimar cos(π/4) usando a função f, basta tomar (por exemplo), α = π/4
, x=1 e θ = 0.
>>x0=1
>>alfa0=pi/4
>>theta0=0
Executando agora,
4.2. OPERADORES 41
>>y=double(subs(f,{alpha,x,theta},{alfa0,x0,theta0}))
y=
0.70710678118655
√
2
que é uma aproximação de 2 , como era esperado.
Como já foi referido, uma das vantagens da definição de uma função na forma
simbólica é que se pretendermos calcular a derivada parcial da função em ordem a
uma das variáveis, basta utilizar a instrução diff. Por exemplo, usando as variáveis
definidas no exemplo 4.3,
>>dfdx=diff(f,x)
dfdx=
sin(alfa*x+theta)*alfa
Além deste exemplo, existem muitas outros operadores definidos para funções
definidas como estruturas simbólicas, (por exemplo: o comando int, que permite
calcular integrais, ou o comando Taylor, que retorna o polinómio de Taylor) que se
podem encontrar utilizando o comando help symbolic, que dá mais algumas infor
mações acerca das funcionalidades principais desta toolbox. No entanto este tipo
de comandos serão objecto de estudo mais aprofundado em capítulos subsequentes.
4.2 Operadores
Os operadores de relação e operadores lógicos são uma parte importante em
programação. Os símbolos que os definem em MatLab estão representados na
tabela 4.5 Conhecidos os operadores lógicos em MatLab, vão agora ser apresen
Relação Símbolo
Igual ==
Menor <
Maior >
Menor ou igual <=
Maior ou igual >=
Diferente ∼=
E &
Ou |
Não ∼
for variavel=expressão
instruções
end
>>for i=1:3
A(i,i)=2^i
end
A=
2 0 0
0 4 0
0 0 8
Noutras linguagens é costume usar frequentemente esta instrução. No entanto,
sempre que possível, em MatLab é preferível usar comandos vectorizados. Por
exemplo, em vez de fazer,
>>for i=1:100
x(i)=i
end
>>x=1:1:100
4.3.2 Instrução if
Esta instrução verifica o valor lógico de uma proposição, e consoante esse valor
poderá executar um conjunto de instruções.
4.3. OPERADORES DE CONTROLO DE FLUXO 43
if expressão1
instruções1
elseif expressão2
instruções2
else
instruções3
end
>>k=4;
>>for m=1:k
for n=1:k
if m= =n
A(m,n)=2
elseif (abs(mn)= =2)
A(m,n)=1
else
A(m,n)=0
end
end
end
A=
2 0 1 0
0 2 0 1
1 0 2 0
0 1 0 2
while expressão1
instruções
end
Exemplo 4.6 Este exemplo ilustrativo da instrução while começa com um número
aleatório entre 0 e 1, e verifica quantas vezes é necessário duplicálo para se obter
um número maior que 1.
>>k=rand(1)
>>i=0
>>while k<=1
k=k*2;
i=i+1
end
switch expressão1
end
>>x=input(’introduza um numero!’)
>>switch x
case 1 % se x=1
x=x*4
case 2 % se x=2
x=x*3
case 3 % se x=3
x=x*2
case 4 % se x=4
x=x*1
otherwise % caso contrário
x=0
end
y
y=
�y�
, é usado como sendo o novo vector x, iterandose assim o processo até que, por
exemplo, a diferença (elemento a elemento) entre duas aproximações sucessivas (x
e y) do vector próprio dominante sejam menor que um determinado valor (definido
pelo utilizador). Devese também usar um parâmetro extra k, para limitar o número
de iterações que a rotina pode executar evitando assim que esta possa entrar em ci
clo infinito.
Este processo teoricamente converge se o valor próprio dominante for simples.
Vejase então uma função em MatLab que implemente este método:
i=0;
y=(A*x);
y=y/norm(y,2);
while(i <= k)&(max(abs(y − x)) > 10 ∧ 15)
i=i+1;
x=y;
y=A*x;
y=y/norm(y,2); end
valor_proprio=max(A*y./y);
vector_proprio=y;
%Fim de função
Gravando esta rotina num directório (se necessário rever a secção 4.1.1) e criando a
matriz A e o vector x na janela de comando, (como exemplo pode usar, A=magic(3)
e x=[1;0;0] e k=100), pode executar a rotina fazendo,
>>A=magic(3)
4.4. SCRIPTS E FUNÇÕES 47
>>x=[1;0;0]
>>[valp,vecp,i]=fmpot(A,x,100)
obtendo,
valp=
15.00000000000001
vecp=
0.57735026918963
0.57735026918963
0.57735026918963
i=
31
O que significa que a função devolveu como vector próprio o array vecp, como
valor próprio valp e que demorou 31 iterações (este valor foi guardado em i) a
encontrar esta aproximação. Para verificar a qualidade da aproximação (relembre
que o par (λ,x) são respectivamente valor e vector próprio de uma matriz A se Ax
λx=0) basta fazer na janela de comando,
>>A*vecpvalp*vecp
i=0;
y=(A*x);
y=y/norm(y,2);
while(i <= k)&(max(abs(y − x)) > 10 ∧ 15)
i=i+1;
x=y;
y=A*x;
y=y/norm(y,2); end
valor_proprio=max(A*y./y);
vector_proprio=y;
%Fim de script
A forma de executar este script é, depois de o guardar num directório apro
priado (tal como foi feito para a função fmpot.m) é necessário criar as variáveis
48 CAPÍTULO 4. INSTRUÇÕES BÁSICAS DE PROGRAMAÇÃO
(A,x,i) na janela de comando, tal como foi feito anteriormente, e depois escrevese
o nome do script na janela de comando.
>>A=magic(3)
>>x=[1;0;0]
>>k=31
>>scriptmpot
que a rotina vai sendo construída. Para os ultrapassar devemse separar essen
cialmente dois tipos de erros: os erros de sintaxe, que derivam de uma deficiente
utilização das rotinas e instruções do MatLab e os erros que levam a uma resolução
errada do problema proposto. Enquanto que os segundos derivam geralmente de
uma má fundamentação teórica do problema, os primeiros podem ter várias origens
(que não serão aqui enumeradas). A maneira mais fácil de os detectar e corrigir
passa geralmente por dividir o programa em pequenas partes, verificar quais as
variáveis e valores atribuídos em cada uma delas, copiálas para o "workspace"e
executar depois na janela de comando a parte do programa que está a dar prob
lemas. Assim é mais fácil perceber a origem do erro e fazer a correspondente
correcção.
Nas linhas seguintes serão focados alguns tópicos que fazem parte das dúvidas
comuns de quem se inicia no campo da programação em MatLab.
transformar a string num objecto simbólico, para que se possa tratar o parâmetro
de entrada como função. A instrução que permite efectuar tal acção é o comando
sym. É agora necessário que o MatLab identifique quais as variáveis da função:
para tal podese utilizar a instrução findsym. Esta instrução vai verificar quais as
variáveis que estão associadas ao objecto simbólico que é dado como argumento.
Depois destes passos, fica o utilizador em posição de tratar a função sem qualquer
dificuldade. Para uma mais fácil acompanhamento deste item, vai ser usado um
exemplo.
Chamese dparciais.m à rotina que se pretende construir. Suponhase agora que o
objectivo desta rotina é, dada uma função calcular as derivadas parciais em ordem
a cada uma das variáveis. Uma forma de o conseguir seria construir uma rotina
como a que se segue. No entanto, analisandoa (ou testandoa) com cuidado pode
se verificar que tem algumas falhas. Consegue descobrilas? E descobrindoas,
consegue resolvêlas? Aqui está um bom exercício para resolver sozinho e que
com certeza lhe dará um certo à vontade na "investigação"em MatLab. Relembre
no entanto que às vezes o mais importante não é atingir o objectivo final, mas a
forma como lá se chega e, principalmente, o que se aprende durante esse processo.
Exemplo 4.8 A rotina dparciais.m calcula, dada uma função de várias variáveis,
as derivadas parciais da função em ordem a cada uma das variáveis.
end
%Fim de função
O Help do MatLab
Este é talvez a parte do MatLab mais importante para qualquer aluno com von
tade de ser bom a trabalhar com o programa. Por dois motivos: primeiro porque o
utilizador que domine bem esta parte do programa, consegue resolver uma grande
parte dos seus problemas. Segundo, porque pode ajudar a poupar muito trabalho,
pois existem muitas funções de utilização comum já definidas no programa, sendo
portanto um desperdício de tempo voltar a programálas. A ajuda do MatLab fun
ciona de duas formas distintas: uma através da ajuda que está implicitamente criada
nos comandos e funções internamente definidos. Este é o tipo de comentários que
se obtém quando se executa o comando help nomedecomando na janela de co
mando do MatLab. Esta acção devolve uma descrição sucinta do comando e das
suas opções. É bastante útil quando se conhece o nome do comando mas não se
sabe como o utilizar. No entanto, quando não se sabe qual o comando a utilizar para
uma determinada acção, na maioria das vezes a melhor alternativa é abrir o help do
programa. Para tal, o melhor é abrir a janela do help1 e seleccionar a opção MatLab
Help. Para tal é necessário ter esta opção instalada. (Ocupa cerca de 339MB em
disco, tirando os documentos em PDF, que devem ser guardados em CD, ocupando
estes cerca de 400MB). Depois de ter a janela do help aberta, existem três opções
básicas. Ou se selecciona a opção índex, o que faz com que o programa procure um
tópico com o nome digitado, ou se selecciona a opção search. Nesta ultima opção
o MatLab procura todos os documentos que contêm a palavra ou frase digitada.
Por fim, se se quiser apreender a trabalhar numa área específica, o melhor é abrir
a opção contents, procurando depois a área em que se está a trabalhar. Para se ter
uma noção geral das potencialidades do programa, talvez o melhor seja navegar
um pouco pelo Demo que está incluído no programa (escrever demo na janela de
comando). Isto dará a um novo utilizador uma ideia das potencialidades deste pro
grama.
Com este capítulo dáse por terminada esta primeira parte referente ao uso básico
do MatLab para o curso de Métodos Numéricos. É importante que o utilizador
tenha consciência da grande amplitude de temas que o MatLab cobre, e que como
1A partir da versão 6
53
54 CAPÍTULO 5. O HELP DO MATLAB
Os exercícios abaixo devem ser realizados com um espírito critico, i.e., os seus
resultados devem ser cuidadosamente examinados e compreendidos. Caso tal não
aconteça é muito provável que mais cedo ou mais tarde apareçam graves dificul
dades.
(a) x+y
(b) x*y
(c) x.*y
(d) x*y’
(e) x’*y
(f) x’*y’
55
56 CAPÍTULO 6. ALGUNS EXERCÍCIOS DE APLICAÇÃO
plot(x,y);
hold on
xx = [0 2];
yy = [0 0];
plot(xx,yy);
grid on
hold off
10. Construa uma rotina que, dada uma função real de variável real, um con
junto de pontos e um número inteiro positivo, n, calcule o valor da nésima
derivada de f no conjunto de pontos dados e apresente uma nova janela com
dois gráficos (usando por exemplo a instrução subplot): Um que contenha o
valor da função e outro o valor da nésima derivada nos pontos dados.