Introdução ao Octave - Parte II
Expandindo o Octave e reaproveitando comandos
Vamos lá?
Se na aula passada vimos comandos básicos do Octave, nesta aula veremos como reaproveitar sequências de comandos e como isso pode ser usados para estender as funções disponíveis no Octave. De brinde, os exemplos mostram alguns recursos para produzir gráficos mais caprichados.
- 1
- 2
Quais as diferenças/semelhanças entre scripts e funções no Octave?
- A. Ambos são formas de salvar blocos de comando para usá-los mais facilmente.
- B. Scripts têm seu próprio espaço de variáveis, separado das variáveis da área de trabalho do Octave.
- C. Funções aceitam no máximo uma variável de entrada.
- D. Scripts não têm variáveis de entrada. Eles usam as variáveis que já estão definidas no ambiente de trabalho.
É comum repetirmos a mesma sequência de comandos várias vezes. No exemplo do vídeo, o gráfico de uma função teve sua apresentação adequada a um certo estilo. Isso foi feito usando 5 comandos encadeados. Considere a situação de preparar vários gráficos, todos no mesmo padrão. Para automatizar esta tarefa, poderíamos construir um script que ajustasse o visual do gráfico.
Um script é uma sequência pré-definida de comandos, salva em um arquivo texto, que pode ser executada pelo Octave, como se fosse um comando interno do próprio Octave. Para isso, o arquivo deve ter extensão .m
e estar na pasta onde o Octave está sendo executado, ou ter sua localização indicada pela variável de ambiente path
.
Suponha que um arquivo texto de nome acerta.m
tem o seguinte conteúdo.
acerta.m
title("Experimento"); xlabel("Tempo [s]"); ylabel("Velocidade [m/s]"); legend("off");
Se após cada gráfico gerado com o comando plot
executarmos o script acerta
, o gráfico terá seu título e rótulos dos eixos definidos e a legenda omitida.
O resultado da execução de um script é exatamente o mesmo que seria obtido digitando-se conteúdo diretamente na linha de comando do Octave. Logo, um script vê e manipular as variáveis do ambiente de trabalho do usuário.
Outra possibilidade de agrupar comandos no Octave é a definição de uma sub-rotina ou função. Uma função difere de um script por ter seu próprio espaço de variáveis, separado do espaço de variáveis do ambiente de trabalho do usuário. A troca de informações entre o espaço da função e o ambiente de trabalho do usuário se dá através de variáveis ou parâmetros de entrada e saída, passados na chamada da função. A especificação desses parâmetros é feita na da declaração da função, através da palavra-chave function
.
No exemplo do vídeo, construímos uma função que retorna os primeiros termos da sequência de Fibonacci. Para poder operar, essa função precisa receber como parâmetro de entrada a quantidade de termos desejada. Ao final, ela retorna ao usuário a sequência computada, assim como a razão entre os últimos dois termos, que no limite é a razão áurea. Assim, como um script, uma função deve estar salva em um arquivo texto, também com a extensão .m
, com a condição que o nome do arquivo deve ser igual ao nome da função. Veja o exemplo abaixo.
fibo.m
function [seq, razao] = fibo(N) seq = ones(1,N); for k = 3:N seq(k) = seq(k-1) + seq(k-2); endfor razao = seq(N) / seq(N-1); endfunction
As variáveis seq
, razao
, N
e k
são todas internas à função e só existem enquanto a função estiver em execução. A variável N
é uma variável de entrada e terá seu valor inicializado pela chamada da função fibo
na linha de comando do Octave. Por exemplo, se executarmos
[s,r] = fibo(10);
a variável N
terá o valor 10 quando a função iniciar sua execução. Já as variáveis seq
e razao
são variáveis de saída. Isto significa que quando a função concluir sua execução seus valores serão copiados para as variáveis do ambiente de trabalho do usuário, indicadas quando a função foi chamada. No exemplo, o valor de seq
será copiado para s
e o valor de razao
será copiado para r
. Por fim, a variável k
é apenas interna à função e não será vista fora. Mesmo que haja outra variável com nome k
no ambiente de trabalho do usuário, elas não terão qualquer relação.
Todas as funções do Octave possuem documentação. Da mesma forma, podemos (e devemos) documentar as funções que criarmos. Isso é feito com um bloco de comentários logo após a declaração da função. A função fibo
poderia ser documentada assim.
fibo.m
function [seq, razao] = fibo(N) # function [seq, razao] = fibo(N) # # Computa os primeiros N termos da sequência # de Fibonacci. # # Parâmetros de entrada: # N - quantidade de termos # # Parâmetros de saída: # seq - vetor linha com os primeiros N # termos da sequência de Fibonacci # # razao - aproximação para a razão áurea, # computada como seq(N)/seq(N-1). seq = ones(1,N); for k = 3:N seq(k) = seq(k-1) + seq(k-2); endfor razao = seq(N) / seq(N-1); endfunction
Esta documentação é exibida com help fibo
.
Caso o arquivo do script ou da função não seja encontrado pelo Octave, muito provavelmente eles estejam salvo em um diretório diferente do diretório onde o Octave está rodando. Você pode conferir em qual diretório o Octave está rodando, usando o comando pwd
. Para trocar de diretório, use o comando cd
ou adicione o diretório onde a função foi salva ao caminho de busca do Octave com o comando addpath
.
Referências
Site oficial do GNU Octave com documentação online ou em PDF.
Para usar o Octave sem precisar instalá-lo, experimente o Octave-Online.
1. Da expansão de Taylor para função exponencial sabemos que $$ e^x = \lim_{n\to \infty}S_n(x), \quad \mbox{onde}\quad S_n(x) = \sum_{k=0}^n \frac{x^k}{k!}. $$
- Implemente uma função em Octave que compute $S_n(x).$ Veja se consegue fazer isso sem usar uma função explícita para o cálculo do fatorial de um número.
- Compute $S_{10}(2).$ Qual o erro em aproximar $e^2$ por $S_{10}(2)$?
- Descubra para que valor $n,$ $|e^2 - S_n(2)| \lt 10^{-6}.$