OCTAVE Este material é um auxílio de consulta rápida, o conhecimento aqui apresentado deve ser fundamentado pelas atividades de aula e principalmente pelas bibliografias fornecidas. Cada disciplina demanda parte do conhecimento aqui resumido, devendo o aluno estar apto a distingui-la. 1) Introdução 1.1) Para acessar o octave via terminal linux digite: $ octave 1.2) Acessando ajuda de qualquer função. > help sum 1.3) Verifique se os pacotes: odepkg, statistics, symbolic. Estão instalados com : > pkg list Caso negativo. Baixe de http://octave.sourceforge.net/ proceda a instalação com: > pkg install nomedopacote.tar.gz 1.4) Ativando o diário de atividades e gerenciando variáveis. > diary diario > diary on Carregue as variáveis de um arquivo > load variaveis.octave Carregue os dados de um arquivo texto padrão R, sem comentários. > load -ascii variavel.r Ou listar as variáveis usadas no momento > whos Apague as variáveis desnecessárias (ou todas com “all”) > clear ea vb mc Salve as variáveis num arquivo ao finalizar uma tarefa. > save variaveis.octave Salve uma variável num arquivo texto padrão R, sem comentários. > save -ascii variavel.r mmatriz Desative o diário e feche o programa. se necessário. > diary off > quit 2) Nomes de variáveis 2.1) Adotamos uma letra minúscula como prefixo do nome da variável para indicar seu tipo. ttexto = 'Texto Livre' # para texto ou função em análise simbólica enumero = 1.123 # um escalar inteiro ou decimal. vvetor = [1,2,3,4,5,6] # para vetor linha (1xN). mmatriz = [1.1,2.2;3.3,4.4;5.5,6.6] # para matriz (NxN). blogico =true # variável boleana ou seja sim (true) ou não (false) 3) Modelos e Operações matemáticas 3.1) Funções diretas utilizando o comando @(). <nome>=@(<arg1>,...,<argN>) <expressão> > f=@(x) 2*x; > f(2) ans = 4 3.2) Funções diretas chamadas inline. <nome>= inline(“<equação>”) > tf=”2*x”; > f=inline(tf); > f(2) ans = 4 3.3) Vetorizar função toda > tf=”2*x”; > tf2=vectorize(tf) ans tf2 = 2.*x > f=inline(tf2); > va=[1,2,3]; > f(va) ans = 2 4 6 3.4) Funções diretas utilizando eval. <nome>= eval(“<equação>”) > tf=”2*x”; > x=2; > f=eval(tf) ans = 4 3.5) Operações básicas. “+” Soma; “-” Subtração; “*” Multiplicação; “/” Divisão; “^” ou “**” Potenciação; “.” Aplica a operação termo a termo na matriz use “.”, exemplo A.*B; “ ' ” transpõe a matriz. '++' incrementa a variável; '- -' decrementa a variável. 3.6) Operações matemáticas. sin(x); cos(x); tan(x); asin(x); acos(x); atan(x); exp(x); logaritmo na base e: log(x); logaritmo na base 10: log10(x); valor absoluto: abs(x); menor numero inteiro (não menor que o passado como parâmetro): floor(x); maior numero inteiro (nao maior do que o passado como parâmetro): ceil(x); arredenda corretamente: round(x); resto da divisão: rem(x,y); raiz quadrada: sqrt(x); pi valor de pi=3,14.... Use NA para valores em falta e NaN para valores não é numero. 4) Operadores de comparação < # menor que. Ex: 1 < 2 > # maior que <= # menor ou igual a >= // maior ou igual a == // operador lógico igual Teste 1 Teste 2 ~= // operador log. diferente ~ // negação do teste && // operador lógico e || //operador lógico ou && || == true true true true true true false false true false false true false true false false false false false true 5) Manipulação matricial e vetorial 5.1) Criar vetor. > va=1:2:10 va = 1 3 5 7 9 > vb=linspace(1,10,5) vb = 1.0 3.25 5.50 7.75 10.00 > va=[12.4,4.5,9.6,3.0] va = 12.4000 4.5000 9.6000 3.0000 5.2) Criar matriz > ma=[1,2,3;4,5,6;7,8,9;10,11,12] ma = 1 2 3 4 5 6 7 8 9 10 11 12 5.3) Apagar elemento de matriz ou vetorial, “[]” ma(2,:)=[] ma = 1 2 3 7 8 9 10 11 12 5.4) Criar matrizes aleatoria > rand(2,2) # matriz aleatorio ans = 0.21680 0.97528 0.57017 0.97381 5.5) Acessar ou alterar elemento da matriz. Referência subscripts ou indice linear. > ma(2,:) ans = 4 5 6 > ma(:,2) ans = 2 5 8 11 > ma(2,2) # acesso por subscripts ans = 5 > ma(3) # acesso por indice linear ans = 7 > sub2ind([3,2],2,2) ans = 5 > [i,j]=ind2sub([3,2],3) i = 3 j = 1 5.6) Obter tamanho e tipo de dado da matriz e vetor > lin = size(ma,1) #obtem 1 dimensão num de linhas lin = 4 > tam = length(va) #obtem tamanho do vetor col = 5 > isempty(ma) #analise se matriz esta vazia ans = 0 >isfinite ([13, Inf, NA, NaN]) # se tem valores validos ans = [ 1, 0, 0, 0 ] > isnan([10,NaN,NA]) # se tem valores validos ans = 0 1 1 > isna([10,NaN,NA])# se tem valores validos ans = 0 0 1 5.7) Retira parte da matriz. A(inicioL:fimL,inicioC:fimC). Use “end” para acessar a ultima linha ou coluna. Use “:” para acessar a toda a linha ou coluna. > B=ma(2:end,1:2) B = 4 5 7 8 10 11 5.8) Construção e acesso a matriz de textos. Numero de caracteres corresponde as número de colunas. A matriz de texto é 'mt' e próxima letra é minúscula. > mtNomes=['joao';'maria'] vtNomes = joao maria > mtNomes(2,:) maria 5.9) Comando de estatistica. Se arg for matriz retorna a funcao para cada coluna. Resumo Octave. Prof. Dr. Catalunha - Versão atualizada em 06/03/2015 às 14:16 hs Página 1 de 3 [vlr pos]=min(arg) # retorna o min valor e sua posicao [vlr pos]=max(arg) # retorna o max valor e sua posicao sum(arg) # retorna a soma dos elementos prod(arg) # retorna o produto dos elementos 5.10) Comando de pesquisa. find(arg == 3) # localiza valor igual a 3 em arg x = randn(2,3) exemplo de matriz xind = (x >= 1)|(x < -0.2) Cria indice na condição. xc = x(xind) Seleciona valores bons. > finite([-1,0,1,inf,NaN,NA]) ans = [1 1 1 0 0 0] # retorna ind. de valores validos 6) Estrutura de repetição e controle 6.1) Estrutura de repetição for # for i=inicio:fim for i=1:10 # executa codigo i vezes endfor 6.2) Estrutura de repetição while while condicao # executa codigo enquanto condicao for verdadeira endwhile 6.3) Estrutura de repetição do-until do # executa codigo até que condicao seja verdadeira until condicao 6.4) Estrutura de controle if if condicao01 #caso verdadeiro01 elseif condicao02 #caso verdadeiro02 else #caso falso endif 6.5) Estrutura de controle Switch. switch (inteiro) case 1 # codigo case {2,3} # codigo otherwise # codigo endswitch ou switch (texto) case 'bananeira' # codigo case {'palmeira','figueira'} # codigo otherwise # codigo endswitch 6.6) Encerra o programa neste ponto. exit; Outros códigos e observações: 6.7) Lê valor do teclado. Não importa o tipo. Se usar 's' ele não interpreta a entrada. > enumero=input('Informe o valor: '); Informe o valor: 1.1 > tequacao=input('Informe a equacao:','s'); Informe a equacao: 1+2*x 6.8) Imprime texto e valor de variavel. %s=imprimir texto; %cd imprimir inteiro; %c.pf imprimir decimal, em que c=numero de casas, p=precisão decimal. > printf('ver %s %4d %5.2f\n', ttexto, einteiro, edecimal); ver Texto Livre 1 1.23 6.9) Manipulando strings. Os demais comandos strcat, strfind, strsplit, strtrim devem ser estudados. > str2num('1.23'); # string para números ans = 1.2300 > strcmp('a','a'); # comparando duas strings ans = 1 6.10) Estrutura do arquivo padrão de entrada. Considere um parametro de entrada edecimal=1.1'. Um vetor vdecimal=[1.1;2.2]. Uma matriz mdecimal=[1.1,2.2;3.3,4.4]. Após vetor ou matriz escreva 'fim'. Use # para comentário deste arquivo. /ie_catalunha_basico/entrada.txt #Autor: Prof. Dr. Catalunha #Tarefa: Basico enumero 1.1 vlinha 1.1 2.2 3.3 mmatriz 1.1 2.2 3.3 4.4 fim ttexto nome mtexto cajueiro jatoba jamelao pequizeiro fim 6.11) Gravar dados em um arquivo de texto. function gravaarqsaida(tarquivo,ttexto,einteiro,edecimal,vlinha, mmatriz) arqbin=fopen(tarquivo,'w'); fprintf(arqbin,'ttexto\n');# escreve texto fprintf(arqbin,'%s\n',ttexto); fprintf(arqbin,'einteiro\n'); # esc. escalar inteiro fprintf(arqbin,'%d\n',einteiro); fprintf(arqbin,'edecimal\n'); # esc. escalar decimal fprintf(arqbin,'%5.2f\n',edecimal); fprintf(arqbin,'vlinha\n'); # esc. vetor linha (1xN) fprintf(arqbin,'%.4f',vlinha); fprintf(arqbin,'mmatriz\n'); #esc. matriz, vetor(Nx1) for i=1:size(mmatriz,1) fprintf(arqbin,'%.4f ',mmatriz(i,:)); fprintf(arqbin,'\n'); endfor fprintf(arqbin,'fim\n'); fclose(arqbin); endfunction 6.12) Le dados em um arquivo de texto. function [enumero,vcoluna,mmatriz,ttexto,mtTexto,vlinha]=learqen trada(tarquivo) arqbin = fopen (tarquivo, 'r'); while(!feof(arqbin)) linha=fgetl(arqbin); switch (linha) case 'enumero' # lê escalar linha=fgetl(arqbin); enumero=str2num(linha); case 'vlinha' # lê vetor linha (1xN) linha=fgetl(arqbin); vlinha=str2num(linha); case 'mmatriz' # lê matriz (NxN) vetor (Nx1) lin=1; while(!strcmp(linha=fgetl(arqbin),'fim')) mmatriz(lin++,:)=str2num(linha); endwhile case 'ttexto' # lê texto ttexto=fgetl(arqbin); case 'mtTexto' # lê matriz de texto mtTexto=''; while(!strcmp(linha=fgetl(arqbin),'fim')) mtTexto=[mtTexto;linha] end endswitch endwhile fclose(arqbin); endfunction 7) Estrutura básica para programação Para programação no octave, usa-se toda a capacidade de processamento disponível no octave. Use #... para comentário simples e #{ … #} para comentário bloco. 7.1) Arquivo que contém a interface com o usuário. ~/ie_catalunha_tarefa/interface.m # Autor: Nome do autor function interface() # interface para coleta de parâmetros de entrada # chamada a função da tarefa # interface para mostra de parâmetros de saída endfunction # subfunção para leitura de parâmetros em arquivo # subfunção para gravar parâmetros em arquivo 7.2) Arquivo que contém a solução pura do problema proposto na tarefa. ~/ie_catalunha_tarefa/tarefa.m # Autor: Nome do autor function[saida01,...,saidaN]=tarefa(entrada01,...,entr adaN) # código para obtenção da solução da tarefa endfunction # subfunção se for necessário Resumo Octave. Prof. Dr. Catalunha - Versão atualizada em 06/03/2015 às 14:16 hs Página 2 de 3 7.3) Estrutura básica de arquivos e pastas de um programa ie_catalunha_tarefa |-- interface.m |-- tarefa.m |-- entrada.txt |-- saida.txt `-- relatorio.txt Obs.: o arquivo, saida.txt, será criado automaticamente pelo programa. 8) Gerar Grafico 8.1) De Pontos. Considere os dados vx, vy, vxt, vyt. plot(vx,vy,formato,vxt,vyt,formato). Em que formato='<estiloDoPonto><corDoPonto>;<legenda>;' . Sendo: estiloDoPonto=-, +,*,o,x,^. corDoPonto=k(preto), w(branco), r(vermelho), g(verde), b(azul), m(magenta), c(ciano). legenda=texto. > plot(vx,vy,'*r;orig;',vxt,vyt,'+b;transf;') > grid on > title('Titulo do Grafico') > xlabel('Nome do EixoX') > ylabel('Nome do EixoY') > axis([0,10,0,50]) > print('nomeArquivo.png','-dpng') 8.2) Gerar gráfico dentro de programa, inicialmente precisamos esconder a janela do plot, para isto use a linha a seguir: janelaPlot=figure('Visible','off'); posteriormente incluia as informações necessárias conforme item 8.1 2.0060 2.0230 2.0499 2.0856 2.1293 2.1801 2.2372 2.3000 2.3679 m1 = 2 m2 = successful exit > plot(t,xcal) 14) Outros comandos utilizados 14.1) Diferença entre valores. x1-x0, x2-x1,... octave:9> a=[1,2,3] a = 1 2 3 octave:10> diff(a) ans = 1 1 15) Processamento Via terminal e Script Shell 15.1) Considere o seguinte programa /ie_catalunha_tarefa/interface.m function interface() a=input('Informe o valor de a: ') [b]=tarefa(a) printf('Tarefa %f',b) endfunction 9) Integração 9.1) Integral simples. > f=@(x) 1/x; > quad(f,3.0,3.6) ans = 0.18232 /ie_catalunha_tarefa/tarefa.m 9.2) Integral dupla > g=@(x,y) x.**2+2*y; # modelo no formato matricial > dblquad(g,0,1,0,2) ans = 4.6667 function[b]=tarefa(a) b=2*a; endfunction 15.2) Processando programa via terminal. $ octave --eval interface -q -f Informe o valor de a: 3 10.1) Ajuste polinomial. polyfit(vx,vy,n) em que n é o grau do polinómio. A saída é cn Tarefa 6.000000 … c0. 15.3) Processando a tarefa a partir de um script shell, considere o script > vx=[0.0,1.0] /cn_catalunha_tarefa/exercicio1/tarefa.sh > vy=[1.0,3.0] > vc = polyfit(vx,vy,1) #!/bin/bash vc = 2.0000 1.0000 # P1= 2*x + 1 octave --eval interface -q -f 10.2) Avalia um polinômio. polyval(vc,x) aplicar um valor x qualquer no polinómio 15.4) Mudando a permissão do script para execução, caso necessário obtido com base nos coeficientes de vc. $ chmod 777 tarefa.sh > polyval(vc,3) # é o mesmo que P1(3)= 2*x + 1 ans = 7 15.5) Processando o script shell $ ./tarefa.sh 10.3) Calcula raizes de um polinômio. vc é o vetor de coeficientes. Informe o valor de a: 3 > roots(vc) # é o mesmo que 0 = 2*x + 1 Tarefa 6.000000 ans = -0.5 10) Manipulações polinomiais 11) Regressão Linear Múltipla 11.1) Ajuste um modelo y i=β0 + β1 x 1i+ , , ,+ β p x pi ;em que: p é o número de variáveis explicativas; i é o número de dados. Sendo a matriz solução organizada na forma. 1 x 11 x 21 ... x p1 y1 β0 y2 β1 1 x 12 x 22 ... x p2 e resultando ... ... ... ... ... ... ... yn βp 1 x1n x 2n ... x pn > regress(my,mx) ans = 1 2 # P1= 1 + 2*x [] [ ] [] 12) Raiz de função 12.1) Encontrar raiz de uma função > f=@(x) x**3-3*x+1; > fzero(f,2) ans = 1.5321 15.6) Usando MySql e Gnuplot via Octave. Considere que você já tem um banco de dados com uma tabela alimentada. Inicie o octave via usuário root ou que tenha acesso ao banco de dados. /cn_catalunha_tarefa/exercicio2/octave_mysql_gnuplot.m function octave_mysql_gnuplot() system("mysql nomeBancoDeDados --password=senhaBancoDeDados < sql.txt > resultado_sql.txt"); system("gnuplot grafico.txt"); endfunction /cn_catalunha_tarefa/exercicio2/sql.txt select * from tabela01; /cn_catalunha_tarefa/exercicio2/grafico.txt reset plot x**2 13) Resolver EDO 13.1) Resolver equação diferencial. Veja Cap 6 Barroso, Exemplo: y'=x-y+2 e y(0)=2 e malha [0,1] com 10 subintervalos. No modelo padrão octave y=é a variável x x= é a variável t, ficando: > function xest=f(x,t) xest=t-x+2; endfunction > x0=2 > t0=linspace(0,1,10); > [xcal,m1,m2]=lsode('f',x0,t0) xcal = 2.0000 Resumo Octave. Prof. Dr. Catalunha - Versão atualizada em 06/03/2015 às 14:16 hs Página 3 de 3