Opera
c
oes B
asicas do Matlab
2.1
Arranque
2.2
Vectores e Matrizes
Nesta seccao s
ao cobertas operac
oes elementares com o Matlab, que se baseia na manipulacao de matrizes: MATLAB =MAT(rix) LAB(oratory). Como mencionado na
Seccao 2.1, a janela Command Window e muito importante na fase inicial da aprendizagem.
Na linha do comando dessa janela pode-se definir uma variavel, que pode ser um escalar
(e efectivamente uma matriz com dimensoes 1 1) ou um vector. Depende da definicao
usada quando se cria a vari
avel.
O comando g=12 resulta num escalar com o valor atribuido. Isso pode ser verificado
pelo comando whos, que origina uma lista das variaveis criadas na seccao, indicando o
tamanho (Size = 1 1) e outros atributos.
1
As v
arias janelas podem ser descoladas da janela-m
ae
11
CAPITULO 2. OPERAC
OES
BASICAS
DO MATLAB
12
0.2010
0.4020
0.6030
0.8040.
De notar que o u
ltimo elemento nao alcanca o valor do terceiro argumento (=1). Pode
parecer trivial mas o desconhecimento deste comportamento da linguagem potencia resultados inesperados.
O uso de parenteses e opcional na definicao do vector:
y=0 : 0.201 : 1
ou
y=[0 : 0.201 : 1] resulta no mesmo. [Verificar.]
Se em vez de um vector com dimensoes 1 n quisermos um que seja n 1, pode-se criar
primeiramente o vector como previamente feito e depois aplicar uma transposicao, que e
forcada colocando uma plica no fim do comando. Ou entao, entrar os valores separados
por um ;.
Observac
ao: nestes apontamentos o termo plica refere-se ao sinal, parecido com o sinal
agudo, que num teclado portugues esta junto ao ponto de interrogacao ?.
z=[ 1 2 3] ou z=[ 1; 2; 3] da o mesmo resultado:
z =
1
2
3
Uma matriz pode ser formada da linha de comando ou dentro de um ficheiro. Da linha
de comando, a sequencia A=[1 2 4; 3 6 3 ; -2 4 2;] resulta em
A =
1 2 4
3 6 3
2 4 2
2.3. SCRIPTS
13
2.3
Scripts
Um script e uma sequencia de comandos que se guardam num ficheiro, para serem
postos em execuc
ao por submiss
ao do mesmo. Conforme se avanca na aprendizagem
do Matlab, a janela Command Window nao e usada tao frequentemente, pois os scripts
facilitam e aceleram a cadencia da resolucao de trabalhos.
CAPITULO 2. OPERAC
OES
BASICAS
DO MATLAB
14
2.3.1
Script B
asico
Vejamos um exemplo b
asico, onde se executam primeiro os comandos na Command Window,
para constatar que funcionam, e depois se forma o script com esses comandos.
Abre-se o Matlab para uma nova seccao, com a memoria limpa. Pretende-se fazer o
seguinte:
Formar o vector t, que vai de 0 a 4, com um passo de
15
Observacao
Se e pretendido guardar esta sequencia de comandos, para uso futuro, isso deve ser
feito num ficheiro Matlab. Usa-se a janela principal, no menu File > New > Script,
que abre uma janela Editor - untitled1. Nesse novo ficheiro entra-se exactamente a
sequencia tal como foi submetida na Command Window (sem possveis erros) e guarda-se,
dando-lhe um nome elucidativo, como ScriptBase.m, sendo a extensao oferecida por
defeito.
Nota:
Para n
ao termos de escrever de novo os comandos, podemos trazer de novo `a linha
de comando com a seta e copiar. Ou entao, procurar os comandos na janela
Command History e fazer copia.
boa pr
E
atica usar um nome que nos ajude a encontrar facilmente o desejado ficheiro. Se nos limitarmos a dar nome como file001.m, file002.m ... sera difcil mais
tarde, olhando para uma tal lista, diferenciar entre os conte
udos da file027.m e os
da anterior ou seguinte.
Para evitar complicac
oes futuras nao se recomenda no nome dos ficheiros o uso
de acentos, c, ou outra pontuacao particular a uma lngua. Certas plataformas
2.3. SCRIPTS
15
16
CAPITULO 2. OPERAC
OES
BASICAS
DO MATLAB
exista, apaga-se tudo e o script escrevera como fosse novo. Se em vez do w a linha
tivesse um a, isso seria equivalente a: se o ficheiro nao existe, e criado; caso ja exista,
o script vai adicionar ao fim do que o ficheiro ja contenha, resultante de previo uso deste
ou outro script.
Deve-se colocar um comando a fechar o ficheiro texto, quando ja nao se pretenda escrever
nele. Usualmente e colocado no fim do script, que e o caso presente:
status = fclose(fid);
Depois da linha com o ponteiro para o ficheiro, a seguinte obtem a data e hora (=marca
o ponto), registando esses dados na variavel rlg (= relogio).
De seguida vem uma linha com ... `a direita, indicando que ela continua na seguinte.
Ou seja, esta e a seguinte formam um u
nico comando. Esta quebra foi feita para efeitos
de leitura. Caso contr
ario, a linha seria demasiado longa, tornando a leitura difcil.
Obs: Os tres pontos `
a direita sao conhecidos na literatura geral como Ellipsis. O Matlab
espera pelo menos tres pontos mas parece aceitar mais. Menos de tres e que nao serve.
Vem depois o comando fprintf(fid,\n);, que simplesmente escreve uma linha em
branco no ficheiro de texto. Esta aqui pois o Matlab, como quase todo o software, fica
`as vezes confuso e escreve sempre numa linha, sem terminar. Este comando e para para
contornar tal comportamento.
No fprintf aparece s
o o formato para n
umeros inteiros, que e %Ni, onde N e o n
umero
de algarismos dedicados ao inteiro que se pretende escrever. No caso presente, como se
esta a gravar a hora e n
ao se deseja ter espacos vazios, como 10: 9:37 deve-se colocar
o 0 antes do N para que o Matlab coloque um 0 em vez de um espaco em branco, dando
10:09:37.
Tambem se pode ter algo como %i para n
umeros inteiros mas nesse caso nao se controla
mais o n
umero de posic
oes ocupadas pelo impressao. Em certas situacoes, e esse o efeito
procurado.
Quando se escreve uma tabela, uma linha por passagem de ciclo, e as variaveis tomam
valores positivos e negativos, coloca-se um + antes da especificacao do formato, para que
a coluna final tenha os sinais alinhados, dando uma outra visualizacao.
Ha muitos formatos no Matlab, para os possveis binarios, hexadecimais, inteiros, ponto
flutuante, entre outros. Provavelmente os formatos mais usados (=menos especializados)
sao %+Ni e %+N.Kf. O primeiro ja se conhece: e para inteiros. O segundo e para n
umeros
com casas decimais e N e o n
umero total de posicoes ocupadas pela impressao, K e o
n
umero de casas decimais e o + e para alinhamento, como visto previamente. Deve-se
consultar o Help e ver exemplos, particularmente os associados com os TPs de CPIN.
2.3.2
Uma funcionalidade que frequentemente um script precisa de ter e a de ser capaz de estabelecer um di
alogo com a Command Window, para que parametros possam ser passados
entre o utente e programa, para tomar decisoes sobre a linha de accao a seguir.
Como estamos a mostrar funcionalidades separadas e nao a resolucao de um trabalho
especfico, vamos usar parte de um script desenvolvido para MNUM, que demonstra
essa comunicac
ao. O que faz o resto do script nao tem relevancia. O que interessa aqui
e mostrar que o di
alogo leva a uma decisao sobre o que e ou nao feito pelo script.
O que se pretende que o script faca:
Interpela o utente na Command Window, oferecendo a escolha:
2.3. SCRIPTS
17
method=1: Linear
method=2: Quadratic
method=3: Cubic
Se o valor entrado coincide com uma das ofertas, o script avanca. Caso contrario, ele
escreve mensagens, contrariado, e n
ao executa o resto do codigo, que consiste em obter
os dois graficos.
No caso presente, insere-se esta l
ogica no ScriptBase.m antes da linha onde e formado
o vector t, (que foi a primeira instruc
ao do script original) e depois das linhas que fazem
limpeza, criam o ponteiro para o ficheiro texto e que marcam o ponto (data e hora).
Visto ja termos mudados substancialmente o script original, vamos guarda-lo com um
outro nome elucidativo, aludindo `
a troca com a Command Window, e vamos tambem criar
um outro ficheiro texto, para manter separados os diferentes scripts. O novos nomes
serao ScriptGetsParametersFromCW.m e ParametersFromCW.txt. A listagem segue.
clc
clear
f i d = fopen ( ParametersFromCW . t x t , w ) ;
r l g=clock ;
f p r i n t f ( f i d , R e a l i z a d o a %02i %02i %02 i ; %02 i :%02 i :%02 i \n , . . .
rlg (1) , rlg (2) , rlg (3) , rlg (4) , rlg (5) , int8 ( rlg ( 6 ) ) ) ;
f p r i n t f ( f i d , \n ) ;
p a r a r =0;
method=input ( Qual f a z e r (1= l i n e a r ; 2= q u a d r a t i c ; 3=c u b i c ) ? : )
i f ( method==1) f p r i n t f ( f i d , Usando y e s t=a+bx\n ) ;
end
i f ( method==2) f p r i n t f ( f i d , Usando y e s t=a+bx+cx 2\n ) ;
end
i f ( method==3) f p r i n t f ( f i d , Usando y e s t=a+bx+cx2+dx 3\n ) ;
end
i f ( ( method>=1)&&(method <=3)) f p r i n t f ( f i d , Pode s e g u i r . \ n ) ;
else
f p r i n t f ( f i d , Valor e n t r a d o f o i %i \n , method )
f p r i n t f ( f i d , Nada f e i t o ! \ n ) ;
s t r = [ Valor e n t r a d o f o i , num2str ( method ) ] ;
disp ( s t r ) ;
disp ( Nada f e i t o ! ) ;
p a r a r =1;
end
i f ( p a r a r == 1 ) break ;
end
t=0 : pi /15 : 4 pi ;
A=cos ( t ) ;
subplot ( 2 , 1 , 1 )
plot ( t ,A)
t i t l e ( O meu c o s e n o )
grid
subplot ( 2 , 1 , 2 )
B=sin ( t ) ;
plot ( t , B)
t i t l e ( O meu s e n o )
18
CAPITULO 2. OPERAC
OES
BASICAS
DO MATLAB
grid
status = fclose ( f i d ) ;
O novo c
odigo comeca com a linha parar=0;, que inicializa essa bandeira, usada mais
`a frente.
seguida por method=input(Qual fazer (1=linear; 2=quadratic; 3=cubic)?:)
E
Aqui e usada a func
ao interna/nativa do Matlab input( ), cujo argumento tem de estar
entre plicas. A func
ao lanca a mensagem na Command Window. O utente entra um valor,
seguido de Return/Enter. O script le o valor e procede com a logica.
Vamos assumir que o valor entrado e um dos permitidos. Entao um dos tres if() seguintes ter
a um argumento v
alido e algo e escrito no ficheiro texto. O quarto if tambem
e valido neste caso, e algo mais e escrito no ficheiro.
Importante: no Matlab todo o if() tem de ser terminado/acompanhado por um end.
Antes do end associado ao quarto if, aparece a opcao else. O argumento do else so e
valido se o valor entrado n
ao constar da lista oferecida. Vamos assumir que tal e o caso.
Por exemplo, foi entrado o valor 2 ou 6. Sendo a opcao else() agora valida, o codigo
ate ao pr
oximo end e executado.
Comeca por escrever duas linhas no ficheiro, indicando a sua decisao.
Escrever para o monitor/display e mais limitado do que para um ficheiro, onde se pode
misturar texto com valores numericos. A funcao disp( ) manda para o monitor a
vari
avel do argumento. Mas s
o pode ter um argumento.
Se X e uma constante ou vector ou mesmo uma matriz, o valor numerico associado a X
e mostrado pelo comando disp(X). Contudo, nao mostra o nome X. [Verificar.]
Seja y=[1 2 3]. Se submetermos o comando disp(y), no monitor aparece simplesmente
1 2 3, sem adicionar o nome. Se tentarmos disp(y=, y), um erro parece, queixandose de ter argumentos a mais. Ou seja, disp(y=) e valido, assim como disp(y), mas
disp(y=,y) n
ao e.
Como contornar tal situac
ao? Uma maneira e tornar tudo do mesmo tipo (texto). Usase a func
ao num2str para converter o valor numerico em string (=texto) a faz-se a
concatenac
ao desse string com o outro texto, para haver um u
nico argumento texto.
Nota: O nome indica o desempenho da funcao: num(erical)-to-str(ing).
No caso do vector y, usa-se disp([ y = , num2str(y)]). Verificar.
Regressando `
a listagem, a linha str = [Valor entrado foi ,num2str(method)];
forma uma vari
avel que e a concatenacao do texto entre plicas com o texto equivalente
ao valor numerico, separados pela vrgula. Esta string e enviada para o monitor com o
disp(str); e a linha seguinte manda a outra string. Como consiste so de texto, nao d
a
problema.
Tendo sido entrado um valor fora da gama, a variavel (=bandeira) parar muda para o
valor 1 e o c
odigo controlado pelo else termina.
A seguir vem um outro if, que verifica o valor da bandeira parar. Como iguala 1, o
commando break e executado, que equivale a dizer, o programa e terminado sem mais
considerac
oes.
Est
a obtido o comportamento desejado. Deve ser testado com diferentes valores.
2.4. FUNC
OES
CRIADAS PELO UTENTE
2.4
19
Fun
c
oes Criadas pelo Utente
2.4.1
Func
ao Script
Uma funcao criada pelo utente tem de ser gravada num ficheiro com extensao .m e o
nome da func
ao tem de ser igual ao nome do ficheiro. O utente deve tomar o cuidado
que o nome escolhido n
ao seja j
a usado no Matlab. (Dentro do ficheiro a extensao
nao e usada.) Nas vers
oes mais recentes do Matlab ao abrir um novo ficheiro, a opcao
Function e oferecida, j
a aderindo a estas regras do nome.
Vamos criar a func
ao find_dist que usa como argumentos dois pontos no plano, em
coordenadas Cartesianas, e calcula a distancia entre os pontos. O ficheiro sera algo como
function [ d i s t a n c i a ] = f i n d d i s t ( p1 , p2 )
% Finds t h e d i s t a n c e bet w een two p o i n t s i n C a r t e s i a n c o o r d i n a t e s
% Given two p o i n t s p1 =[x1 , y1 ] e p2= [ x2 , y2 ] t h e d i s t a n c e i s
% g i v e by t h e s q r t o f t h e sum DeltaX 2 + DeltaY2%
%
d i s t a n c i a = sqrt ( ( p2 (1) p1 ( 1 ) ) 2 + ( p2 (2) p1 ( 2 ) ) 2 ) ;
end
Grava-se a func
ao e agora ela faz parte do reportorio de funcoes do Matlab local. Na
linha de comando da Command Window se entrarmos help find_dist, as primeiras tres
linhas comentadas da func
ao s
ao dadas no monitor. De seguida, se entrarmos A=[0 0]
e B=[3 4] e depois submetermos o comando find_dist(A, B) a resposta e
ans =
5
De notar que a vari
avel distancia n
ao aparece no Workspace. Ela e uma variavel
local da func
ao mas n
ao e global, ou seja, e desconhecida fora da funcao. Tambem
de notar a ausencia do acento ^ no nome da variavel. Como dito noutro local destes
apontamentos, recomenda-se essa pr
atica pois nunca se sabe quando se trocara material
com outros sistemas que desconhecam esses smbolos ou os usem para outros efeitos.
A funcao vista usa vectores como argumentos, que podem ser tambem matrizes ou
escalares. Tem de haver o usual cuidado quando se lida com matrizes.
Uma funcao que pode ser u
til e a de calcular o logaritmo de um n
umero para qualquer
CAPITULO 2. OPERAC
OES
BASICAS
DO MATLAB
20
2.4.2
Func
ao An
onima
Outra opc
ao para criar uma funcao sem ter de gravar em ficheiro .m e com uma func
ao
anonima, que se obtem da linha de comando. Tem a forma de
name = @(argument) (o que se pretende calcular), onde o @ e a referencia da
func
ao an
onima. (handle significa punho).
Exemplo. Pretende-se criar uma funcao anonima que divida um n
umero por 3 e adicione
10 `a divis
ao. Vamos dar-lhe o nome g.
Na linha de comando entra-se g=@(v)(v/3+10) e essa funcao passa a estar disponvel.
Para testar, submete-se a expressao g(30), que nos da o resultado esperado:
ans =
20
Consultar o Help para uma mais pormenores.
2.5
Matem
atica Simb
olica
O Matlab permite definir variaveis e funcoes simbolicas, com as quais se pode operar
como esperado, isto e, manobrando os smbolos sem entrar com valores numericos. Estes
programas s
ao descritos frequentemente como sendo sistemas de
algebra computacional.
2.5. MATEMATICA
SIMBOLICA
2.5.1
21
Deriva
c
ao
Numa situacao onde se conhece uma expressao matematica (=funcao) para a qual se
pretenda calcular a derivada, a resposta procurada pode ser obtida pelo programa.
3 3
3 3
3 3
(x)
d 3 3
Como exemplo, sabe-se que a derivada de f (x) = e 2 x e dfdx
=e 2 x dx
( 2 x )=e 2 x ( 92 x2 ).
Este resultado pode ser verificado com o Matlab, comecando por entrar na linha de comando syms x.
Isso cria a vari
avel x, como se pode constatar consultando o Workspace, que se assume
previamente vazio. O smbolo usado e diferente do que foi visto ate agora para variaveis
normais (=numericas), e depende da versao do programa.
De seguida, define-se a func
ao f em termos de x com f=exp(3/2 * x^3). Devido a`
natureza de x, o Matlab sabe que f e uma funcao simbolica, como mostra o Workspace,
e a sua formac
ao e confirmada:
f = exp((3*x^3)/2)
Pretende-se a derivada, que e pedida por diff(f) e a resposta vem:
ans = (9*x^2*exp((3*x^3)/2))/2
Tambem se pode usar diff(f,x) mas como f tem uma u
nica variavel, x, este uso e
redundante. Se se pretende usar a derivada repetidamente noutros calculos, fara sentido
definir uma outra vari
avel como tal: derivadaDef=diff(f)
possvel fazer muita operac
E
ao como integrar, calcular derivadas parciais, segundas
derivadas ou calcular, para um ponto, funcoes de varias variaveis. O argumento das
funcoes pode ser matricial. Para mais informacao deve-se consultar um manual de
Matlab, o Help e a literatura online.
Vejamos alguns outros exemplos de complexidade variada.
Depois de esvaziar o Workspace, para evitar conflictos, as diferentes variaveis devem ser
declaradas como simb
olicas:
syms a1 b1 c1 a2 b2 c2 d2 A C1 B C2 x y t V0 R C
Func
ao matem
atica
f1 (x) = a1 + b1 x + c1 x2
f2 (x) = a2 + b2 x + c2 x2 + d2 x3
g(t) = et (C1 cos(t) + C2 sin(t))
u(x, y) = 2xy 2 + sin(x + y)
3 3
f (x) = e 2 x
1
v(t) = V0 e RC t
Expressao simbolica
f1=a1+b1*x+c1*x^2
f2=a2+b2*x+c2*x^2+d2*x^3
g=exp(A*t)*(C1*cos(B*t)+C2*sin(B*t))
u=2*x*y^2+sin(x+y)
f=exp(3/2*x^3)
v=V0*exp(-1/(R*C)*t)
CAPITULO 2. OPERAC
OES
BASICAS
DO MATLAB
22
2.5.2
Integra
c
ao
A operac
ao inversa da derivacao e a integracao, que o Matlab tambem inclui nas suas
capacidades. Pode-se calcular um integral entre limites especficos ou pedir a integrac
ao
sem tal substituic
ao.
Operac
ao matematica
I1 = f1 (x)dx
5
I2 = 0 f1 (x)dx
I3 = v(t)dt
RC
I4 = 0 v(t)dt
Expressao simbolica
I1=int(f1)
I2=int(f1,0,5)
I3=int(v)
I4=int(v,0,R*C)
2.5.3
Gr
aficos obtidos via Matem
atica Simb
olica
2.5. MATEMATICA
SIMBOLICA
23
F1p=double(subs(F1,x,xp));
D1p=double(subs(D1,x,xp));
I1p=double(subs(I1,x,xp));
figure (10)
plot(xp,F1p,r-, xp, D1p, g--, xp, I1p, b-.), grid
title(Figuras geradas por Syms, FontSize, 16)
xlabel(x \rightarrow, FontSize,18)
ylabel(y \rightarrow,FontSize,18)
legend(Function,1st Derivative, Integral)
figure (20)
plot(xp,F1p,r-,LineWidth,1.1)
hold on
plot(xp, D1p, g--,LineWidth,1.1)
plot(xp, I1p, b-.,LineWidth,1.1)
grid
title(Figuras geradas por Syms, FontSize, 16)
xlabel(x \rightarrow, FontSize,18)
ylabel(y \rightarrow,FontSize,18)
text(-1,5,\leftarrow
f1(x),FontSize,18)
text(-0.65,-4,\leftarrow
Derivada de f1(x),FontSize,18)
text(1.75,15,Integral de f1(x)
\rightarrow,FontSize,18)
hleg2=legend(f(x),Derivada, Integral);
set(hleg2,Location,NorthWest,FontSize,14)
Figuras geradas por Syms
25
20
25
Function
1st Derivative
Integral
20
15
10
10
Integral de f1(x)
y!
y!
15
f(x)
Derivada
Integral
10
2
x!
10
2
"
f1(x)
"
Derivada de f1(x)
x!
24
CAPITULO 2. OPERAC
OES
BASICAS
DO MATLAB
figure (10). E uma codificacao compacta mas torna difcil certas operacoes sobre o
desenho, como por exemplo adicionar texto.
Essa adic
ao tornou-se f
acil no grafico da janela aberta com plot(), como mostra a listagem. Aqui usou-se um comando por curva (para um total de tres), permitindo inserir
texto, para alem da legenda, ficando o grafico mais informativo.
Como sempre, os gr
aficos foram exportados para o formato pdf e aparecem lado a lado,
para comparac
ao.
2.5.4
Resoluc
ao de Equaco
es
Com o syms pode-se resolver uma equacao trivialmente. Na seccao anterior usou-se a
func
ao f1 (x) = a1 + b1 x + c1 x2 que, com as devidas substituicoes de valores, se torna
f1 (x) = 1 2x + x2 = (1 x)2 . Portanto, uma parabola com eixo vertical y = 1 e vertice
no eixo dos xx.
Quais s
ao as razes desta equacao f (x) = 0? Na linha de comando basta submeter
solve(f) e a resposta e [1 1], como se espera: tem a raiz dupla x = 1. E se quisermos
a curva de nvel f (x) = 1? Isso equivale a f (x) 1 = 0 e se submetermos solve(f-1)
a resposta e [2 0], pois a equacao passou a ser f1 (x) 1 = 2x + x2 = x(x 2). De
notar que neste caso de duas dimensoes e mais proprio falar neste caso de
linha de nvel.
4x + y = 28
Sistemas de equac
oes s
ao resolvidos com um comando, como por exemplo
6x 3y = 6
A soluc
ao vem em duas etapas:
R=solve(4*x+y-28,6*x-3*y-6) define o sistema R, e na Command Window ve-se
R =
x: [1x1 sym]
y: [1x1 sym]
Para se obter as soluc
oes submete-se: R.x, que devolve o valor 5, e R.y devolve 8. Verificar valores.
Para resolver certas equac
oes diferenciais o comando dsolve e aplicado. Consultar o
Help e a literatura.
2.6
O Matlab tem a capacidade de importar folhas de calculo da Microsoft Excel ou equivalente, como uma folha Calc da Open Oce. Pode ser u
til para certas situacoes, nas
quais a programac
ao a fazer seja mais intuitiva com a visualizacao oferecida por uma
folha de c
alculo.
Para quem deseje combinar o melhor dos dois ambientes (folha de calculo e Matlab),
pode sempre trabalhar certos aspectos na folha de calculo e depois importar para o
Matlab, para continuar a programacao.
25
Val1
-70
-68
-66
-64
Val2
1.44
1.47
1.49
1.50