Documente Academic
Documente Profesional
Documente Cultură
Pgina 1 de 31
1 Breve Introduo
O Octave uma linguagem de programao de alto nvel, destinada ao tratamento de problemas para
computao numrica. O interface com o programador efectuado atravs de uma linha de comando.
O Octave pode efectuar clculos aritmticos com reais, escalares complexos e matrizes; resolver sistemas de
equaes algbricas; integrar funes sobre intervalos finitos e infinitos e integrar sistemas de equaes
diferenciais ordinrias e diferenciais algbricas.
Permite gerar para o ecr e para a impressora grficos 2D e 3D, utilizando o Gnuplot.
O Octave em grande parte compatvel com o MatLab.
Este documento constitui um breve resumo do manual do Octave que pode ser consultado em
http://www.octave.org/doc/octave_toc.html ou localmente em
http://www.di.fct.unl.pt/cursos/icp/downloads/octave.pdf.
2 Utilizao do sistema
Nesta seco apresentar-se- o Octave como uma ferramenta de clculo para problemas de computao
numrica. O seu objectivo descrever o funcionamento geral da aplicao, enquanto linguagem de linha de
comando.
O Octave (http://www.octave.org) uma aplicao desenvolvida utilizando uma filosofia OpenSource. A
principal vantagem deste tipo de aplicaes relativamente aos seus equivalentes comerciais (nomeadamente do
MatLab, http://www.mathworks.com/) o custo: as ferramentas OpenSource so de utilizao livre, estando
inclusive o seu cdigo fonte disponvel para o pblico em geral. Assim aplicaes com este tipo de licena,
podem ser livremente distribudas e instaladas em qualquer computador. O cdigo fonte da aplicao est
igualmente disponvel, o que fornece uma garantia de qualidade e robustez, sendo ainda possvel adaptar ou
estender a prpria aplicao para a soluo de determinados problemas. Podem ser obtidos mais detalhes sobre
as ferramentas desenvolvidas com este tipo de licena, consultando http://www.gnu.org/philosophy/freesw.pt.html.
O Octave uma ferramenta desenvolvida para o Sistema Operativo Linux (http://www.linux.org), sendo
actualmente distribuda com as principais verses deste sistema operativo. A sua utilizao no ambiente
Windows igualmente possvel atravs da utilizao da ferramenta Cygwin (http://www.cygwin.com), a qual
fornece um ambiente de emulao da plataforma Linux sobre Microsoft Windows.
Pode efectuar-se o download do Octave para MS-Windows quer da pgina da cadeira
(http://di.fct.unl.pt/cursos/icp), quer directamente, do site http://sourceforge.net/projects/matlinks. A instalao
do Octave num computador equipado com sistema operativo Windows XP, NT ou 2000, dever ser
relativamente simples. A instalao igualmente possvel nos sistemas MS-Windows 95/98 e Me, no entanto
nestes ltimos por vezes ocorrem problemas.
Aps efectuar o Download do programa de instalao, bastar executar este programa e o Octave ser
instalado no seu computador. Em caso de dificuldades, o site indicado para obter mais informao para
resoluo de problemas relativamente instalao do Octave sobre plataformas Windows
http://octave.sourceforge.net/Octave_Windows.htm.
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 2 de 31
De seguida dever ser apresentada a linha de comandos do Octave com uma aparncia semelhante seguinte
figura:
Contrariamente aos ambientes grficos normalmente disponveis no Windows, o Octave caracteriza-se por
receber os seus comandos directamente da linha de comandos (ou Prompt). Na linha de comando, o sistema
indica que aguarda um comando apresentando (por omisso) o texto "octave:1>" seguido de um cursor a
piscar.
Aps este prompt possvel escrever os comandos que controlam a aplicao. Dever introduzir cada
comando separadamente e seguido pela tecla [Return]. Num ambiente grfico os comandos so especificados
ao computador atravs de aces do rato sobre smbolos (ou cones) visuais. Numa linha de comandos os
comandos devem ser especificados atravs do teclado.
No exemplo anterior foi introduzido (pelo utilizador) um comando simples: 5+5
Tendo o computador dado a resposta (resultado): ans = 10
Seguida do prompt pedindo novo comando: octave:2>
fcil utilizar o Octave como calculadora. Eis alguns exemplos auto-explicativos:
octave:9> 2+3
ans = 5
octave:10> 2-2
ans = 0
octave:11> 2*2
ans = 4
octave:12> 2/3
ans = 0.66667
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 3 de 31
octave:13> 5*5*5
ans = 125
octave:14> 5^3
ans = 125
octave:15> 5^2.5
ans = 55.902
octave:16> 8\3
ans = 0.37500
octave:17> 2\4
ans = 2
octave:18> 3*(23+14.7-4/6)/3.5
ans = 31.743
octave:19> 5^-3
ans = 0.0080000
O nico comando menos usual a diviso esquerda, a qual pode ser facilmente compreendida com a
igualdade x/y y\x.
De igual forma podem ser utilizados comandos um pouco mais complexos, envolvendo funes. As seguintes
funes elementares de clculo podero ser utilizadas:
octave:20> sqrt(5)
ans = 2.2361
raz quadrada
octave:21> log10(1000)
ans = 3
logaritmo base 10
octave:22> log(e^10)
ans = 10
logaritmo neperiano
octave:23> pi
pi = 3.1416
constante pi
octave:24> sin(pi/6)
ans = 0.50000
seno
octave:25> cos(0)
ans = 1
coseno
octave:26> tan(pi/4)
ans = 1.0000
tangente
octave:27> sin(pi)
ans = 1.2246e-16
octave:28> 30*pi/180
ans = 0.52360
octave:29> sin(ans)^2+cos(ans) utilizao de valor anterior em
clculo
^2
ans = 1
Repare-se que sin(pi) no calculado como zero! Tal deve-se a um erro de clculo do prprio computador.
O nmero apresentado no entanto muito prximo de zero: 1.224510-16. Trata-se de um erro de aproximao
do algoritmo de clculo do seno. Normalmente este nmero varia de computador para computador, mas est
sempre presente quando se efectuam clculos reais. Note-se alis que possvel calcular a preciso de um
resultado, para tal utiliza-se o comando format:
octave:61> pi
pi = 3.1416
contante pi
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
pi = 3.14159265358979
Pgina 4 de 31
octave:69> format
octave:70> pi
pi = 3.1416
Em geral os interfaces por linha de comandos so menos intuitivos que os interfaces grficos, pois exigem do
seu utilizador a memorizao de um conjunto de palavras chave. No entanto, aps o perodo inicial de
adaptao os interfaces de linha de comandos revelam-se bastante mais fiveis e fceis de descrever: o nmero
de formas distintas de entrar um mesmo comando muito menor, sendo o nmero de aces de gesto de
interface reduzidas ao mnimo. Compreende-se pois que seja muito mais fcil descrever a interaco com uma
ferramenta deste tipo que a interaco com uma ferramenta visual. Por ser igualmente mais difcil entrar
comandos no intencionais, igualmente muito mais claro qual foi a aco que deu origem a um determinado
erro.
A maior vantagem desta forma de interaco no entanto a de permitir ao utilizador especificar sequncias no
elementares de comandos simples. assim possvel a definio de comandos extremamente complexos. Este
tipo de utilizao ser descrito no prximo captulo.
Neste captulo vamos centrar-nos na aprendizagem dos comandos elementares. Durante o estudo deste texto,
muito importante testar cada um dos comandos isoladamente, para melhor se compreender a que se deve cada
erro. Basta escrever mal uma letra, ou esquecer um dos espaos necessrios num comando para que este no
seja entendido pelo computador e d origem a um erro.
Tal como na generalidade dos interfaces com prompt de comando, possvel navegar pelo histrico de
comandos, bem como pesquisar comandos antigos. De seguida so apresentadas algumas das teclas utilizadas
no Octave para facilitar (e tornar mais rpida) a entrada e alterao de comandos:
z
z
z
z
z
z
z
Convm igualmente referir a possibilidade de o computador comear a executar clculos muito longos ou
mesmo que no terminem. Nesse caso h um conjunto de teclas destinado a indicar ao computador que deve
interromper os seus clculos e voltar a apresentar a linha de entrada de comandos. Para interromper qualquer
calculo no Octave, bastar manter pressionadas em simultneo a tecla Ctrl e a tecla c (i.e. CTRL-c).
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 5 de 31
H igualmente alguns comandos de controle do prprio Octave que pode ser til conhecer: o comando help,
o comando history, o comando run_history e o comando exit.
O comando help, apresenta um manual on-line referindo todos os possveis comandos do Octave. Pode ser
seguido do texto de outro comando, como por exemplo: octave:1> help exit
O comando history possibilita ao utilizador visualizar os comandos que entrou at ao momento.
O comando run_history <numero_inicial> <numero_final> possibilita ao utilizador repetir comandos
anteriores. Veja-se o exemplo:
octave:100> history
...
22 5*5
23 3+2;
24 5+5
...
octave:101> run_history 22 24
ans = 10
ans = 5
ans = 25
1
5
21
2
8
34
Como se pode observar , representando novas colunas e os ; representando novas linhas. Podemos igualmente
definir uma matriz como o retorno de uma funo, neste caso uma funo que retorna uma matriz com 3 linhas
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 6 de 31
As variveis iniciadas por dois sinais de underscore seguidos esto reservadas para utilizao do sistema. No
devem pois ser utilizadas, excepto se se souber exactamente o que se quer fazer.
H igualmente um conjunto de variveis de sistema que disponibilizam informaes relevantes sobre o
sistema. Por agora apenas necessitaremos de utilizar a varivel ans - ltimo valor calculado.
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 7 de 31
Podemos igualmente criar novas matrizes contendo esta. O nico cuidado a ter manter o nmero de linhas e
colunas constante. Ser fcil definir as matrizes:
Correcto
Errado
octave:4> [ a, a ]
ans=
1 1 2 1 1 2
3 5 8 3 5 8
13 21 34 13 21 34
octave:4> [ a, a; a]
octave:5> [ a; a ]
error: number of columns must match (3 != 6)
ans=
1 1 2
3 5 8
13 21 34
1 1 2
3 5 8
13 21 34
Podemos consultar uma dada posio ou submatriz numa matriz especificando os ndices das respectivas
dimenses num tuplo. Como pode observar nos seguintes exemplos (assumindo a matriz a anteriormente
definida)
octave:14> a(1,2)
ans = 1
octave:15> a(1,[1,2,3])
ans =
1 1 2
octave:16> a([1,2,3],2)
ans =
1
5
21
Repare-se, nos 2 e 3 exemplos, na utilizao dum vector para indicar, respectivamente, as colunas e linhas a
seleccionar.
A necessidade de especificar sries enquanto vectores to grande, que existe um operador especifico para o
fazer:
octave:1> 1:5
ans =
1 2 3
octave:2> 1:3:11
ans =
1 4 7 10
LIMITE_INFERIOR:PASSO:LIMITE_SUPERIOR
O valor de PASSO pode ser omitido (ser considerado a 1 por omisso). H ainda outra simplificao s
sries, quando utilizados como ndices de matrizes. Neste caso, como sabemos o limite inferior e superior
podemos utilizar apenas o sinal : para especificar toda uma linha ou toda uma coluna da matriz original:
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 8 de 31
5 8
1 2
5 8
21 34
O tamanho da matriz pode igualmente ser obtido com a funo size (retorna o nmero de linhas e colunas):
octave:24> size(a)
ans =
3 3
octave:25> size(ans)
ans =
1 2
octave:26> ans(1)
ans = 1
Por fim resta referir que o operador de atribuio permite alterar posies numa matriz, podendo ser utilizada a
matriz vazia ([]) para apagar linhas ou colunas:
octave:51> a(:,1) = [ 1; 2; 0 ]
a =
1 1 2
2 5 8
0 21 34
octave:52> a(1,:) = 1:10:30
a =
1 11 21
2 5 8
0 21 34
octave:53> size(a)
ans =
3 3
octave:54> a(1,:) = []
a =
2 5 8
0 21 34
octave:55> size(a)
ans =
2 3
octave:56> a(:,1)= []
a =
5 8
21 34
octave:57> size(a)
ans =
2 2
Com pares de valores, podemos igualmente atribuir variveis dentro de uma matriz:
octave:58> [la,ca] = size(a)
la = 2
ca = 2
Resumo
z
z
z
z
z
Definio de matrizes.
Variveis.
Comandos who e clear sobre variveis.
Construo de matrizes compostas.
Seleco de submatrizes.
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
z
z
z
z
Pgina 9 de 31
2.4 Strings
Uma constante do tipo String uma sequncia de caracteres entre " ou '. Em Octave uma string pode ter
qualquer tamanho. Eis um exemplo:
octave:1> a= "uma cadeia de caracteres"
a = uma cadeia de caracteres
Se tentarmos definir uma matriz com vrias strings numa mesma linha acabamos por obter uma string com a
juno das vrias strings base:
octave:2> ["Uma string e",a]
ans = Uma string euma cadeia de caracteres
De facto as strings so vistas internamente como vectores linha contendo caracteres. As linhas de uma matriz
de strings tm forosamente a mesma dimenso. assim possvel utilizar os operadores:
octave:3> ["123";"3"]
ans =
123
3
octave:4> a(1:7)
ans = uma cad
Exemplo
octave:5> findstr("abcabcabdad","ab")
findstr(s,t) : Encontra todas as posies
ans =
de t em s
1 4 7
split(s,t) : Divide uma string num
octave:6> split("abcabcabdad","ab")
ans =
c
c
dad
octave:6> strrep("abcabcabdad","ab","AB")
ans = ABcABcABdad
octave:7> str2num("555") + 5
ans = 560
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 10 de 31
Na pgina 40 (captulo 5) do manual de Octave poder obter mais informao sobre outras funes para a
manipulao de Strings.
octave:39> ones(3,2)
ans =
1 1
1 1
1 1
octave:38> eye(3,2)
ans =
1 0
0 1
0 0
octave:40> zeros(2,4)
ans =
0 0 0 0
0 0 0 0
Matriz transposta
Para converter linhas em colunas bastar aplicar o operador ' a uma matriz:
octave:41> ones(3,2)'
ans =
1 1 1
1 1 1
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 11 de 31
Neste exemplo, na linha 4 (2 termo), construmos uma matriz contendo na primeira linha um conjunto de
resultados analticos, na segunda dados observados (numricos) e na terceira zeros. Devido primeira matriz,
construiu-se uma matriz tudo, contendo as primeiras 2 linhas da matriz do 2 termo e no fim a subtraco da 1
linha pela 2 linha.
A linha 5 um pouco mais sofisticada. A ideia base obter apenas a ltima linha da varivel tudo num vector
linha. Para tal, primeiro anulam-se todos os elementos das duas primeiras linhas, e depois com uma matriz de
uns, retira-se apenas a ltima linha. Depois multiplica-se o resultado por um vector linha contendo uns, para
obter o somatrio de todos os elementos. Obviamente trata-se de um simples exerccio para ilustrar as
potencialidades do produto de matrizes. A soluo Octave seria bem mais simples: tudo(3,:)
A linha 6 limita-se a transformar a ltima linha da matriz tudo num valor percentual.
Tal como o produto, a potenciao de matrizes (que s pode ser aplicada a matrizes quadradas), limita-se a
efectuar o produto de uma matriz por ela prpria n vezes.
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 12 de 31
Note-se o operador .^ que eleva todos os elementos da matriz (individualmente) a L. Comandos semelhantes
so o produto pontual e a diviso pontual:
octave:66> A.*[zeros(1,3) ; ones(2,3)]
ans =
0 0 0
4 5 6
7 8 9
octave:67> A./(ones(size(A))/2)
ans =
2 4 6
8 10 12
14 16 18
A aplicao da regra de Cramer (onde se substitui as colunas de A, correspondentes a cada xi, por B de modo
a obter 3 matrizes, dividindo-se o determinante de cada matriz obtida pelo determinante de A), pode ser feita da
seguinte forma:
octave:84> D1=A; D1(:,1) = B
D1 =
4 2 3
5 3 4
1 2 5
octave:85> D2=A; D2(:,2) = B
D2 =
1 4 3
2 5 4
4 1 5
octave:86> D3=A; D3(:,3) = B
D3 =
1 2 4
2 3 5
4 2 1
octave:87> X=[det(D1); det(D2); det(D3)] / det(A)
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 13 de 31
X =
-1.40000
1.80000
0.60000
octave:88> A*X-B
ans =
0.0000e+00
0.0000e+00
-9.9920e-16
Eliminao Gaussiana: Podemos obter o mesmo resultado utilizando o operador \ (eliminao Gaussiana):
octave:89> X =A \ B
X =
-1.40000
1.80000
0.60000
Inverso de Matrizes
A inverso de uma matriz feita com o comando inv(M).
octave:90> inv( A )
ans =
-1.40000
0.80000
-1.20000
1.40000
1.60000 -1.20000
octave:90> A * inv( A )
ans =
1.00000
0.00000
0.00000
1.00000
0.00000 -0.00000
0.20000
-0.40000
0.20000
0.00000
0.00000
1.00000
2.5 Grficos
Os grficos em Octave utilizam uma ferramenta OpenSource especialmente dedicada gerao de grficos: o
GnuPlot. O Octave comunica com o gnuplot com duas funes base (sobre as quais as restantes so
implementadas), estas funes so descritas nas pginas 125 (gplot) e 131 (gsplot). Na prtica iremos apenas
utilizar funes de mais alto nvel (desenvolvidas com recurso s funes elementares apresentadas).
Grficos simples
Na sua forma mais simples, a funo plot apresenta um grfico dos valores de dois vectores linha,
correspondendo ao eixo dos X e Y:
octave:19> x = 0:pi/90:4*pi;
octave:20> y = sin(x);
octave:21> plot(x,y)
Neste momento dever ser aberta uma nova janela contendo o grfico. Poder ter que utilizar o sistema
operativo para ver esta janela (bastar carregar conjuntamente em ALT-TAB). Poder alterar os parmetros do
grfico com funes adicionais. Para visualizar as alteraes ter que executar o comando replot:
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
octave:29>
octave:30>
octave:31>
octave:32>
Pgina 14 de 31
xlabel('x,radianos');
ylabel('sin(x)');
grid;
replot
De facto, a funo plot pode ter diversos comportamentos distintos, consoante o tipo de argumentos utilizados.
Para mais detalhes consultar o manual do Octave pgina 127.
Duas funes grficas tambm bastante utilizadas so: bar e hist :
octave:34> clearplot;
octave:35> bar([20,10,30,15,30,30,40])
O primeiro
argumento
octave:36> clearplot
da funo
octave:37> a = [10,10,10,20,20,30];
contm a
octave:38> hist(a,[1,10,20,30])
amostra de
valores.
O segundo,
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 15 de 31
o centro de
distribuio.
clearplot
m = 0.1;
phi = 0:pi/60:4*pi;
r = exp(m*phi)
polar(phi,r)
Grficos Sobrepostos
Antes de cada comando, o Octave, por omisso, limpa a janela de grfico. Caso se pretendam comparar
diversos grficos pode ser utilizado o comando hold on para sobrepor grficos:
octave:71>
octave:72>
octave:73>
octave:74>
octave:75>
clearplot
hold on
x = -5*pi:pi/90:5*pi;
y1 = sin(x);
y2 = cos(x);
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
octave:76>
octave:77>
octave:78>
octave:79>
Pgina 16 de 31
y3 = sin(x)+2*cos(x);
plot(x,y1)
plot(x,y2)
plot(x,y3)
Note igualmente que pode utilizar directamente os menus na janela do GnuPlot para alterar o seu grfico.
Se quiser apresentar vrios grficos numa mesma janela poder utilizar as funes multiplot e
subwindow:
octave:93> multiplot(2,2)
octave:94> subwindow(1,1)
octave:95> xlabel("x, radianos")
octave:96> ylabel("sin(x)")
octave:97> title("G1")
octave:98> plot(x,y1)
octave:99> subwindow(2,2)
octave:100> ylabel("cos(x)")
octave:101> title("G2")
octave:102> plot(x,y2)
octave:103> subwindow(1,2)
octave:104> plot(x,x.*x)
octave:105> subwindow(2,1)
octave:106> plot(x,sqrt(x))
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 17 de 31
Grficos 3D
A criao de um grfico 3D necessita da definio de uma matriz de valores sobre os quais a funo vai ser
avaliada. Tal pode ser conseguido com a funo meshdom:
octave:30> clearplot
octave:31> x = -10:0.5:10;
octave:32> [X,Y]=meshdom(x,x);
hold on
grid
mesh(X,Y,-sqrt(X.^2+Y.^2)*5+40)
mesh(X,Y,X.^2+Y.^2)
2.6 Exerccios I
1- Escrever numa matriz de 15 colunas e 1 linha, os quadrados dos primeiros 15 naturais (1, 4, 9 ...).
octave:1> (1:15).^2
2- Escrever numa matriz de 15 linhas e 1 coluna, os cubos dos primeiros 15 naturais (1, 8, 27 ...)
octave:2> [(1:15).^3]'
3- Escrever numa tabela de 15 linhas por 3 colunas, os primeiros 15 naturais na 1 coluna; os quadrados dos
primeiros 15 naturais na 2 e os cubos dos primeiros 15 naturais na 3 coluna.
octave:3> seq=(1:15)
octave:4> [seq; seq.^2; seq. ^3]'
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 18 de 31
4- Dado que a converso de graus Fahrenheit para graus Clcios se faz com a seguinte frmula C= (5/9) . (F 32). Coloque em tabela as converses para as temperaturas de 0F, 25F,..., 250F.
octave:5> faixa = 0:25:250
octave:6> [faixa;(5/9)*(faixa-32)]'
5- Faa uma tabela que traduza graus Clcios em graus Fahrenheit. Coloque em tabela as converses para as
temperaturas de -200C, -175C,..., 200C.
octave:7> faixa= -200:25:200
octave:8> [faixa; faixa * (9/5) + 32]'
6- Considere o problema "Quem quer ser milionrio ?" j conhecido. Resolva o seguinte utilizando Octave:
6.1- Qual o valor do saldo ao longo dos anos?
octave:9> limite=10
octave:10> cap_inicial=5000000
octave:11> periodo=0:10
octave:12> taxa=1.05
octave:13> [periodo; cap_inicial * (taxa.^periodo)]'
6.2- Junte uma coluna que indique o ganho (relativo ao ano aterior) ao longo dos anos.
octave:14>acumulado = cap_inicial * taxa .^ periodo
octave:15>ant_acumulado = [cap_inicial,acumulado(1:limite)]
octave:16>evoluo=[periodo; acumulado; acumulado - ant_acumulado]'
Ou
octave:18>ganho_total = evoluo(2,limite+1) - cap_inicial
3 Programao
Como j foi visto anteriormente, o Octave permite ao utilizador especificar instrues atravs de uma linha de
comando. Nesta seco vamos elaborar um pouco mais o tipo de instrues que podem ser executadas e
introduzir algumas noes bsicas de programao. Assim, os objectivos desta seco so os seguintes:
1. Compreender os conceitos bsicos de programao, e saber quais os comandos Matlab/Octave que os
implementam;
2. Dado um problema de engenharia concreto, conseguir determinar qual a sequncia de comandos da
linguagem MatLab/Octave a utilizar;
3. Implementar essa sequncia de comandos sobre a forma de um Script;
4. Conseguir depurar os erros desse Script, e adaptar o cdigo desenvolvido a novos problemas de
Engenharia.
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 19 de 31
Mecanismo sequencial
Entende-se como mecanismo sequencial, uma forma de expressar atravs de uma linguagem que a aco 1
deve ser executada antes da aco 2. Na maior parte das linguagens de programao o mecanismo sequencial
surge como uma simples enumerao das aces a executar, da esquerda para a direita, de cima para baixo.
Mecanismo condicional
O mecanismo condicional permite expressar uma situao em que se pretende que: caso uma condio se
verifique, seja executada uma aco (aco 1), caso essa mesma condio no se verifique seja executada uma
outra aco (aco2). S uma das aces executada!
Mecanismo de repetio
O mecanismo de repetio da linguagem permite expressar a necessidade de uma determinada aco, ou
conjunto (bloco) de aces ser repetida um certo nmero de vezes. Tipicamente essa aco (ou conjunto de
aces) repetida at que uma condio de paragem se verifique.
A maior parte das linguagens de programao, so linguagens que possuem os mecanismos anteriormente
referidos, e que permitem que as sequncias de aces expressas atravs da linguagem possam ser
transformadas em sequncias de comandos passveis de serem executadas por um computador. No entanto, h
linguagens adaptadas s mais diversas funes: um Professor pode gostar de ensinar futuros programadores a
programar utilizando a linguagem Pascal, pois esta uma linguagem desenhada explicitamente para ensinar a
programar. De igual forma, um tcnico de bases de dados pode gostar de especificar o seu problema utilizando
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 20 de 31
SQL, uma linguagem explicitamente virada para pesquisas em grandes volumes de informao (e que
correntemente utilizada nas principais bases de dados como por exemplo ORACLE, DB2 da IBM ou o SQL
Server da Microsoft).
O Octave permite a elaborao de programas, expressos na linguagem matlab. Linguagem essa que possui os
mecanismos de programao anteriormente expressos.
3.2 Instrues
Em Octave, instrues (ou comandos) podem ser uma simples expresso constante (x= 2;) ou uma lista de
comandos que por sua vez podem conter outros comandos. Nesta seco so descritos os comandos que iro
permitir a elaborao de programas em Octave, em particular os mecanismos de controlo de fluxo
(mecanismos de condio e de repetio). Os mecanismos de controlo de fluxo permitem controlar o fluxo de
execuo de um programa. Todos eles comeam e terminam com uma palavra chave.
Condio
Uma condio uma expresso Booleana - pode por isso tomar um de dois valores Verdade (true) ou Falso
(false). Essa expresso pode ser uma expresso simples ou agregar outras expresses atravs de operadores
Booleanos.
Operadores de comparao
Como exemplo de expresses simples tem-se as operaes envolvendo os operadores de comparao:
x < y
x <= y
x == y
x >= y
x > y
x != y
x ~= y
x <> y
Os operadores de comparao comparam dois valores numricos - se a relao for verdadeira o resultado 1
caso contrrio 0.
Alguns exemplos:
octave:1> x=2
x = 2
octave:2> x > 4
ans = 0
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 21 de 31
0 1
1 0
octave:7> index("file.txt",".")!=5
ans = 0
Operadores Booleanos
Uma expresso Booleana uma combinao de expresses de comparao utilizando os operadores Booleanos
"ou" ('||'), "e" ('&&') e a "negao" ('!'). Descrio sumria dos operadores:
operador ou (or): o resultado verdade se pelo
menos uma das expresses for verdade (true)
operador e (and): o resultado verdade se e s se
todas as expresses forem verdade
operador negao (not): o resultado verdade se a
expresso for falsa (false)
Booleano1 ||
Booleano2
Booleano1 &&
Booleano2
! Booleano1
~ Booleano1
A instruo if
O comando if um comando de condio. Em Octave a sintaxe deste comando a seguinte:
Sintaxe
if (condio)
bloco
endif
Exemplo
if ( x > y)
y = y+1
x = 1
endif
Descrio
o bloco de instrues (y=y+1 e x=1) s
cumprido se a condio (x>y) for
verdadeira (=1)
Em que o bloco pode ser um comando ou uma lista de comandos (inclusive outro if).
Na condio (x>y) feita uma comparao entre o valor de x e de y, pelo que se pressupe que estas variveis
foram previamente definidas, ou seja que lhes foi anteriormente atribudo um valor. O mesmo se passa com
instrues do bloco, por exemplo em y=y+1.
Outra forma do comando if:
Sintaxe
if (condio)
bloco1
else
bloco2
endif
Exemplo
if ( x > y)
maior =x
else
maior =y
endif
Descrio
se a condio for verdadeira, o
bloco1 executado; seno,
cumprido o bloco2
A instruo while
O comando while um comando de repetio (loop), ou seja, leva a que uma determinada zona de cdigo
seja executada enquanto determinada condio se verificar.
Em Octave a sintaxe deste comando a seguinte:
Sintaxe
Exemplo
Descrio
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 22 de 31
A condio vai controlar o nmero de vezes que o ciclo vai ser executado. Se a condio for inicialmente falsa,
o bloco de instrues nunca ser executado. Tenha em ateno que se a condio no convergir para falso o
ciclo nunca terminar.
Analise o seguinte exemplo, que cria uma varivel fib que contm os elementos da sequncia de Fibonacci.
Exemplo
Descrio
A varivel i inicializada com o valor 3.
fib = ones(1,10);
O while testa se o valor de i menor do que 10 - se for
i = 3;
verdade, o i-simo elemento de fib fica com o valor da
while ( i <= 10)
fib(i)=fib(i-1)+fib(i-2) soma dos dois anteriores elementos e o valor de i
incrementado.
i = i+1;
Este ciclo vai ser repetido enquanto a condio se verificar,
endwhile
termina quando i atinge o valor 11.
A instruo for
O comando for tambm um comando de repetio, tal como o while. Este comando utilizado quando se
pretende contar o nmero de iteraes de um ciclo. A sua sintaxe a seguinte:
Sintaxe
for var = expr
bloco
endfor
Exemplo
for i=1:10
y = y+1
endfor
Descrio
O bloco de instrues (y=y+1) vai ser executado 10
vezes (incio do ciclo em 1 e fim em 10).
o valor da varivel i vai sendo incrementado
automaticamente em cada passagem (o valor do
passo neste caso 1).
Outros exemplos utilizando como domnio para a varivel de iterao um vector e uma matriz:
Exemplo 1
octave:1> x=[2,4,10,14];
octave:2> for i=x
> v = i
> endfor
v = 2
v = 4
v = 10
v = 14
octave:3>
Exemplo 2
octave:3> y=[2,4;10,12]
y =
2
4
10 12
octave:4> for i=y
> m = i
> endfor
m =
2
10
m =
4
12
octave:5>
Analise o exemplo da gerao da srie de Fibonacci, mas recorrendo agora utilizao do comando for.
Exemplo
fib = ones(1,10);
Descrio
Inicialmente avaliada a expresso '3:10', para gerar um
intervalo de valores de 3 a 10 inclusive. Seguidamente, a
varivel i toma o valor inicial do intervalo (3) e o bloco de
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 23 de 31
for i = 3:10
instrues executado a primeira vez. No final da execuo do
fib(i)=fib(i-1)+fib(i-2) bloco, a varivel i toma o prximo valor do intervalo e o bloco
endfor
A instruo break
O comando break permite parar uma instruo de repetio (while ou for) e saltar para a prxima linha de
cdigo do programa. Este comando s pode ser utilizado dentro de um ciclo.
Exemplo
Descrio
for i=1:10
Neste exemplo, temos um ciclo que ir ser executado 10 vezes,
y = y + i
if ( y == 6 ) se a condio y==6 no ocorrer. Se durante a execuo do ciclo
break
essa condio se verificar, a instruo break ser executada e o
endif
ciclo de for quebrado, passando a execuo directamente para a
endfor
instruo seguinte ao ciclo (x=y).
x = y
Exemplo2
octave:3> y=0;
octave:1> y=0;
octave:4> for i=1:4
octave:2> for i=1:4 > y = y+10;
> y=y+10
> endfor
> endfor
octave:5> disp("O valor de y:"), disp(y)
y = 10
O valor de y:
y = 20
40
y = 30
octave:6> disp("O valor de y:"), y
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
y = 40
octave:3>
Pgina 24 de 31
O valor de y:
y = 40
octave:7>
Como se pode verificar no exemplo1, em cada iterao do ciclo enviado para o terminal o valor da varivel,
enquanto que no exemplo 2, o valor da varivel visualizado aps o final do ciclo utilizando o comando disp.
Compare a diferena entre a utilizao do comando disp(y) e a chamada y.
Para que no seja visvel no terminal ans=10 dever colocar ; no final do comando de input.
Ficheiros de entrada/sada
Para alm da interaco directa com o utilizador atravs do terminal, existe muitas vezes necessidade de ler
dados do exterior e armazenar os resultados que esto a ser produzidos pelo nosso programa. Este problema
surge normalmente quando o volume de informao envolvida possui uma dimenso considervel. O mais
apropriado nestas situaes armazenar a informao em ficheiros, para que esta possa ser facilmente
manipulada.
fid = fopen(nome_fich,modo)
Descrio
abre o ficheiro com o nome nome_fich, no
modo especificado no parmetro modo, e
devolve uma varivel fid, com o seguinte
formato:
fid =
{
id =
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 25 de 31
name =
mode =
arch =
status =
}
Em que:
id um valor inteiro que, a partir do momento
da abertura, vai identificar o ficheiro;
name o nome do ficheiro, deve ser igual ao
parmetro nome_fich;
mode o modo como o ficheiro foi aberto;
arch o tipo de interpretao pela
arquitectura;
status indica o estado em que se encontra o
ficheiro;
No caso de problemas na abertura, fid toma o
valor -1
fecha o ficheiro com o identificador fid.
fclose(fid)
A partir do momento da abertura, o ficheiro passa a ser reconhecido no nosso programa pelo seu fid.
Exemplo de utilizao:
Exemplo
Descrio
octave:4> f1=fopen("dados.txt","r")
f1 =
{
id = 3
name = dados.txt
mode = r
arch = native
status = open
}
octave:10> f2=fopen("tmp/dados2.txt","r")
f2 =
{
id = 4
name = tmp/dados2.txt
mode = r
arch = native
status = open
}
Abertura de um ficheiro j
existente para leitura, com o nome
"dados2.txt", que se encontra na
subdirectoria tmp da directoria
corrente.
octave:7> f3=fopen("teste.txt","r")
f3 = -1
Tentativa de abertura de um
ficheiro para leitura, mas em que
ocorreu um problema (por
exemplo, ficheiro no existente).
octave:8> f4=fopen("teste.txt","w")
f3 =
{
id = 5
name = teste.txt
mode = w
arch = native
status = open
}
Mais uma vez no se esquea que antes de poder escrever ou ler de um ficheiro h que garantir que este est
aberto. Quando terminar a manipulao de um ficheiro dever sempre fech-lo.
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 26 de 31
Descrio
fid=fopen("teste.txt","w");
str="Para teste a escrita em ficheiros\n"; Este exemplo abre ficheiro para escrita (se
fputs(fid,str)
ainda no existia, cria-o) e escreve em
fputs(fid,"segunda linha")
fputs(fid,"\n")
fputs(fid,"outra linha")
fclose(fid)
octave:14> fid=fopen("teste.txt","r");
octave:15> str1=fgetl(fid,100);
octave:16> str2=fgets(fid,100);
octave:17> str3=fgets(fid,4);
octave:18> fclose(fid);
octave:19> str1
str1 = Para teste a escrita em ficheiros
octave:20> str2
str2 = segunda linha
octave:21> str3
str3 = outr
octave:22>
printf(template, ...)
Para Escrita
escreve para o terminal de acordo
com a formatao especificada em
template
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 27 de 31
Para a leitura de ficheiros pode ser utilizada a funo fscanf. Tenha em ateno que a leitura em Octave est
pensada para a manipulao de matrizes de valores e no para a manipulao de ficheiros de texto.
Para Leitura
l do ficheiro fid, de acordo com
[val,count] = fscanf(fid, template, size) a formatao especificada em
template.
size indica o nmero de
elementos a ler.
Tem disponveis vrias converses de variveis, as mais usuais so: %d, inteiro com sinal; %f, real com sinal;
%s, string; %c, carcter.
Observe os seguintes exemplos de utilizao destas funes:
octave:1> nome="Antonio Silva";
octave:2> num=12753;
octave:3> nota=15.5;
octave:4> printf("Aluno %s num: %d nota %f \n",nome,num,nota); Escrita formatada para
Aluno Antonio Silva num: 12753 nota 15.500000
ecr
octave:5> m=[1 2 3; 4 5 6; 7 8 9];
octave:6> printf("%d ",m);
1 4 7 2 5 8 3 6 9
octave:7> fid=fopen("teste.dat","w");
octave:8> fprintf(fid,"%d ",m);
octave:9> fprintf(fid,"%d ",m*2);
octave:10> fclose(fid)
ans = 0
octave:11> fid2=fopen("teste.dat","r");
octave:12> x1=fscanf(fid2,"%d ",[3,3])
x1 =
1 2 3
4 5 6
7 8 9
octave:13> [x2,dim]=fscanf(fid2,"%d ",[3,3])
x2 =
2
4
6
8 10 12
14 16 18
dim = 9
octave:14> fclose(fid2);
octave:15> fid=fopen("teste.txt","r");
octave:16> x3=fscanf(fid,"%d ",10)'
x3 =
1
14
10
16
12
18
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 28 de 31
octave:21> m2=log(m)
m2 =
0.00000
1.38629
1.94591
0.69315
1.60944
2.07944
Escreve no ecr os
valores formatados
como reais.
O printf efectua um
ciclo sobre o template
de formatao, o que
pode levar a alguma
confuso (linha 23)
(O valor antes de f
indica o nmero de
casas decimais).
1.09861
1.79176
2.19722
3.4 Funes
A organizao do cdigo de modo a torn-lo mais verstil e estruturado deve ser um dos objectivos a ter em
mente aquando da elaborao de um programa.
Em Octave possvel ao utilizador/programador definir as suas prprias funes. Uma funo uma parte de
um programa identificada por um nome, possivelmente parametrizada, que corresponde a uma aco (ou
conjunto de aces) que pode ser executada mediante a sua chamada.
Na sua forma mais simples, uma funo pode ser:
Exemplo
Descrio
A partir do momento da sua declarao possvel
function msg_entrada
printf("Hoje est um lindo dia\n"); utilizar a funo. Para tal, basta executar o seu nome
endfunction
(msg_entrada) na linha de comando.
O exemplo anterior um exemplo muito simples, no possui parmetros de entrada nem retorna nenhum valor
de sada.
Exemplo
Descrio
Esta funo calcula a rea de um crculo, tem
um parmetro de entrada (raio) e retorna um
function ret_val = area_circ(raio) valor.
ret_val = pi*raio^2;
endfunction
Tenha em ateno que no caso da funo retornar um valor (caso tpico), este deve ser sempre (em qualquer
situao) afectado.
Errado
Correcto
O exemplo da esquerda no correcto porque no caso da condio (if) no se verificar, o valor de retorno no
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 29 de 31
afectado.
Uma funo pode retornar um ou mais valores. No caso de retornar mltiplos valores estes so especificados
segundo um vector, como pode ver no exemplo:
Exemplo
Descrio
Esta funo devolve o valor mximo de um vector e a posio que
function [max,idx] = vmax(v) ocupa.
idx = 1;
max = v(idx);
for i=2:length(v)
if ( v(i)> max )
max = v(i);
idx = i;
endif
endfor
endfunction
Ficheiros de funes
Na maior parte das vezes no prtico ter que definir todas as funes de cada vez que so necessrias. O que
deve fazer guard-las num ficheiro de forma a que possam ser facilmente consultadas e alteradas, caso seja
necessrio.
Para que o Octave reconhea um ficheiro como sendo um ficheiro de funo, dever logo no incio do ficheiro
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
Pgina 30 de 31
definir a funo. Ou seja, o primeiro comando a ser executado deve ser a declarao de funo. Apresenta-se
de seguida um ficheiro exemplo:
# funo que calcula a area de uma circunferencia
# dado o valor do seu raio.
function ret_val = area_circ(raio)
ret_val = pi*raio^2
endfunction
O Octave no necessita que o ficheiro de funo seja "chamado" antes de poder utilizar a funo, no entanto h
que garantir que o ficheiro colocado numa directoria onde o Octave o consiga encontrar. Porqu? O Octave
ao encontrar um identificador como sendo um nome de funo (e se no for uma que j se encontre
"carregada"), vai efectuar uma busca na lista de directorias especificadas na varivel LOADPATH de ficheiros
com extenso '.m' que possuam o mesmo nome da funo que pretende.
Dever portanto ter cuidado na atribuio do nome a um ficheiro de funo (i.e. se definir a funo area_circ o
ficheiro dever chamar-se 'area_circ.m').
Muitas das funes standard do Octave, como por exemplo funes estatsticas, de manipulao de
polinmios, de tratamento de sinais, etc..., esto definidas em ficheiros '.m'. Esses ficheiros encontram-se numa
subdirectoria do Octave \usr\local\share\octave\2.1.31\m.
Exemplo da utilizao de funes de polinmios definidas no Octave
octave:1> mypoly=[1,3,2,-1]
mypoly =
1
3
2 -1
octave:2> polyderiv(mypoly)
ans =
3 6 2
octave:3> polyinteg(mypoly)
ans =
0.25000
1.00000
1.00000
clculo da derivada
clculo do integral
-1.00000
0.00000
octave:4> polyval(mypoly,2)
ans = 23
clculo do valor do
polinmio (para x=2)
octave:5> roots(mypoly)
ans =
-1.66236 + 0.56228i
-1.66236 - 0.56228i
0.32472 + 0.00000i
octave:8> median(a)
ans =
3 5 8
octave:9> std(a)
ans =
octave:7> mean(a)
ans =
5.6667
9.0000
14.6667
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012
Octave - Documentao
6.4291
10.5830
Pgina 31 de 31
17.0098
octave:10> cov(a,a)
ans =
41.333
68.000 109.333
68.000 112.000 180.000
109.333 180.000 289.333
Para mais informao sobre funes oferecidas pelo Octave deve consultar o manual e/ou analisar a(s)
directoria(s) de ficheiros '.m'
http://ssdi.di.fct.unl.pt/~nmm/icp/material/aulas_praticas/octave/guia/guia_octave.html
31/03/2012