Anda di halaman 1dari 15

Captulo 2

Opera
c
oes B
asicas do Matlab
2.1

Arranque

O programa arranca tipicamente com quatro janelas, com os rotulos

Command Window: e a mais importante quando se comeca a aprender o Matlab


Workspace: Contem apontadores para as variaveis em memoria
Current Folder: u
til para navegar os directorios
Command History: u
til para repetir/corrigir comandos previamente submetidos
Pode acontecer que alguma da janelas se feche, ou se separe da principal. Se ela se
fechar, podemos sempre na janela principal, na opcao Desktop, seleccionar a desejada
janela.
Outra situacao frequente e querer separar uma janela da principal. Isso e feito com a
seta na 2a posic
ao da barra com o nome da janela. (Na 1a posicao esta o cone de fechar
a janela.) Estando a janela separada, para reintegra-la na principal, usa-se a opcao
Desktop da janela separada.

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

Na janela Workspace aparecera a variavel g, que se pode inspeccionar e confirmar o


valor entrado.
NB: O n
umero de casas decimais mostrados pode ser controlado com o comando format.
Submetendo format long, os resultados aparecerao com 15 casas decimais, para variaveis
com casas decimais. [N
umeros inteiros nao sao afectados.]
O outro formato e format short, que so mostra quatro casas decimais, para uma leitura
mais compacta. Na mem
oria, as variaveis tem a mesma precisao. Portanto, e so para
efeitos de visualizac
ao.
Para se formar o vector x, e t
ao simples como submeter as suas componentes, dentro de
parenteses quadrados. Assim, x=[1 2 4] cria um vector com dimensoes 1 3. Verificar
que na janela Workspace aparece agora tambem x.
Se o vector tomar valores uniformemente espacados, a sua definicao e particularmente
simples: x=0: 0.1 : 1 forma um vector 1 11 com valores 0, 0.1, ... , 1.0, ou seja,
coloca na primeira posic
ao o valor do primeiro argumento do comando (=0) e adiciona
o segundo argumento (=0.1) a` primeira posicao para formar a segunda posicao, e assim
de seguida, parando quando obtem o maior valor que nao exceda o terceiro argumento
(=1) do comando submetido.
Exemplo: y=0 : 0.201 : 1 gera os valores
0

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

Notar o efeito do ; na definic


ao da matriz.
Podemos aplicar v
arias operac
oes a matrizes, o que simplifica a programacao. Copiar
parte da matriz e trivial. Por exemplo, v=A(2,:) copia toda a 2a linha de A para o
vector v.
Qualquer elemento de uma matriz tem como endereco o n
umero da linha seguido pelo
n
umero da coluna, separados por uma vrgula. Por exemplo, se quisermos recuperar da
matriz o valor que est
a na posic
ao (3,1), o comando q=A(3,1) atribui 2 `a variavel q.
Verificar tal, entrando A(3,1) na linha de comando, sem o ;, para se ver no monitor a
resposta.
Uma das facilidades oferecidas pelo Matlab e a de podermos fazer operacoes com matrizes (quase) como sendo escalares. Por exemplo, multiplicar duas matrizes e feito com
um u
nico comando.
Vamos fazer uma c
opia de A multiplicada por 2, guardando em Ax2 com Ax2=2*A.
(Observa-se que a multiplicac
ao de uma matriz por uma constante e como se espera.)
Criada a nova matriz, a multiplicac
ao A*Ax2 e diferente de A.*Ax2. A 1a multiplicacao

e feita como se aprende em Algebra.


Exige compatibilidade de dimensoes: o n
umero de
o
colunas do 1 termo tem de ser igual ao n
umero de linhas do 2o .
A 2a multiplicac
ao e feita posic
ao-com-posicao, o que exige que as duas matrizes tenham
dimensoes identicas. Verificar.
Seja b=[ 5 -2 4]. O comando W=A*b da erro, pois as dimensoes nao sao compatveis,
como se pode verificar no Workspace ou na linha de comando com whos. Uma opcao e
W=A*b, onde a plica transp
oe o vector b e torna possvel a multiplicacao.

A divisao de matrizes tambem e possvel. Ha a divisao que se conhece de Algebra,


atraves do inverso de matrizes, e h
a a divisao posicao-com-posicao, que exige que as
matrizes tenham as mesmas dimens
oes e tambem que os elementos no divisor sejam
todos diferentes de zero.
O comando inv(Ax2)*A comeca por obter o inverso de Ax2, que normalmente se denota
como Ax21 , e depois o multiplica pela matriz A. Outra possvel operacao e Ax2./A,
onde a 1a matriz e dividida elemento-a-elemento pela 2a .
Operando com vectores e parecido: o comando v1 .* v2 multiplica os dois vectores
que devem ter dimens
oes iguais. Mas pode-se multiplicar dois vectores com dimensoes

diferentes, como se aprende em Algebra.


Exemplo: v1=[1 2] e v2=[3 4 5]. O produto
v1 * v2 cria a matriz 2 3, como se espera. Verificar.
Esta capacidade do Matlab de operar com matrizes e vasta e o leitor deve consultar
um manual e complementar com os in
umeros tutoriais que se encontram online. So a
leitura por si n
ao e suficiente na maioria dos casos. A pratica com o programa reforca
a aprendizagem.

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

Calcular o coseno e o seno dos elementos de t, a gravar em A e B, respectivamente


Fazer um gr
afico que mostre separadamente os dois perodos dos dois sinais
Na janela Command Window entra-se com o seguinte:
Comando a entrar

Observacao

t=0 : pi/15 : 4*pi;


A=cos(t); B=sin(t);
subplot(2,1,1)
plot(t, A)
grid
title(O meu coseno)
subplot(2,1,2)
plot(t, B)
title(O meu seno)
grid

Cria um vector com tamanho 1 61


Cria dois vectores cada com tamanho 1 61
Abre a janela Figure 1
Coloca um grafico na parte superior da Figure 1
Coloca uma grelha no grafico
Ttulo. Nota: usa-se uma plica e nao acento agudo ou grave
Cria um novo espaco na Figure 1 ja aberta
Coloca um grafico na parte inferior da Figure 1
Ttulo. Repetindo: usa-se uma plica ...
Coloca uma grelha nesse novo grafico

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

boa pratica evitar partiaceitam isso; outras n


ao conseguem ler. Resumindo: E
cularidades regionais.
o
Ha um pormenor que varia de instalac
ao para instalacao do Matlab a ser usada. E
caso quando se usa um PC no laborat
orio, contrastando com o pessoal. Tem a ver com
o local onde o sistema permite gravar ficheiros. No caso presente, deve-se verificar o
local onde ScriptBase.m foi gravado. Para saber qual e o local onde o Command Window
procura operar deve-se entrar pwd, que significa, present working window e obtemos o
endereco. Se queremos saber quais s
ao os scripts que a se encontram, usa-se o comando
dir ou ls e uma listagem resulta.
Assumindo que ScriptBase.m est
a no directorio local, para o correr pode-se usar (pelo
menos) dois metodos:
1) Da linha de comando, entrar ScriptBase, que e o nome sem a extensao .m ou entao
2) Abrir no editor o script e accionar a seta verde situada a meio da barra das ferramentas.
Qualquer dos metodos produz o mesmo efeito: executa linha-a-linha os comandos, tal
como fossem submetidos na janela Command Window.
A seguinte listagem e a do script, com umas funcionalidades adicionadas, que sao descritas depois do c
odigo.
clc
clear
f i d = fopen ( E s c r i t o D o S c r i p t 0 1 . 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 ) ;
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 )
grid
status = fclose ( f i d ) ;
As duas primeiras linhas da listagem consistem dos comandos clc e clear. O primeiro
limpa tudo o que exista na Command Window; o segundo limpa a memoria. Assume-se
aqui que esta limpeza n
ao prejudica os trabalhos.
A linha seguinte, que comeca com fid= ... cria um ponteiro para o ficheiro de texto
EscritoDoScript.txt, no qual o script supostamente escrevera algo. A parte final w
indica que o ficheiro ser
a criado, caso nao exista, quando se corre o script ou, caso ja

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

Ligar com a Command Window

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

O Matlab tem muitas func


oes nativas que, particularmente quando sao combinadas entre si, podem formar outras func
oes mais potentes. Por exemplo, a funcao max(vector)
devolve o valor m
aximo dos elementos do vector. Pode ser combinada com a funcao
abs() que calcula o m
odulo do(s) argumento(s). Evidentemente que o utente, se tal
deseje, pode sempre criar a l
ogica que tera o mesmo efeito.
O que nos interessa agora s
ao as func
oes (funcionalidades) que nao existam ou que o Matlab tenha mas cuja existencia se desconhece. Se num programacao existe uma sequencia
de linhas (bloco) que aparecem v
arias vezes, uma solucao para simplificar a leitura do
programa passa por criar um ficheiro `
a parte que contenha esse codigo repetido, criar
uma funcao e no programa fazer referencia ao ficheiro (funcao). O conceito e conhecido
de outras linguagens de programac
ao aprendidas.

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

base. Nas calculadoras h


a usualmente as duas funcoes ln() e log(), que correspondem
a logaritmo natural e logaritmo base 10, respectivamente.
NB: Aqui deve-se saber que a notacao usada no Matlab para log(N) e o logaritmo
natural e n
ao o logaritmo base 10, como na maioria das calculadoras. Se quisermos
o logaritmo base 10 do n
umero k, temos de usar log10(k). Verificar com o comando
log(10), que devolve 2.3026 e nao 1, como na calculadora.
Quanto a obter o logaritmo base A de um n
umero, se k = Ar , o logaritmo base A de
log(k)
k e r. Mas log(k) = r log(A) e r = log(A) . Neste calculo, o logaritmo usado pode ser o
natural ou o base 10.
Verificac
ao para k = 8 e a base A = 2. Qual e o logaritmo base 2 de 8? Usando a func
ao
2.0794
3 =8 e o
log do Matlab (=ln das calculadoras) vem r = log(8)
=
=
3.
De
facto,
2
0.6931
log(2)
log base 2 de 8 e 3.
O ficheiro para esta nova funcao contem
function [ r ] = LogOfKBaseA ( k , A )
% C a l c u l a t e s t h e l o g a r i t h m o f k u s i n g t h e b a s e A, e n t e r e d i n t h a t o r d e r
% Uses t h e l o g ( ) f u n c t i o n t o change b a s e s
% Arguments a r e k and A, s e p a r a t e d by ,
r=log ( k ) / log (A ) ;
end
Pode-se verificar que funciona na linha de comando e consta do Help.

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)

De notar que as func


oes f1 , f2 . . . da tabela, baseadas nas variaveis simbolicas, nao
fazem parte da lista da declarac
ao simb
olica.
No caso da func
ao ser de uma u
nica variavel, nao ha ambiguidade quanto `as derivadas.
Mas se for de duas ou mais, a vari
avel pretendida tem de ser especificada, para evitar
mal entendidos. Consultar help sym/diff para mais pormenores.
3 3
A 3a derivada de f (x) e obtida por diff(f,3), que no caso de f (x) = e 2 x devolve:
9*exp((3*x^3)/2)+(243*x^3*exp((3*x^3)/2))/2+(729*x^6*exp((3*x^3)/2))/8.
A verificacao deste resultado e deixada como exerccio a fazer.
A derivada parcial de u(x, y) com respeito a y e obtida por diff(u,y). Verificar.

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)

Submetendo int(v), que e a 3a linha da u


ltima tabela, devolve
ans = -C*R*V0*exp(-t/(C*R)), a ser verificado. Com limites especificados, que e o
4o integral, resulta o esperado: int(v,0,R*C) devolve -C*R*V0*(exp(-1)-1), o que
pode ser u
til na an
alise de circuitos basicos.
Se desejado, e possvel atribuir valores `as varias constantes que figuram nas func
oes
definidas. Isso e feito com subs(). Consultar pormenores com help sym/subs.
A substituic
ao ser
a feita de duas maneiras. Na 1a deixa-se a constante V 0 como
par
ametro: subs(int(v, 0, R*C), {R, C}, {1, 1}) leva a
ans = (1423408956596761*V0)/2251799813685248.
Esta resposta pode parecer errada `a primeira vista mas se for feita a divisao dos dois
n
umeros inteiros com 16 algarismos, o resultado e 0.6321 que, como se sabe da analise
o valor da tensao no fim de uma
de circuitos RC, est
a correcta e iguala 1 e1 . E
constante de tempo RC, assumindo um valor inicial de 1.
Fazendo uma segunda substituicao, desta vez atribuindo um valor de V 0 = 10, o resultado vem: subs(int(v, 0, R*C), {R, C, V0}, {1, 1, 10}) produz
ans = 6.3212
Para alem das substituic
oes, o que se pretende aqui demonstrar e que os resultados
da matem
atica simb
olica podem `as vezes tomar uma aparencia inesperada: 0.6321 foi
apresentado como a raz
ao de dois inteiros na ordem de 1016 .
Deve-se testar os outros integrais da tabela, substituindo valores para a1 , b1 e c1 , no
caso de f1 (x). Se a func
ao e de duais ou mais variavei, como u(x, y), o integral tem de
ser feito duas ou mais
vezes,
como esperado.
2
Para obter Idpl = 0 [ 0 u(x, y)dx]dy submete-se Idpl=int(int(u,x,0,pi ,y,0,2*pi)
e a resposta n
ao se faz esperar. Verificar.

2.5.3

Gr
aficos obtidos via Matem
atica Simb
olica

Considere o seguinte script e os dois graficos que o seguem.


close all
syms a1 b1 c1 x
f1= a1 + b1 *x + c1* x^2;
F1=subs(f1,{a1 b1 c1},{1 -2 1});
D1=diff(F1);
I1=int(F1);
Nx=71; xp=linspace(-2, 5, Nx);

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

Figuras geradas por Syms

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!

Figura 2.2: ... Com Texto.


Figura 2.1: Sem Texto e ...
O script acima usa as func
oes definidas previamente. (Em vez de entrar esta serie de
comandos na Command Window, para eventualmente serem abandonados, optou-se por
escrever um script, aqui transcripto.)
NB: A linha F1p=double(subs(F1,x,xp)); torna o resultado em dupla precisao, se
necessario. Para este caso simples, se for usado F1p=subs(F1,x,xp); o codigo tambem
funciona.
No caso de f1 (x), uma vez conhecidos os valores de a1 , b1 e c1 , o grafico da funcao f1 (x)
pode ser gerado para o intervalo que se deseje.
Por defeito, a janela que o Matlab abre para criar um grafico e numerada sequencialmente: se a u
ltima aberta levou o n
umero N, a proxima sera a N+1. O utente

24

CAPITULO 2. OPERAC
OES
BASICAS
DO MATLAB

pode sempre indicar o n


umero atribudo `a janela, para facilitar a programacao. Neste
caso, com dois gr
aficos muito semelhantes, sao-lhes atribudos os dois n
umeros 10 e 20,
tornando-se mais f
acil coordenar a parte do programa que gera a figura, para eventuais
mudancas.
A Figura 2.1 foi gerada com um u
nico comando plot(), que vem depois da linha com

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

Excel: Importar e Exportar

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.

2.6. EXCEL: IMPORTAR E EXPORTAR

25

Eis um exemplo de importac


ao para o Matlab. A folha Goes2Matlab.xls tem valores
que ocupam cinco linhas e tres colunas proximo da origem. Por exemplo, a informacao
comeca na celula B3 da folha, indo ate `a celula D7. Os valores sao como mostra a
seguinte tabela.
Ind
1
2
3
4

Val1
-70
-68
-66
-64

Val2
1.44
1.47
1.49
1.50

A importacao dos conte


udos desta folha para o Matlab e feita pelo comando
[A,B,C]= xlsread(Goes2Matlab.xls);
Neste comando A, B e C s
ao tres matrizes que irao conter o seguinte:
A contem os valores numericos da folha. Portanto, copia a regiao B4 ate `a D7,
ignorando a linha 3 que s
o contem texto.
B contem o texto que aparece na folha: linha 3.
C Mostra a estrutura composta da folha, com valores numericos e texto.
Uma vez importada a informac
ao da folha para as tres matrizes, podemos manipular os
dados dentro do Matlab, como de costume.
A criacao de uma folha Excel, de dentro do Matlab, e mais complicada, pois exige um
server para se ligar com a instalac
ao local do Excel. Com o server a correr, a exportacao
faz-se com tres comandos, como mostra o exemplo copiado do Help:
Create an Excel file for use in the examples that follow:
values = {1, 2, 3 ; 4, 5, x ; 7, 8, 9};
headers = {First, Second, Third};
xlswrite(myExample.xlsx, [headers; values]);
Este topico est
a alem do que se pretende cobrir aqui. O interessado deve consultar a
literatura, comecando com o Help.

Anda mungkin juga menyukai