Laboratório Nacional de Computação Científica
Minicurso: Introdução ao Octave
Luiz AquinoMarço de 2010
Introdução O que é Octave?
É um programa para efetuar cálculos numéricos.
Ele possui um extensivo conjunto de ferramentas para o cálculo de problemas comuns como: cálculo de autovalores e autovetores, solução de sistema de equações, manipulação de polinômios, determinar raiz de equações não lineares, integração numérica, solução de equações diferenciais ordinárias, etc.
Quando surgiu? Em 1988, para auxiliar no desenho de reações químicas. Foi criado por James B. Rawlings da
Universidade de Wisconsin-Madison e John G. Ekerdt da Universidade do Texas. Em 1993, foi liberada a versão 1.0 e passou a ser uma ferramenta mais abrangente. Atualmante, está na versão 3.2.4.
Por que aprender? Devido a sua linguagem simples e intuitiva, torna mais rápida a implementação da solução de um
problema. Além disso, possui um grande conjunto de ferramentas numéricas nativamente.
Principais características. É distribuido sobre licença GPL (General Public License).
Multiplataforma: Linux, Unix, Mac, Windows.
Permite carregar módulos escritos em outras linguagens (Ex.: C++, Fortran).
Compatível com outros programas da categoria (Ex.: MatLab).
Onde Obter? http://www.gnu.org/software/octave/
Janela do Octave
O Octave originalmente não dispõe de interface gráfica. Ele deve ser executado no terminal (Linux) ou no MS-Dos (Windows) como ilustrado abaixo.
QtOctave: Interface gráfica para o Octave.
Disponível em: http://qtoctave.wordpress.com/
Navegador de Arquivos
Lista de Variáveis e Funções
Histórico de Comandos
Barra de Ferramentas
QtOctave: Interface gráfica para o Octave.
Disponível em: http://qtoctave.wordpress.com/
Saída do Terminal
Entrada do Terminal
Comandos Básicos
cd : Muda o diretório atual. pwd : Exibe diretório atual. ls : Lista o conteúdo do diretório atual. mkdir : Cria uma diretório. rmdir : Remove um diretório. delete : Remove um arquivo.
Números, Matrizes e Textos
Números Reais: Notação simples:
x = 1.981 Notação científica:
x = 1981e-3 Números Complexos:
Notação: a + bi
z = 10 + 1.981i Matrizes:
Notação: A=[linha_1; linha_2; linha_n]
Exemplo: A=[1 2 3; 4 5 6; 7 8 9] Textos:
txt='Meu texto.' ou txt=”Meu texto.”
me± p⇔m⋅10± p
A=[1 2 34 5 67 8 9]
Operações Aritméticas
Operadores Básicos : Soma: +
Subtração: -
Multiplicação: *
Divisão: /
Potenciação: ^ ou **
Transposto Complexo: '
Operadores termo à termo (matriz) : .<Operador Básico>
Exemplo: A .* B : produto termo à termo.
[1 23 4] .∗[5 6
7 8]=[ 5 1221 32]
Operações básicas com matrizes Acessar elemento:
Notação: A(Linha, Coluna).
Exemplo: Se A=[1 2 3; 4 5 6; 7 8 9], então A(2, 3)=6 Obs: O primeiro índice da linha ou da coluna é 1.
Acessar bloco: Notação: A(InícioLinha:FimLinha, InícioColuna:FimColuna)
Exemplo: Se A=[1 2 3; 4 5 6; 7 8 9], então A(2:3, 1:2)=[4 5; 7 8] Obs: Caso ”Ínicio” e ”Fim” não sejam especificados, será
considerado o índice 1 para ”Ínicio” e a dimensão da matriz (linha ou coluna, conforme o caso) para ”Fim”.
Exemplo: A(:, 1:2)=[1 2; 4 5; 7 8] Funções básicas:
size(A) : retorna as dimensões (Linha x Coluna) da matriz A.
inv(A) : calcula a inversa da matriz A.
eye(n) : cria uma matriz identidade de ordem n.
zeros(n, m) : cria uma matriz nula de ordem n x m.
ones(n, m) : cria uma matriz de ordem n x m com elementos iguais a 1.
A=[1 2 34 5 67 8 9]
Exemplo: Solução de um Sistema Linear
Considere o sistema abaixo:
Na forma matricial, temos a equação Ax=y, sendo:
{ab=5a−b=1
A=[1 11 −1 ] x=[ab ] y=[51], ,
Para derterminar a solução desse sistema no Octave, podemos fazer:
x=A\y
Conceitualmente, isso é equivalente à x=A-1y, porém na implementação computacional não há o cálculo da matriz inversa.
Plotar Gráficos 2DA função básica para plotar gráficos bidimensionais é plot.
plot(y) : plotar os valores y sobre o eixo y considerando os índices dos elementos como sendo a coordenada x.
plot(x, y) : plotar os pontos com coordenadas (x, y)
plot(x, y, 'formato') : plotar os pontos com coordenadas (x, y) com o estilo 'formato'
'formato' pode conter: '<EstiloDoPonto><CorDoPonto>;<RótuloDoGráfico>;'. <EstiloDoPonto>: -, +, *, o, x, ^, . <CorDoPonto>: k (preto), r (vermelho), g (verde), b (azul), m (magenta),
c (ciano), w (branco). <RótuloDoGráfico>: texto indicativo do gráfico.
plot(x, y, 'formato', u, v, 'formato', …) : plotar múltiplos gráficos sobre a mesma janela.
Observação: entre cada execução da função plot é necessário executar a função figure caso você queira gerar duas janelas gráficas separadas. Se for necessário 'segurar' a janela gráfica atual para plotar gráficos sobrepostos, deve-se usar o comando hold <on/off>.
Exemplo Simples de Gráfico 2D
Considere que x está no intervalo [-π, π]. Desse modo, a função
plot(x, sin(x), '^m;Seno;')
plota o gráfico abaixo.
Exemplo de Múltiplos Gráficos 2D
Considere que x está no intervalo [-π, π]. Desse modo, a função
plot(x, sin(x), '^m;Seno;', x, cos(x), 'og;Cosseno;')
plota o gráfico abaixo.
Formatação da Janela Gráfica
Podemos formatar a janela gráfica adicionando título, rótulos, grade, alterando os limites e o aspecto dos eixos.
title('Titulo do grafico') : altera o título do gráfico para 'Titulo do grafico'.
grid <on/off> : exibe ou não a grade.
xlabel('Rotulo do eixo x') : altera o rótulo do eixo x para 'Rotulo do eixo x'.
ylabel('Rotulo do eixo y') : altera o rótulo do eixo x para 'Rotulo do eixo y'.
axis([xmin, xmax, ymin, ymax, zmin, zmax], <propriedades>) : fixa os limites para os eixos e altera algumas propriedades do gráfico. O campo <propriedades> pode ser: 'square', 'equal', 'normal', 'auto', 'manual', 'on', 'off', 'tic[xyz]', 'label[xyz]', 'nolabel', 'ij', 'xy'
Formatação da Janela Gráfica
Considere que x está no intervalo [-π, π]. Desse modo, a sequência de funções
plot(x, sin(x), 'm;Seno;')
title('Grafico do Seno')
xlabel('Eixo x')
ylabel('Eixo y')
grid on
axis([-2*pi, 2*pi, -2, 2], 'normal')
plota o gráfico ao lado.
Salvar Janela Gráfica
Podemos salvar a janela gráfica atual através da função print. print(<nome_do_arquivo>, <propriedades>) : salva a janela gráfica atual no arquivo
<nome_do_arquivo> com as propriedades <propriedades>. <propriedades>:
'-P<impressora>': definir saída para <impressora>.
'-color', '-mono', '-solid', '-dashed', '-portrait', '-landscape' : propriedades gerais.
'-d<tipo_do_arquivo>' : Tipo do arquivo, onde <tipo_do_arquivo> pode ser 'ps', 'ps2', 'psc', 'psc2', 'eps', 'eps2', 'epsc', 'epsc2', 'tex', 'epslatex','epslatexstandalone', 'pstex', 'pslatex', 'ill', 'aifm', 'cdr', 'dxf', 'emf', 'fig', 'hpgl', 'mf','png', 'jpg', jpeg', 'gif', 'pbm', 'svg', 'pdf'.
'-S<TamanhoX>,<TamanhoY>' : tamanho do arquivo (em pixels)
'-F<NomeDaFonte>:<Tamanho>' : nome e tamanho da fonte (disponível para os formatos postscript, aifm, corel e fig).
Exemplo: print('meu_grafico.png', '-dpng', '-S800,600'). Observação: Caso o tipo do arquivo não seja especificado, o Octave tenta descobrir
pela extensão dada. Caso o tamanho não seja especificado, o padrão é 640x480.
Arquivo de Função Um Arquivo de Função contém uma função principal e opicionalmente funções
secundárias ou ”subfunções”. A primeira linha útil do arquivo deve conter obrigatoriamente a declaração da função
principal. Essa será a função executada inicialmente quando o arquivo for chamado. O arquivo deve ter a extensão ”.m” e seu nome deve ser igual ao nome da função
principal. O Octave é sensível à maiúsculas ou minúsculas, portanto lembre-se que ”Função.m” e ”função.m” são arquivos diferentes.
As ”subfunções” são disponíveis apenas dentro do arquivo onde elas estão declaradas, portanto não podem ser executadas externamente.
A declaração de uma função é feita da seguinte maneira:
function [retorno1, retorno2, …, retornoj] = nome_da_funcao(arg1, arg2, …, argn)
% Corpo da função
% Os caracteres % ou # marcam comentários.
end Note que o Octave permite múltiplos retornos. No exemplo acima, temos j retornos e
n argumentos. O nome do arquivo criado nesse exemplo deverá ser ”nome_da_funcao.m” Para executar a função, basta entrar com seu nome no terminal do Octave. Vale
lembrar que a função deve estar salva no diretório atual (ou nos diretórios de busca do sistema).
Exemplo de Aquivo de Função
Vamos criar uma função que receba o nome do usuário e dê boas-vindas (um clássico! ;-))
Crie um arquivo com o nome 'boasVindas.m'. Edite esse arquivo como descrito abaixo:
function boasVindas(usuario)
%Descrição: Função de boas vindas ao usuário.
printf(”Seja bem-vindo(a) usuario(a): %s\n”, usuario);
end
Note que o Octave não utiliza identificadores de tipo de variável! Isto é, não foi necessário declarar que 'usuario' é do tipo string.
Após editar o arquivo, basta entrar com o nome da função juntamente com seu argumento no terminal do Octave:
octave:1> boasVindas('Francislene Aquino')
octave:2> Seja bem-vinda(a) usuario(a): Francislene Aquino
Vale lembrar que a pasta atual deve ser a mesma onde você salvou o arquivo. Por exemplo, vamos supor que você salvou o arquivo na pasta '/minicurso_octave/exemplos'. Então, se essa ainda não é a pasta atual, execute o comando 'cd /minicurso_octave/exemplos'. Em seguida, basta executar a função.
Estrutura Condicional: if
Estrutura condicional segue a sintaxe:
if Condição
% Caso Condição seja verdadeira
else
% Caso Condição seja falsa
end
Vamos fazer uma função que recebe dois números e retorna o maior deles:
function maior = maximo(num1, num2)
%Descrição: Retorna o maior dentre dois números.
if num1 > num2
maior = num1;
else
maior = num2;
end
end
Operadores de Comparação e Operadores Lógicos
Os operadores de comparação são os seguintes: == : igualdade.
!= ou ~= : diferença.
>, >= : maior e maior igual.
<, <= : menor e menor igual.
Os operadores lógicos são os seguintes: && : conjunção (e).
|| : disjunção (ou).
! ou ~ : negação.
Estrutura Condicional: switch
Uma estrutura condicional switch segue a sintaxe:
switch (x)
case Opção1
% Instruções caso seja a Opção1
…
case Opçãon
% Instruções caso seja a Opçãon
otherwise
% Instruções caso não seja nenhuma das anteriores
end As opções também podem ser uma lista de valores. Por exemplo: case {1, 2, 3} As opções podem ser strings. Diferente da linguagem C/C++, os casos são exclusivos, portanto não há
necessidade do comando break em cada bloco.
Exemplo de Estrutura Condicional switch
function x=miniCalc(op1, operador, op2)%Descrição: Calcula o resultado de: (op1 operador op2)%Se ocorrer algum erro, a função retorna o valor x="erro".
x="erro";switch (operador)
case "+"x=op1+op2;
case "-"x=op1-op2;
case "*"x=op1*op2;
case "/"if op2 != 0.0
x=op1/op2;else
disp("Erro: Divisão por zero!");end
case {"^", "**"}disp("Operação não implementada.");
otherwisedisp("Operação inválida! Use: \"+\", \"-\", \"*\" ou \"/\"");
endend
Estrutura de repetição: forUma estrutura de repetição for segue a sintaxe:
for i = <Início>:<Incremento>:<Fim>
%Instruções a serem repetidas
end
Observação: se <Incremento> não é especificado, então ele é considerado igual a 1.
Vamos criar uma função que recebe um vetor de números e calcula a média entre seus elementos.
function m=media(v)
%Descrição: recebe um vetor v e calcula a média entre seus elementos.
n=length(v); %Retorna o número de elementos do vetor v.
m=0.0;
for i = 1:n
m=m+v(i); %Poderiamos usar m+=v(i), como na linguagem C/C++
end
m=m/n; %Poderiamos usar m/=n, como na linguagem C/C++
end
Estrutura de repetição: while
Uma estrutura de repetição while segue a sintaxe:
while Condição
%Instruções a serem repetidas
end
Vamos criar uma função que calcula os n primeiros elementos da sequência de Fibonacci.
function fib = fibonacci(n)
%Descrição: Cálcula os n termos da sequência de Fibonacci.
fib=ones(1, n);
i = 3;
while (i <= n)
fib(i) = fib(i-1) + fib(i-2);
i=i+1;%Poderiamos usar i++, como na linguagem C/C++
end
end
Estrutura de repetição: do-until
Uma estrutura de repetição do-until segue a sintaxe:
do
%Instruções a serem repetidas
until Condição
Vamos criar uma função que calcula os n primeiros elementos da sequência de Fibonacci.
function fib = fibonacci(n)
%Descrição: Cálcula os n termos da sequência de Fibonacci.
fib=ones(1, n);
if n>2
i = 2;
do
i++;
fib(i) = fib(i-1) + fib(i-2);
until (i == n)
end
end
Dicas e truques Concatenar string:
[”texto1 ”, ”texto2”] : produz o texto ”texto 1 texto 2”.
Criar variáveis com valores em um intervalo: <Início>:<Incremento>:<Fim> : x=[1:0.25:2] cria o vetor x=[1.0 1.25 1.5 1.75 2.0]
Variáveis globais: Para declarar uma variável global use o identificador global. Por exemplo, na função
principal escreva ”global minha_variavel” e atribua o valor desejado à ”minha_variavel”. Em seguida, para usar essa variável nas subfunções, você deve ”exportá-la” usando a mesma sintaxe anterior.
Funções úteis: close all : fecha todas as janelas abertas.
clear all : limpa as variáveis do ambiente.
min(v) : retorna o menor valor em v e a posição onde ele ocorre.
max(v) : retorna o maior valor em v e a posição onde ele ocorre.
sum(v) : retorna o somatório dos valores contidos em v.
prod(v) : retorna o produtório dos valores contidos em v.
spy(M) : plota uma representação gráfica da esparsidade da matriz M.
eval(”expressão”) : avalia a expressão definida por ”expressão”.
Obtendo ajuda
Há um vasto material sobre o Octave na Internet! Com uma rápida pesquisa em um site de busca você encontrará milhares de páginas. Um manual on-line do Octave pode ser encontrado na página: http://www.gnu.org/software/octave/doc/interpreter/
Um comando muito útil no Octave é o help. Com ele você pode encontrar a referência de todas as funções disponíveis no Octave, bem como informações sobre palavras reservadas e constantes.
Nas funções criadas pelo usuário, as primeiras linhas comentadas logo após a declaração da mesma, servem como referência para o comando help. Isto é, o comando ”help nome_de_sua_função” retorna tudo que está escrito nos comentários iniciais de sua função.
Agradecimento
Obrigado pela atenção!
Espero que o Octave seja muito útil para todos vocês!
Luiz [email protected]
Top Related