Mini Cur So Octave

Post on 26-Jun-2015

322 views 1 download

Transcript of Mini Cur So Octave

Laboratório Nacional de Computação Científica

Minicurso: Introdução ao Octave

Luiz AquinoMarço de 2010

aquino.luizclaudio@gmail.com.br

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 Aquinoaquino.luizclaudio@gmail.com.br