Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Apostila Scilab, Notas de estudo de Matemática

Apostila completa sobre o software matemático Scilab.

Tipologia: Notas de estudo

2010
Em oferta
50 Pontos
Discount

Oferta por tempo limitado


Compartilhado em 04/03/2010

fernanda-favatto-6
fernanda-favatto-6 🇧🇷

4.8

(17)

4 documentos

Pré-visualização parcial do texto

Baixe Apostila Scilab e outras Notas de estudo em PDF para Matemática, somente na Docsity! Introdução ao Scilab Versão 3.0 Prof. Paulo Sérgio da Motta Pires Departamento de Engenharia de Computação e Automação Universidade Federal do Rio Grande do Norte Natal-RN, Julho de 2004 Resumo Scilab é um ambiente utilizado no desenvolvimento de programas para a resolução de pro- blemas numéricos. Criado e mantido por pesquisadores pertencentes ao Institut de Recherche en Informatique et en Automatique, INRIA, através do Projeto MÉTALAU (Méthods, algorithmes et logiciels pour l’automatique) e à École Nationale des Ponts et Chaussées, ENPC, Scilab é gratuito (free software) e é distribúıdo com o código fonte (open source software). A partir de maio de 2003, Scilab passou a ser mantido por um consórcio de empresas e instituições francesas denominado de Consórcio Scilab. Embora seja apresentado como um software CASCD, Computer Aided Control System Design - Projeto de Sistemas de Controle Auxiliado por Computador, Scilab pode ser usado para desenvolvimento ou prototipação de software numérico de propósito geral. Este é um documento sobre a utilização e as principais caracteŕısticas deste ambiente de programação numérica. É importante ressaltar que as referências definitivas sobre Scilab são os manuais que acompanham o software. Por exemplo, podemos citar Introduction to Scilab - User’s Guide [1], documento no qual este texto se baseia. O objetivo principal é apresentar um texto introdutório, em português, sobre Scilab. Nosso interesse é fazer deste documento um complemento aos textos utilizados em disciplinas como Métodos Computacionais, Cálculo Numérico, Computação Numérica, Álgebra Linear Computa- cional e correlatas. Nos interessa, também, mostrar que o Scilab é uma excelente ferramenta de suporte para linhas de pesquisa onde o uso de computadores na resolução numérica de problemas é intensivo. A versão mais recente deste trabalho está dispońıvel, no formato pdf, em http://www.dca. ufrn.br/~pmotta. Comentários ou sugestões podem ser enviados para pmotta@dca.ufrn.br. i Sumário Scilab - Versão 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i Agradecimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii Distribuição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii Histórico deste Documento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii Sumário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iv Lista de Figuras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vi Lista de Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vii Lista de Códigos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . viii 1 Introdução 1 2 O Ambiente Scilab 4 2.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2 O Ambiente Gráfico do Scilab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.3 Variáveis Especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.4 Manipulação de Arquivos e Diretórios . . . . . . . . . . . . . . . . . . . . . . . . 11 2.5 O help do Scilab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.6 Arquivos com Comandos Scilab . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3 Operações Básicas com Scilab 19 3.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.2 Utilizando as Funções Internas do Scilab . . . . . . . . . . . . . . . . . . . . . . . 23 4 Polinômios, Vetores, Matrizes e Listas 25 4.1 Polinômios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 4.2 Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.3 Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 4.4 Acesso a Elementos de Vetores e de Matrizes . . . . . . . . . . . . . . . . . . . . 35 4.5 Matrizes com Polinômios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 4.6 Matrizes Simbólicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4.7 Matrizes Booleanas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 4.8 Operações com Vetores e Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.9 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 5 Programação 56 5.1 Comandos para Iterações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.1.1 O Loop for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.1.2 O Loop while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 5.2 Comandos Condicionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 5.2.1 Comando if-then-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 5.2.2 Comando select-case . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 iv 5.3 Definindo Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 5.4 Definindo Funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 5.4.1 Variáveis Globais e Variáveis Locais . . . . . . . . . . . . . . . . . . . . . 66 5.4.2 Arquivos com Funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 5.4.3 Comandos Especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 6 Gráficos no Scilab 76 6.1 A Janela de Gráficos do Scilab . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 6.2 Gráficos Bi-dimensionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 6.2.1 Outros Comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 6.2.2 Gráficos 2D Especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 6.3 Gráficos Tri-dimensionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 6.3.1 Gráficos 3-D Especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 A Instalação do Scilab 89 A.1 Instalação no Linux Slackware - Código Fonte . . . . . . . . . . . . . . . . . . . . 89 B Ligação do Scilab com Programas em C 92 B.1 A Ligação Dinâmica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 C Instalação de Toolboxes 96 C.1 Instalação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 D Funções Pré-definidas - Scilab 3.0 99 D.1 Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 D.2 Graphics Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 D.3 Elementary Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 D.4 Input/Output Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 D.5 Handling of functions and libraries . . . . . . . . . . . . . . . . . . . . . . . . . . 107 D.6 Character string manipulations . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 D.7 GUI and Dialogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 D.8 Utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 D.9 Linear Algebra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 D.10 Polynomial calculations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 D.11 General System and Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 D.12 Robust control toolbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 D.13 Optimization and simulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 D.14 Signal Processing toolbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 D.15 Arma modelisation and simulation toolbox . . . . . . . . . . . . . . . . . . . . . 114 D.16 Metanet: graph and network toolbox . . . . . . . . . . . . . . . . . . . . . . . . . 114 D.17 Sound file handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 D.18 Language or data translations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 D.19 PVM parallel toolbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 D.20 TdCs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 D.21 TCL/Tk interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 D.22 Statistic basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 D.23 Cumulative Distribution Functions; Inverses, grand . . . . . . . . . . . . . . . . . 117 D.24 Identification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 D.25 Matlab to Scilab conversion tips . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Referências Bibliográficas 120 v Lista de Figuras 2.1 Tela inicial do Scilab no ambiente gráfico do Linux. . . . . . . . . . . . . . . . . . 5 2.2 Tela com as opções de operações sobre arquivos, File Operations. . . . . . . . . 6 2.3 Programas de demonstração, opção Demos , do Scilab 3.0. . . . . . . . . . . . . . 7 2.4 Tela da sub-opção Help browser com navegador padrão do Scilab. . . . . . . . . . 8 2.5 Tela de configuração para a escolha do navegador do Help do Scilab. . . . . . . 8 2.6 Tela inicial do Scipad, editor incorporado ao Scilab. . . . . . . . . . . . . . . . . 10 2.7 Tela de help para a função det. . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.8 Comando help para a função det. . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.9 Texto do help para a função besselk. . . . . . . . . . . . . . . . . . . . . . . . . 16 2.10 Comando diary para gravação de sessões desenvolvidas no ambiente Scilab. . . . 17 3.1 Rodando o exemplo de utilização da função fft apresentado no help do Scilab. . 23 3.2 A função K de Bessel, besselk. O exemplo apresentado no help da função é copiado para o editor SciPad, selecionado e executado através da sub-opção Evaluate Selection Ctrl+y da opção Execute . . . . . . . . . . . . . . . . . . . . 24 5.1 Escrevendo uma função usando o editor do Scilab. . . . . . . . . . . . . . . . . . 69 6.1 Janela gráfica do Scilab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 6.2 Sáıdas para a função plot2d([x], y). Cada sub-gráfico refere-se a um dos itens da sessão do Scilab mostrada anteriormente. Observar que os gráficos dos Itens 4 e 5 possuem valores de abcissas diferentes dos demais. . . . . . . . . . . . . . . 80 6.3 Sáıdas para a função plot2d([x], y, <opt_args>). . . . . . . . . . . . . . . . . 83 6.4 Sáıdas para a função subplot(). . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 6.5 Exportando gráficos para o LATEX. . . . . . . . . . . . . . . . . . . . . . . . . . . 85 6.6 Exemplo de sáıda gráfica 3-D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 6.7 Exemplos de gráficos 3-D especiais. . . . . . . . . . . . . . . . . . . . . . . . . . . 88 C.1 Procedimentos para a utilização do toolbox ANN e help com as funções dispońıveis no toolbox. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 vi Caṕıtulo 1 Introdução Scilab1 é um ambiente voltado para o desenvolvimento de software para resolução de pro- blemas numéricos. Scilab foi criado em 1990 por um grupo de pesquisadores do INRIA2-Institut de Recherche en Informatique et en Automatique e do ENPC3-École Nationale des Ponts et Chaussées. Desde 1994, quando passou a ser dispońıvel na Internet, Scilab é gratuito, free software, e distribúıdo com o código fonte, open source software. Além da distribuição com o código fonte, existem, também, distribuições pré-compiladas do Scilab para vários sistemas operacionais. Na versão 3.0, na data em que este documento foi escrito, Scilab está dispońıvel para as seguintes plataformas: • Plataformas UNIX/Linux: – Scilab 3.0 - arquivo binário para Linux (scilab-3.0.bin.linux-i686.tar.gz); – Scilab 3.0 - arquivo com o código fonte do Scilab (scilab-3.0.src.tar.gz). • Plataformas Windows 9X/NT/2000/XP: – Scilab 3.0 - instalador da versão binária do Scilab (scilab3.0.exe); – Scilab 3.0 - código fonte do Scilab (scilab-3.0.src.zip) A partir de maio de 2003, Scilab passou a ser mantido por um consórcio de empresas e instituições francesas denominado de Consórcio Scilab. Os principais objetivos deste consórcio são: • Organizar a cooperação e o intercâmbio entre os desenvolvedores do Scilab objetivando incorporar ao software os últimos avanços cient́ıficos na área da computação numérica; • Organizar a cooperação e o intercâmbio entre os usuários do Scilab objetivando fazer com que o software possa ser utilizado de maneira mais efetiva na indústria, na educação e na pesquisa, e • Angariar recursos para a manutenção da equipe de desenvolvedores e para garantir um suporte mais adequado às necessidades dos usuários. Embora seja apresentado pelos seus mantenedores como um software CASCD - Computer Aided Control System Design - Projeto de Sistemas de Controle Auxiliado por Computador, 1Página do Scilab: http://scilabsoft.inria.fr 2Página do INRIA : http://www.inria.fr 3Página do ENPC : http://www.enpc.fr 1 Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 2 Scilab é um ambiente para desenvolvimento ou prototipação de software numérico de propósito geral. O objetivo principal deste trabalho é divulgar o ambiente Scilab através de um texto escrito em português. Com este objetivo em mente, a ênfase maior é dada na apresentação das carac- teŕısticas do próprio ambiente. Assim, apesar do rigorismo, não há preocupações excessivas em relação aos tipos de problemas tratados ou em relação aos exemplos apresentados. Partimos do prinćıpio que o leitor deste trabalho já possua conhecimentos práticos, mesmo rudimentares, sobre programação. O objetivo secundário, também relevante, é mostrar que a utilização de software livre e de código aberto, free/open source software, do ponto de vista do usuário, traz grandes vantagens. Algumas delas, apresentadas em [2], são: • A última versão do software está sempre dispońıvel, geralmente através da Internet; • O software pode ser legalmente utilizado, copiado, distribúıdo, modificado; • Os resultados obtidos podem ser divulgados sem nenhuma restrição; • Os programas desenvolvidos podem ser transferidos para outras pessoas sem imposições ou constrangimentos de quaisquer natureza; • O acesso ao código fonte, evitando surpresas desagradáveis; • O acesso a informação de alta qualidade, e • A certeza de estar participando de uma comunidade cujo principal valor é a irrestrita difusão do conhecimento. Existem, ainda, algumas pretensões com a divulgação deste trabalho. Uma delas é fa- zer deste documento um complemento para os textos utilizados em disciplinas como Métodos Computacionais, Cálculo Numérico, Computação Numérica, Álgebra Linear Computacional e correlatas. Uma outra, é mostrar que Scilab é uma excelente ferramenta de suporte para li- nhas de pesquisa onde o uso de computadores na resolução numérica de problemas é intensivo. A última versão deste trabalho encontra-se dispońıvel em http://www.dca.ufrn.br/~pmotta. Comentários ou sugestões sobre esse documento são sempre benvindas e podem ser enviados para pmotta@dca.ufrn.br. É importante ressaltar que as referências definitivas sobre Scilab permanecem sendo os ma- nuais que acompanham o software. Na data em que este trabalho foi escrito, estavam dispońıveis na homepage do Scilab os seguintes documentos, [1]: • Introduction to Scilab - manual de introdução ao Scilab, documento no qual este texto se baseia, nos formatos HTML, PDF, Postscript, com os arquivos fontes em LATEX; • Communication Toolbox Documentation - documentação sobre o toolbox de comunica- ção, nos formatos HTML, PDF, Postscript, com os arquivos fontes em LATEX; • Signal Processing - documentação sobre o toolbox de processamento de sinais, nos for- matos PDF, Postscript, com os arquivos fontes em LATEX; • Lmitool: Linear Matrix Inequalities Optimization Toolbox - documentação so- bre o toolbox de otimização, nos formatos HTML , PDF, Postscript, com os arquivos fontes em LATEX; • Metanet User’s Guide and Tutorial - tutorial sobre a utilização do toolbox de grafos Metanet, nos formatos HTML, PDF, Postscript, com os arquivos fontes em LATEX; Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 3 • Scicos, documentação sobre o ambiente de simulação do Scilab nos formatos HTML, PDF, Postscript, com os arquivos fontes em LATEX; • Scilab’s Internals Documentation - documentação sobre as caracteŕısticas internas do Scilab, nos formatos HTML, PDF, Postscript, com os arquivos fontes em LATEX; • HOWTO’s Scilab - várias dicas sobre a utilização do Scilab, no formato HTML; • Scilab’s demonstrations - programas de demonstração de funcionalidades do Scilab, no formato HTML; • Intersci - documentação sobre a interconexão do Scilab com programas escritos nas linguagens C ou FORTRAN, nos formatos PDF, Postscript, com os arquivos fontes em LATEX, e • Inline help pages - documentação contendo o help de funções do Scilab nos formatos HTML, PDF, Postscript, com os arquivos fonte em LATEX. Este documento, desenvolvido para satisfazer os objetivos estabelecidos em parágrafos pre- cedentes, está dividido em seis Caṕıtulos e quatro Apêndices. Neste Caṕıtulo, mostramos o contexto no qual o ambiente Scilab e este trabalho estão inseridos. No Caṕıtulo 2, apresentamos uma visão geral das principais caracteŕısticas do ambiente Scilab. Descrevemos as suas diversas opções e apresentamos os comandos básicos utilizados na edição de comandos no ambiente Scilab. No Caṕıtulo 3, apresentamos diversos exemplos de manipulações numéricas básicas que podem ser realizadas com o software. São enfatizadas operações com números (reais, complexos) e dados alguns exemplos de utilização de funções internas do Scilab. O Caṕıtulo 4 é dedicado aos vários tipos de dados que podem ser manipulados pelo Scilab. Apresentamos polinômios, vetores, matrizes e listas. No Caṕıtulo 5, são dados exemplos de desenvolvimento de programas no Scilab e, finalizando, no Caṕıtulo 6, utilizamos comandos do Scilab voltados para a geração de gráficos bi-dimensionais e tri-dimensionais. No Apêndice A, mostramos os procedimentos para a instalação do software, a partir do código fonte, em máquinas com o sistema operacional Linux (a instalação foi realizada em uma máquina com distribuição Slackware 9.1, kernel versão 2.4.24). Os procedimentos para a instalação das distribuições binárias do Scilab, por serem espećıficos de cada plataforma, não são apresentados. O usuário é aconselhado a buscar estas informações na página do Scilab. Descrevemos, ainda, os principais arquivos e diretórios que compõem o ambiente Scilab. No Apêndice B, apresentamos um procedimento que permite executar códigos escritos em linguagem C dentro do ambiente Scilab. No Apêndice C, apresentamos os procedimentos padrões para a instalação de toolboxes no Scilab. No Apêndice D, apresentamos uma listagem de todas as funções pré-definidas dispońıveis no ambiente Scilab-3.0. Por tratar-se de um texto introdutório, deixamos de apresentar diversas caracteŕısticas do ambiente Scilab que, entretanto, podem ser consultadas nos documentos citados anteriormente. Acreditamos que a maneira mais adequada de ler este documento é em frente a um compu- tador com Scilab instalado e funcionando. Os exemplos apresentados e a própria funcionalidade do software poderão, desta forma, ser explorados com maior eficiência. Este trabalho pode ser copiado e distribúıdo livremente, dados os devidos créditos ao seu autor. Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 6 ou prompt de ńıvel zero. Ainda na Figura 2.1, podemos observar a existência de um menu horizontal com seis opções: File , Control , Demos , Graphic Window 0 , Help e Editor . Utilizando o mouse para escolher cada uma das opções, verificamos que: • A opção File possui três sub-opções: – File Operations, que permite carregar arquivos, funções e executar o conteúdo de arquivos com comandos Scilab, entre outras ações. Na Figura 2.2, apresentamos o Scilab e a tela correspondente à essa opção. – Kill, que permite interromper de maneira abrupta o processamento, saindo do am- biente Scilab. – Quit, que permite sair do ambiente Scilab de forma natural. Figura 2.2: Tela com as opções de operações sobre arquivos, File Operations. • A opção Control , que também possui três sub-opções: – Resume - continua a execução após uma pause ter sido dada através de um comando em uma função ou através de Stop ou Ctrl-c. – Abort - aborta a execução após uma ou várias pause, retornando ao prompt inicial. – Stop - interrompe a execução do Scilab e entra em modo pause. No prompt, equivale a um Ctrl-c. Essas operações são mostradas na sessão Scilab: --> // Ctrl-c no prompt inicial -1-> // leva ao prompt de primeiro nivel -1-> // Ctrl-c no prompt de primeiro nivel -2-> // leva ao prompt de segundo nivel -2->resume // retorna ao prompt de primeiro nivel Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 7 -1->resume // retorna ao prompt inicial --> // Ctrl-c -1-> // Ctrl-c -2-> // Ctrl-c -3->abort // retorna ao promtp inicial --> No Scilab, os comentários sempre começam com os caracteres //, como foi mostrado no exemplo anterior. • A opção Demos - permite executar os vários programas de demonstração que acompa- nham a distribuição Scilab. Na Figura 2.3, são apresentados os programas de demonstra- ção dispońıveis no Scilab versão 3.0. É interessante, e muito importante, em um primeiro contato com o programa, executar algumas dessas rotinas de demonstração. Figura 2.3: Programas de demonstração, opção Demos , do Scilab 3.0. • A opção Graphics Window N permite manipular janelas gráficas. Aqui, N representa a janela gráfica que está sendo utilizada. Ao inicializar, Scilab utiliza N = 0, significando que Graphics Window 0 é a primeira janela gráfica ou a janela gráfica default. Esta opção possui cinco sub-opções: – Set (Create) Window – Raise (Create) Window – Delete Graphics Window - permite apagar uma janela gráfica, – + - passa para a próxima janela gráfica {N+1}. – - - retorna para a janela gráfica anterior {N-1}. • A opção Help permite obter informações sobre as diversas funções e comandos do Scilab. Essa opção possui três sub-opções: – Help browser - ativa o navegador default do Scilab. Esse navegador carrega os textos com o help das funções implementadas no Scilab, seus toolboxes e eventuais toolboxes instalados pelo usuário (ver Apêndice C). O navegador de help também Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 8 pode ser ativada diretamente no prompt do Scilab. Usando o mouse na sub-opção Help browser temos a tela de help mostrada na Figura 2.4 com o navegador padrão do Scilab. Figura 2.4: Tela da sub-opção Help browser com navegador padrão do Scilab. – Apropos - ativa uma janela onde pode ser digitada uma palavra chave do assunto sobre o qual se deseja algum tipo de aux́ılio. Essa opção também pode ser ativada diretamente no prompt do Scilab. – Configure - permite que seja escolhido um outro navegador em substituição ao na- vegador default do help do Scilab. A Figura 2.5 mostra as opções de navegadores para a versão 3.0 do Scilab. Figura 2.5: Tela de configuração para a escolha do navegador do Help do Scilab. Para Scilab versão 3.0, o help está dispońıvel para os seguintes conjuntos de funções: – Programming - conjunto de comandos que podem ser utilizados na programação com o Scilab; – Graphic Library - conjunto de comandos gráficos; – Elementary Functions - conjunto de funções elementares; – Input/Output Functions - conjunto de funções para entrada e sáıda de dados; Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 11 3, 1415926. . . , e %e é a variável que representa a constante de Euler e = 2.7182818. . . . Uma outra variável pré-definida é %eps que representa a precisão da máquina na qual Scilab está instalado (%eps é o maior número para o qual 1+%eps = 1). São pré-definidas, ainda, as variáveis %inf que significa “Infinito” e %nan que significa “Não é um Número”, NotANumber. A variável %s é definida pelo comando s = poly(0, ’s’). No Scilab são definidas, também, variáveis com valores booleanos: %T significando “verdadeiro” (true) e %F significando “falso” (false). Scilab também é carregado com algumas funções pré-definidas, chamadas de funções primi- tivas ou funções intŕınsecas5. No Caṕıtulo 3, apresentamos alguns exemplos de utilização dessas funções. Atenção especial deve ser dada às variáveis SCI e PWD. Elas representam, respectivamente, o diretório no qual o Scilab foi instalado6 e o diretório no qual o Scilab foi lançado e está rodando. A variável home possui valor idêntico ao da variável PWD. -->SCI // Diretorio onde Scilab foi instalado SCI = /usr/local/scilab-3.0 -->PWD // Diretorio onde Scilab foi lancado PWD = /home/paulo -->home // Mesmo valor da variavel PWD home = /home/paulo --> As variáveis pré-definidas e protegidas estão no arquivo de inicialização SCI/scilab.star. Se desejar, o usuário pode pré-definir as suas próprias variáveis e, depois, colocá-las no arquivo .scilab localizado na sua área de trabalho. Como mostrado nos exemplos anteriores, os comentários sempre começam com os caracteres //. Também, é importante salientar que os comentários (e os nomes das variáveis e funções utilizadas no Scilab) NÃO devem ter qualquer tipo de acentuação. 2.4 Manipulação de Arquivos e Diretórios Scilab possui funções que podem ser utilizadas para manipular arquivos e diretórios. A função pwd, não confundir com a variável PWD da seção anterior, mostra o diretório no qual estamos trabalhando. Assim, -->pwd // Mostra o diretorio de trabalho ans = /home/paulo 5Ver Apêndice D para a listagem dessas funções. 6Ver Apêndice A. Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 12 --> Usando a função chdir, mudamos para o diretório de trabalho teste, -->chdir(’teste’) // Mudando o diretorio de trabalho ans = 0. --> Uma observação importante: para Scilab, uma resposta igual a 0 (zero) para determinados tipos de comandos indica que a ação foi realizada com sucesso. É o caso da resposta 0 obtida quando do comando chdir(’teste’). Por termos mudado de diretório de trabalho, o valor de retorno da função pwd foi alterado mas o valor da variável PWD permanece inalterada, como podemos verificar pela seqüência de comandos, -->pwd // Mostrando o novo diretorio de trabalho ans = /home/paulo/teste -->PWD // PWD permanece inalterado. PWD = /home/paulo --> As variáveis criadas durante os trabalhos realizados no ambiente Scilab podem ser armaze- nadas em um arquivo. Vamos considerar as variáveis, -->a = 1 a = 1. -->b = 2 b = 2. --> Para salvar as variáveis a e b em um arquivo, que chamamos de dados.dat, usamos o comando save com a sintaxe -->save(’dados.dat’,a,b) --> Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 13 O comando save cria o arquivo dados.dat no diretório de trabalho. O arquivo dados.dat é um arquivo binário. Para recuperar os valores de a e b, usamos o comando load, conforme mostrado no exemplo, -->clear // Eliminando as variaveis nao protegidas -->a !--error 4 undefined variable : a -->b !--error 4 undefined variable : b -->load(’dados.dat’,’a’,’b’) -->a, b a = 1. b = 2. --> Neste exemplo, o comando clear elimina todas as variáveis não protegidas do ambiente Scilab. Por esse motivo, as variáveis a e b, definidas anteriormente, quando chamadas após clear, fazem com que Scilab apresente a mensagem de error undefined variable, variável indefinida. Em seguida, através do comando load, as variáveis são lidas do arquivo dados.dat e retomam seus valores originais, passando novamente a existirem no ambiente Scilab. A função unix_w permite a comunicação do Scilab com a shell Linux (Unix). Usando esta função, as respostas são apresentadss na própria janela do Scilab. -->pwd ans = /home/paulo/teste -->unix_w(’ls’) // Mostrando o conteudo de /home/paulo/teste Makefile Relatorio.pdf app app.c app.o chromosome.c chromosome.h chromosome.o -->unix_w(’mkdir outro_dir’) // Criando o diretorio outro_dir Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 16 Scilab Function besselk - Modified Bessel functions of the second kind (K sub alpha). Calling Sequence y = besselk(alpha,x) y = besselk(alpha,x,ice) Parameters x : real vector with non negative entries alpha : real vector with non negative entries regularly spaced with increment equal to one alpha=alpha0+(n1:n2) ice : integer flag, with default value 1 Description besselk(alpha,x) computes modified Bessel functions of the second kind (K sub alpha), for real, non-negative order alpha and argument x . alpha and x may be vectors. The output is m -by- n with m = size(x,’*’) , n = size(alpha,’*’) whose (i,j) entry is besselk(alpha(j),x(i)) . K_alpha and I_alpha (see besseli ) modified Bessel functions are 2 independant solutions of the modified Bessel ’s differential equation : 2 2 2 x y" + x y’ - (x + alpha ) y = 0 , alpha >= 0 If ice is equal to 2 exponentialy scaled Bessel functions is computed (K_alpha_scaled(x) = exp(x) K_alpha(x)). Examples // example : display some K bessel functions x = linspace(0.01,10,5000)’; y = besselk(0:4,x); ys = besselk(0:4,x,2); xbasc() subplot(2,1,1) plot2d(x,y, style=2:6, leg="K0@K1@K2@K3@K4", rect=[0,0,6,10]) xtitle("Some modified bessel functions of the second kind") subplot(2,1,2) plot2d(x,ys, style=2:6, leg="K0s@K1s@K2s@K3s@K4s", rect=[0,0,6,10]) xtitle("Some modified scaled bessel functions of the second kind") See Also besselj , besseli , bessely , Author W. J. Cody, L. Stoltz (code from Netlib (specfun)) Figura 2.9: Texto do help para a função besselk. Como podemos observar, no texto do help estão especificados: • O nome da função, como implementado pelo Scilab; • O(s) comando(s) de chamada da função, Calling Sequence; • Os parâmetros da função, Parameters; • Uma descrição da função implementada, Description; • Exemplos de utilização da função, Examples; • Funções relacionadas, See Also, e neste caso, • Autor da função, Author. Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 17 2.6 Arquivos com Comandos Scilab Como vimos, o comando save pode ser utilizado para armazenar variáveis em um arquivo binário. Essas variáveis podem ser recuperadas através da utilização do comando load. Além do armazenamento de variáveis, Scilab permite que os comandos digitados em seu ambiente durante uma sessão sejam armazenados em um arquivo, construindo uma espécie de “memória de cálculos”. O armazenamento dos comandos é feito através da utilização do comando diary(‘‘nome_do_arquivo’’). Na Figura 2.10 mostramos um exemplo da utilização do comando diary para armazenar uma sessão de utilização do ambiente Scilab. Neste exemplo, através do comando -->diary(‘‘memoria-09072004’’) instrúımos o Scilab para armazenar todos os comandos subseqüentes em um arquivo chamado memoria-09072004. O armazenamento dos comandos será realizado até que seja executado o comando --diary(0) O comando diary(0) fecha o arquivo memoria-09072004. Figura 2.10: Comando diary para gravação de sessões desenvolvidas no ambiente Scilab. O arquivo memoria-09072004 é um arquivo texto puro, paulo@none:~$ cat memoria-09072004 -->// Todos os comandos digitados serao armazenados no arquivo -->// memoria-09072004 -->a = 1; b = 2; c = 3; -->a + b ans = Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 18 3. -->b * c ans = 6. -->diary(0) paulo@none:~$ podendo, portanto, ser editado. No Caṕıtulo sobre programação, veremos novos tipos de arquivos de comandos do Scilab. Neste Caṕıtulo, apresentamos as principais caracteŕısticas do ambiente Scilab. No próximo Caṕıtulo, exploramos um pouco mais esse ambiente através da realização de algumas operações básicas envolvendo grandezas reais e complexas e da utilização de funções pré-definidas do Scilab. Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 21 Também é posśıvel desdobrar um único comando em várias linhas utilizando ... ao final do comando. Por exemplo, -->A = 3 * m ^ 2 + ... // Um comando em varias linhas --> 4 * 5 + ... --> 5 * 3 A = 41.75 --> Um vetor de ı́ndices possui a forma geral Variavel = valor_inicial:incremento:valor_final Por exemplo, através do comando I=1:3 atribúımos os valores 1, 2, e 3 à variável I. Quando não especificado, incremento é igual a 1. Assim, -->I = 1:3 // Definindo I como um vetor com 3 posicoes I = ! 1. 2. 3. ! -->j = 1:2:5 // Indice j com incremento igual a 2 j = ! 1. 3. 5. ! --> O valor do incremento pode ser negativo, -->k = 5:-1:1 // Definindo k como um vetor com 5 posicoes k = ! 5. 4. 3. 2. 1. ! --> No Scilab existe o conceito de ambientes definidos via uma hierarquia de prompts. Muda-se de ambiente através do comando pause ou através de Ctrl-c. Todas as variáveis definidas no primeiro ambiente são válidas no novo ambiente. Observar que a mudança de ambiente modifica a forma de apresentação do prompt. Este passa a indicar o ambiente no qual estão sendo efetuados os comandos. O retorno ao ambiente anterior dá-se através da utilização dos comandos resume ou return. Com este tipo de retorno, perde-se as variáveis definidas no ambiente anterior. A utilização de ambientes é importante para a realização de testes. No exemplo a seguir, atribúımos a a o valor 1.5 e, através do comando pause, mudamos de ambiente. -->// Definindo a e mudando de ambiente -->a = 1.5; pause -1-> // Mudanca no prompt Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 22 Observar que houve uma mudança no formato do prompt. A variável a, definida no ambiente anterior, ainda é válida no novo ambiente, como podemos verificar através da seqüência de comandos, -1->a a = 1.5 -1-> Vamos definir, no novo ambiente, a variável b igual a 2.5, -1->// Definindo b no novo ambiente -1->b = 2.5; -1->// Mostrando a e b no novo ambiente -1->a, b a = 1.5 b = 2.5 -1-> O retorno ao ambiente anterior usando o comando resume faz com que a variável b fique indefinida, // Retornando ao ambiente anterior -1->resume // Pode ser usado o comando return --> // Mostrando a e b. Observar que a variavel b foi perdida -->a, b a = 1.5 !--error 4 undefined variable : b O valor da variável b pode ser preservado no ambiente original através da seqüência de comandos, -->a = 1.5 // Definindo a variavel a no ambiente original a = 1.5 Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 23 -->pause // Mudando de ambiente -1->b = 1.5 // Definindo a variavel b no novo ambiente b = 1.5 -1->b = resume(b) // Enviando b para o ambiente original -->a, b a = 1.5 b = 1.5 --> 3.2 Utilizando as Funções Internas do Scilab O Scilab é carregado com algumas funções pré-definidas1. Como vimos no Caṕıtulo anterior, na Figura 2.9, o help do Scilab explica cada uma delas e, também, apresenta exemplos de sua utilização. Uma maneira de verificar a forma de utilização e o comportamento de uma determinada função interna do Scilab é usando o exemplo que o próprio help do Scilab apresenta. Neste caso, basta copiar o exemplo de uso da função apresentado no help para o ambiente do Scilab2. Na Figure 3.1, mostramos como esse procedimento funciona usando a função fft do toolbox de Processamento de Sinais, Signal Processing toolbox, que acompanha o Scilab. Figura 3.1: Rodando o exemplo de utilização da função fft apresentado no help do Scilab. 1Ver Apêndice D para a listagem dessas funções. 2Especificamente, o processo consiste em copiar do ambiente help e colar no ambiente Scilab. Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 26 -->q = poly([1 2], ’s’, ’coeff’) q = 1 + 2s -->roots(q) // Obtendo as raizes do polinomio q ans = - 0.5 --> Para complementar o exemplo, os dois polinômios podem ser multiplicados, divididos, so- mandos ou subtráıdos como mostra a seqüência de comandos, -->p * q // Multiplicacao ans = 2 3 2 + s - 5s + 2s -->p / q // Divisao ans = 2 2 - 3s + s ---------- 1 + 2s -->[r, q] = pdiv(p,q) // Efetuando a divisao: q=quociente, r=resto q = - 1.75 + 0.5s r = 3.75 -->p + q // Adicao ans = 2 3 - s + s -->p - q // Subtracao ans = 2 1 - 5s + s --> Para obter valores de polinômios, usamos a função horner, Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 27 -->x = poly(0, ’x’) x = x -->p = x^2 - 3*x + 5 // definindo o polinomio p = 2 5 - 3x + x -->horner(p, 2) // avaliando o polinomio em x = 2 ans = 3. --> 4.2 Vetores Vamos considerar R o conjunto dos números reais1. Dizemos que x é um vetor de dimensão n em R, indicado por x ∈ Rn, se, e somente se, x =  x1 x2 ... xn  Nessa definição, cada um dos elementos do vetor x, xi, pertence a R, xi ∈ R O elemento xi é o i-ésimo elemento do vetor x. O vetor x definido anteriormente é um vetor coluna. Para explicitar esta condição, escreve- mos x ∈ Rn×1 Essa notação indica que o vetor x possui n linhas e apenas uma coluna. No Scilab, os vetores são criados colocando-se seus componentes entre colchetes, [ ]. Os elementos de um vetor coluna são separados por ponto-e-v́ırgula. Assim, -->x = [ 1; 2; 3] // vetor coluna. Elementos separados por ; x = ! 1. ! ! 2. ! ! 3. ! --> 1Todas as considerações sobre vetores e matrizes podem ser estendidas para o conjunto dos números complexos, C. Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 28 Um vetor linha, y, de dimensão n em R pode ser escrito na forma y = [ y1, y2, . . . , yn ] Para explicitar a condição de vetor linha, escrevemos y ∈ R1×n Essa notação indica que o vetor y possui apenas uma linha e n colunas. No Scilab, os componentes de um vetor linha são separados por espaço ou por v́ırgula. -->y = [ 1 2 3] // vetor linha; Elementos separados por espaco y = ! 1. 2. 3. ! -->z = [ 4, 5, 6] // vetor linha; Elementos separados por virgula z = ! 4. 5. 6. ! --> Se x é um vetor coluna, xT (lê-se “x transposto”) é um vetor linha. Essa operação é realizada no Scilab através da utilização do śımbolo ’ (apóstrofo). -->x = [1; 2; 3] // vetor coluna x = ! 1. ! ! 2. ! ! 3. ! -->x’ // x transposto = vetor linha ans = ! 1. 2. 3. ! --> Vetores podem ser multiplicados ou divididos por quantidades escalares. Também, veto- res de mesma dimensão podem ser somados ou subtráıdos. Para exemplificar algumas dessas operações, vamos considerar os vetores: x = 12 3  e y = 45 6  Observar que os dois vetores possuem a mesma dimensão, isto é, x,y ∈ R3×1. Temos, -->x = [ 1; 2; 3] // Definindo o vetor x x = ! 1. ! Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 31 -->C = x * y’ // Produto vetorial de x por y C = ! 4. 5. ! ! 8. 10. ! ! 12. 15. ! --> Nos exemplos a seguir, mostramos outras maneiras de construir vetores, usando ı́ndices e algumas funções internas do Scilab: -->v = 5: -0.5: 3 // Vetor com elementos decrementados v = ! 5. 4.5 4. 3.5 3. ! -->m = ones(1:4) // Vetor constituido de elementos iguais a 1 m = ! 1. 1. 1. 1. ! -->z = zeros(1:5) // Vetor constituido de elementos iguais a 0 z = ! 0. 0. 0. 0. 0. ! --> 4.3 Matrizes Seja R o conjunto dos números reais. Dizemos que A é uma matriz de dimensão m× n em R, indicado por A ∈ Rm×n, se, e somente se, A =  a1,1 a1,2 · · · a1,n a2,1 a2,2 · · · a2,n ... ... . . . ... am,1 am,2 · · · am,n  onde cada um dos elementos ai,j ∈ R. Nessa notação, a variável m indica o número de linhas e a variável n indica o número de colunas da matriz A. Se A for uma matriz quadrada, o número de linhas é igual ao número de colunas e, então, m = n. Vamos considerar as matrizes A,B ∈ R2×3, A = [ 1 2 3 5 −8 9 ] e B = [ 1 2 3 4 5 6 ] No Scilab, as matrizes são representadas entre colchetes, [ ]. Os elementos que constituem as linhas das matrizes são separados por espaços ou por v́ırgulas. A indicação de término de cada linha da matriz é feita com ponto-e-v́ırgula. Nos exemplos a seguir, para fixar conceitos, a matriz A é digitada com os elementos de suas linhas separados por espaços enquanto a matriz B é digitada com os elementos de suas linhas separados por v́ırgula. Assim, Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 32 -->// Matriz A - Elementos das linhas separados por espaco -->A = [1 2 3; 5 -8 9] A = ! 1. 2. 3. ! ! 5. - 8. 9. ! -->// Matriz B - Elementos das linhas separados por virgulas -->B = [1, 2, 3; 4, 5, 6] B = ! 1. 2. 3. ! ! 4. 5. 6. ! -->size(A) // Dimensao da matriz A ans = ! 2. 3. ! -->size(B) // Dimensao da matriz B ans = ! 2. 3. ! --> Uma outra forma de digitar matrizes no ambiente Scilab, é separando os elementos de uma linha por espaço (ou por v́ırgula) e as linhas separadas por enter, -->M = [ 1 2 3 4 -->5 6 7 8 -->9 11 13 15] M = ! 1. 2. 3. 4. ! ! 5. 6. 7. 8. ! ! 9. 11. 13. 15. ! --> Matrizes podem ser multiplicadas ou divididas por quantidades escalares. Também, matrizes de mesma dimensão podem ser somadas ou subtráıdas. Considerando as matrizes A e B do exemplo anterior, temos: -->2 * A // Multiplicacao por um escalar ans = ! 2. 4. 6. ! ! 10. - 16. 18. ! Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 33 -->A / 2 // Divisao da matriz A por uma constante ans = ! 0.5 1. 1.5 ! ! 2.5 - 4. 4.5 ! -->A + B // Somando as duas matrizes ans = ! 2. 4. 6. ! ! 9. - 3. 15. ! --> Se A ∈ Rm×n, a transposta da matriz A, indicada por AT , é tal que AT ∈ Rn×m. Como no caso dos vetores, a trasposição é indicada pelo śımbolo ’ (apóstrofo). Considerando a matriz B do exemplo anterior, temos: -->B = [1, 2, 3; 4, 5, 6] B = ! 1. 2. 3. ! ! 4. 5. 6. ! -->size(B) // Dimensao da matriz B ans = ! 2. 3. ! -->C = B’ // C = transposta da matriz B C = ! 1. 4. ! ! 2. 5. ! ! 3. 6. ! -->size(C) // Dimensao da matriz C ans = ! 3. 2. ! --> Se A ∈ Rm×p e B ∈ Rp×n, podemos definir o produto das matrizes A e B, C = A×B ∈ Rm×n Observar que, para que possa haver a multiplicação entre duas matrizes, é necessário que o número de colunas da primeira matriz seja igual ao número de linhas da segunda matriz. Considerando as matrizes A e B, A = 1 2 34 5 6 7 8 9  e B = 1 42 5 3 6  Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 36 • a utilização expĺıcita dos ı́ndices do elemento a ser acessado, • a utilização do śımbolo : (dois pontos) • a utilização do śımbolo $ ou • a utilização de operações booleanas. Vamos considerar o vetor linha v = [1 2 3 4 5 6 7]. O acesso a um elemento deste vetor é feito de forma convencional, o ı́ndice do vetor indicando qual elemento que está sendo acessado. Assim, -->v = [1 2 3 4 5 6 7] // definicao do vetor v v = ! 1. 2. 3. 4. 5. 6. 7. ! -->v(1) // acesso ao primeiro elemento de v ans = 1. -->v(5) // acesso ao quinto elemento de v ans = 5. --> O śımbolo : permite definir formas compactas de acesso a elementos de um vetor. Por exemplo, -->v(2:4) // acesso aos elementos 2, 3 e 4 de v ans = ! 2. 3. 4. ! -->v(:) // acesso a todos os elementos de v ans = ! 1. ! ! 2. ! ! 3. ! ! 4. ! ! 5. ! ! 6. ! ! 7. ! -->v(1:2:7) // acesso aos elementos inpares de v ans = ! 1. 3. 5. 7. ! --> Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 37 enquanto o śımbolo $ permite acessar o último elemento do vetor, -->v($) // acesso ao ultimo elemento de v ans = 7. --> Também, podemos utilizar operações booleanas para acessar elementos de um vetor. Na sessão, -->v([%f %t %f %t %t]) // acesso usando %t e %f ans = ! 2. 4. 5. ! --> acessamos o segundo, quarto e quinto elemento do vetor v. Lembrar que %t significa true, verdadeiro, e que %f significa false, falso. Para exemplificar acessos a elementos de matrizes, vamos considerar a matriz A com duas linhas e três colunas, A ∈ R2x3, -->// Definindo uma matriz A -->A = [1 2 3; 4 5 6] A = ! 1. 2. 3. ! ! 4. 5. 6. ! --> O acesso a um elemento dessa matriz é feito da maneira convencional: o elemento da linha i e coluna j, ai,j , é acessado através do comando A(i,j), com i e j tendo seus valores numéricos explicitados. Por exemplo, para acessar o elemento a1,2 da matriz A, usamos o comando A(1,2), -->// Acessando o elemento da primeira linha e segunda coluna de A -->A(1,2) ans = 2. --> O comando M = A([1 2], 2), permite construir uma matriz, M, composta pelo primeiro e segundo elementos, indicados pelo vetor [1 2], da segunda coluna da matriz A, -->M = A([1 2], 2) M = Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 38 ! 2. ! ! 5. ! --> Através do operador : Scilab implementa formas compactas que permitem acessar elementos de uma matriz. Considerando A ∈ Rm×n, a notação A(k, :) representa a k-ésima linha da matriz A, A(k, :) = [ak,1, ak,2, . . . , ak,n] e a notação A(:, k) representa a k-ésima coluna da matriz A, A(:, k) = [a1,k, a2,k, . . . , am,k] Nesse contexto, e para facilitar a compreensão, o śımbolo : (dois pontos) assume o significado de “todos os elementos”. Assim, A(k, :) pode ser lido como “todos os elementos da k-ésima linha da matriz A” e A(:, k) pode ser lido como “todos os elementos da k-ésima coluna da matriz A”. Considerando a matriz A do exemplo anterior, o comando A(:,3), permite acessar todos os elementos da terceira coluna da matriz A, ->// Todos os elementos da terceira coluna da matriz A -->A(:, 3) ans = ! 3. ! ! 6. ! --> enquanto o comando A(2,:) permite acessar todos os elementos da segunda linha da matriz A, ->// Todos os elementos da segunda linha da matriz A -->A(2,:) ans = ! 4. 5. 6. ! --> O comando A(:, 3:-1:1) permite formar uma matriz constitúıda por todos os elementos das colunas três, dois e um da matriz A. Lembrar que 3:-1:2 é idêntico ao vetor [3 2 1]. -->// Todos os elementos da terceira, segunda e primeira colunas de A -->A(:, 3:-1:1) ans = ! 3. 2. 1. ! ! 6. 5. 4. ! -->A(:, [3 2 1]) // Forma equivalente ans = Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 41 ans = ! 2. 3. ! --> É posśıvel, caso seja necessário, alterar os valores de elementos de uma matriz. Considerando a matriz A, podemos mudar o valor do seu elemento A(2,1) através do comando de atribuição A(1,2) = 10, -->// Atribuir a A(1,2) o valor 10 -->A(1,2) = 10 A = ! 1. 10. 3. ! ! 4. 5. 6. ! --> Depois, atribúımos os valores [-1; -2] aos primeiro e segundo elementos da segunda coluna da matriz A, -->// A(1,2) = -1 e A(2,2) = -2 -->A([1 2], 2) = [-1; -2] A = ! 1. - 1. 3. ! ! 4. - 2. 6. ! --> Finalmente, modificamos os elementos A(1,1) e A(1,2) da matriz A. -->// A(1,1) = 8 e A(1,2) = 5 -->A(:,1) = [8;5] A = ! 8. - 1. 3. ! ! 5. - 2. 6. ! --> 4.5 Matrizes com Polinômios Os elementos de uma matriz podem ser polinômios, -->// Definindo um polinomio -->x = poly(0, ’x’); p = 2 + 3 * x + x ^ 2 Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 42 p = 2 2 + 3x + x -->// Definindo uma matriz polinomial, M -->M = [p, p-1; p+1, 2] M = ! 2 2 ! ! 2 + 3x + x 1 + 3x + x ! ! ! ! 2 ! ! 3 + 3x + x 2 ! -->// Avaliando a matriz M em x = 2 -->horner(M, 2) ans = ! 12. 11. ! ! 13. 2. ! -->// Obtendo a inversa de M -->inv(M) ans = ! 2 ! ! 2 - 1 - 3x - x ! ! --------------------- -------------------- ! ! 2 3 4 2 3 4 ! ! 1 - 6x - 11x - 6x - x 1 - 6x - 11x - 6x - x ! ! ! ! 2 2 ! ! - 3 - 3x - x 2 + 3x + x ! ! -------------------- -------------------- ! ! 2 3 4 2 3 4 ! ! 1 - 6x - 11x - 6x - x 1 - 6x - 11x - 6x - x ! -->// Obtendo o determinante de M -->det(M) ans = 2 3 4 1 - 6x - 11x - 6x - x --> Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 43 A partir de uma matriz formada por elementos que são polinômios racionais, -->// Definindo uma matriz F de polinomios racionais -->s = poly(0, ’s’); -->F = [ 1/s, (s +1)/(s + 2); ... --> s/(s+3), s^2 ] F = ! 1 1 + s ! ! - ----- ! ! s 2 + s ! ! ! ! 2 ! ! s s ! ! ----- - ! ! 3 + s 1 ! --> podemos criar outra matriz apenas com o numerador das frações, -->F(’num’) // Pegando os numeradores ans = ! 1 1 + s ! ! ! ! 2 ! ! s s ! --> ou com seus denominadores, -->F(’den’) // Pegando os denominadores ans = ! s 2 + s ! ! ! ! 3 + s 1 ! --> 4.6 Matrizes Simbólicas O Scilab permite a criação e manipulação de matrizes simbólicas. Vamos considerar uma matriz B ∈ R1×2, constitúıda por elementos simbólicos, -->// Matriz simbolica -->B = [ 1/%s, (%s + 1)/(%s - 1)] Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 46 -->// A e B -->A & B ans = ! T F T F F F ! --> 4.8 Operações com Vetores e Matrizes A Tabela 4.1, apresenta a sintaxe de alguns dos operadores dispońıveis no ambiente Scilab que podem ser utilizados em operações com vetores ou com matrizes. SÍMBOLO OPERAÇÃO ’ transposta + adição - subtração * multiplicação / divisão à direita \ divisão à esquerda ^ exponenciação .* multiplicação elemento-a-elemento .\ divisão, à esquerda, elemento-a-elemento ./ divisão, à direita, elemento-a-elemento .^ exponenciação elemento-a-elemento .*. produto de Konecker Tabela 4.1: Sintaxe de alguns operadores usados em operações vetoriais ou matriciais. As operações envolvendo os operadores ’, +, -, * e / já foram apresentadas em parágrafos anteriores. Os outros operadores mostrados na Tabela 4.1 serão apresentados nessa Seção. Vamos analisar a utilização do operador \. Para isso, definimos um sistema de equações lineares, a1,1x1 + a1,2x2 + · · · + a1,nxn = b1 a2,1x1 + a2,2x2 + · · · + a2,nxn = b2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . an,1x1 + an,2x2 + · · · + an,nxn = bn que pode ser escrito na forma matricial Ax = b onde A =  a1,1 a1,2 · · · a1,n a2,1 a2,2 · · · a2,n ... ... . . . ... an,1 an,2 · · · an,n  Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 47 com x =  x1 x2 ... xn  e b =  b1 b2 ... bn  Nas expressões anteriores, A ∈ Rn×n é a matriz dos coeficientes, x ∈ Rn×1 é o vetor das incógnitas e b ∈ Rn×1 é o vetor de termos independentes. Resolver um sistema linear é obter o valor do vetor x. Na situação mais simples, a matriz A é não-singular (admite inversa) e a solução, única, é dada pela expressão x = A−1b onde A−1 é a inversa da matriz A. A expressão anterior pode ser representada no Scilab como --> x = inv(A) * b onde inv, com vimos em exemplo anterior, é uma função interna do Scilab que calcula a inversa de uma matriz. Para exemplificar, vamos considerar um sistema linear com A = [ 2 0 0 4 ] e b = [ 1 8 ] Temos, --> // Solucao de Ax = b usando a funcao inv -->A = [2 0; 0 4] // Matriz A A = ! 2. 0. ! ! 0. 4. ! -->inv(A) // A admite inversa ans = ! 0.5 0. ! ! 0. 0.25 ! -->b = [1; 8] // Vetor b b = ! 1. ! ! 8. ! -->x = inv(A) * b // Solucao do sistema linear x = ! 0.5 ! ! 2. ! --> Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 48 O mesmo resultado pode ser encontrado utilizando-se o operador \. Temos, então, --> Resolucao de Ax = b usando o operador \ -->x = A \ b x = ! 0.5 ! ! 2. ! --> É importante observar que o śımbolo \ não define uma divisão matricial. Indica, apenas, uma outra forma de se obter a solução de um sistema linear. O operador . (ponto), como pode ser visto na Tabela 4.1, é utilizado com outros operadores (*, \, /, ^) para realizar operações elemento a elemento de vetores ou de matrizes. A sessão do Scilab a seguir mostra exemplos dessas operações utilizando vetores. --> Definicao do vetor x -->x = [1 3 4 6] x = ! 1. 3. 4. 6. ! --> Definicao do vetor y -->y = [2 4 6 8] y = ! 2. 4. 6. 8. ! -->x .* y ans = ! 2. 12. 24. 48. ! -->x * y !--error 10 inconsistent multiplication --> A operação .* gera um vetor formado pelo produto dos elementos dos vetores x e y. Apenas para fixar conceitos, verificamos que a operação x * y não pode ser realizada. Continuando com os exemplos, usamos os operadores ./ para dividir os elementos do vetor x pelos elementos do vetor y, -->x ./ y ans = Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 51 -->// Definicao da matriz B -->B = [ 2 2 2; 2 2 2; 2 2 2] B = ! 2. 2. 2. ! ! 2. 2. 2. ! ! 2. 2. 2. ! -->A ./ B ans = ! 0.5 1. 1.5 ! ! 2. 2.5 3. ! ! 3.5 4. 4.5 ! --> como era de se esperar. Continuando com os exemplos, temos -->A .^ B ans = ! 1. 4. 9. ! ! 16. 25. 36. ! ! 49. 64. 81. ! --> onde cada elemento da matriz A foi elevado ao elemento correspondente na matriz B, que equivale, no caso a -->A .^ 2 ans = ! 1. 4. 9. ! ! 16. 25. 36. ! ! 49. 64. 81. ! --> Temos, ainda, a operação -->A .\ B ans = ! 2. 1. 0.6666667 ! ! 0.5 0.4 0.3333333 ! ! 0.2857143 0.25 0.2222222 ! Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 52 --> que equivale à operação -->B ./ A ans = ! 2. 1. 0.6666667 ! ! 0.5 0.4 0.3333333 ! ! 0.2857143 0.25 0.2222222 ! --> O produto de Kronecker entre duas matrizes, A ∈ Rm×n e B ∈ Rp×q, A =  a1,1 a1,2 · · · a1,n a2,1 a2,2 · · · a2,n ... ... . . . ... am,1 am,2 · · · am,n  e B =  b1,1 b1,2 · · · b1,q b2,1 b2,2 · · · b2,q ... ... . . . ... bp,1 bp,2 · · · bp,q  é representado por A⊗B ∈ R(m∗p)×(n∗q) e definido por: A⊗B =  a1,1B a1,2B · · · a1,nB a2,1B a2,2B · · · a2,nB ... ... . . . ... am,1B am,2B · · · am,nB  Para exemplificar, vamos considerar as matrizes A = [ 1 2 3 4 ] e B = [ 1 2 3 4 5 6 ] No Scilab, o produto de Kronecker é implementado através do operador .*., como podemos ver no exemplo, --> // Definindo as matrizes A e B -->A = [1 2; 3 4] A = ! 1. 2. ! ! 3. 4. ! -->B = [1 2 3; 4 5 6] B = ! 1. 2. 3. ! ! 4. 5. 6. ! -->A .*. B // Produto de Kronecker via operador .*. ans = Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 53 ! 1. 2. 3. 2. 4. 6. ! ! 4. 5. 6. 8. 10. 12. ! ! 3. 6. 9. 4. 8. 12. ! ! 12. 15. 18. 16. 20. 24. ! --> ou através da função interna kron, -->kron(A, B) // Produto de Kronecker usando funcao interna ans = ! 1. 2. 3. 2. 4. 6. ! ! 4. 5. 6. 8. 10. 12. ! ! 3. 6. 9. 4. 8. 12. ! ! 12. 15. 18. 16. 20. 24. ! --> 4.9 Listas Uma lista é uma coleção de objetos não necessariamente do mesmo tipo. Uma lista simples é definida pela função list. Esta função tem a forma geral list(a1, a2,. . . ,an) onde os ai são os elementos da lista. Vamos criar uma lista simples, que chamamos de L, composta por três elementos : o elemento 1, associado a L(1), o elemento w, associado a L(2) e uma matriz 2x2 composta de elementos iguais a 1, associada a L(3), -->// Uma lista simples com 3 elementos -->L = list(1, ’w’, ones(2,2)) L = L(1) 1. L(2) w L(3) ! 1. 1. ! ! 1. 1. ! Caṕıtulo 5 Programação Uma das caracteŕısticas mais importante do Scilab é a facilidade com que o usuário pode criar seus próprios programas. Apesar de simples, a linguagem Scilab disponibiliza a maioria das estruturas das linguagens de programação convencionais. A diferença principal é que, na programação Scilab, não há a necessidade da declaração prévia dos tipos das variáveis que serão utilizadas ao longo do programa. Um fator a ser levado em consideração é que Scilab é um interpretador de comandos. Os programas escritos na linguagem Scilab são, portanto, normalmente executados em um tempo maior que os programas semelhantes escritos em linguagens compiláveis. Este fato é mais relevante quando precisamos desenvolver programas para a realização de simulações ou de oti- mizações. Nesses casos, pode ser conveniente escrever o código responsável pela lentidão do processamento em uma linguagem convencional (no caso, C ou FORTRAN) e rodar esse código dentro do ambiente Scilab. No Apêndice B, mostramos os procedimentos necessários à ligação de códigos escritos em C com programas escritos em Scilab. Deve ser enfatizado, entretanto, que a vantagem na utilização do Scilab advém da facilidade de prototipação de programas e da disponibilidade de uma poderosa biblioteca de funções gráficas. Como sempre ocorre nessas situações, cabe ao usuário encontrar a sua solução de compromisso. Nos Caṕıtulos anteriores, vimos como escrever e executar comandos a partir do prompt do Scilab. Neste Caṕıtulo, apresentamos as principais estruturas de controle de fluxo de programas. Essas estruturas são utilizadas, depois, para gerar programas, chamados de scripts ou de funções, que serão executados no ambiente Scilab. 5.1 Comandos para Iterações Existem dois comandos que permitem a realização de iterações, loops, no Scilab: o loop implementado com o comando for e o loop implementado com o comando while. 5.1.1 O Loop for O comando for tem a forma geral: for variavel = vetor_linha instrucao_1 instrucao_2 ... ... instrucao_n end No ambiente Scilab, a forma acima é equivalente a 56 Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 57 -->for variavel=vetor_linha --> instrucao_1 --> instrucao_2 --> instrucao_n -->end como mostrado no exemplo, --> Loop for em linha de comando -->for k = 1:3 -->a = k + 1 -->end a = 2. a = 3. a = 4. --> Como vimos no exemplo, no loop for o comportamento das iterações é baseado no conteúdo do vetor linha. No exemplo a seguir, vamos considerar que a variável k do comando for assuma os valores estabelecidos pelo vetor linha v = [2 3 4 5 6]. O número de iterações, portanto, será igual ao número de componentes do vetor linha v. Teremos, dessa forma, cinco iterações. Na primeira iteração, o valor da variável k será igual ao primeiro elemento do vetor v, v(1), que é igual a 2, e na última iteração o valor da variável k será igual ao último elemento do vetor v, v(5), que vale 6. No ambiente Scilab, temos: -->v = [2 3 4 5 6]; // v tambem pode ser escrito como v = 2:6 -->y = 0; -->for k = v -->y = y + k -->end y = 2. y = 5. y = 9. y = Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 58 14. y = 20. --> O vetor v poderia ter sido descrito na forma v = 2:6. A variável do comando for também pode ser uma lista. Neste caso, a variável assume os valores dos elementos da lista, como no exemplo: -->L = list(1, [1 2; 3 4], ’teste’) L = L(1) 1. L(2) ! 1. 2. ! ! 3. 4. ! L(3) teste -->for k=L -->disp(k) -->end 1. ! 1. 2. ! ! 3. 4. ! teste --> 5.1.2 O Loop while O comando while tem a forma geral, while condicao instrucao_1 instrucao_2 ... ... instrucao_n end Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 61 --> y = x -->end -->// Outra forma -->x = 1 // Inicializando x = 1. -->if x > 0 then, y = -x, else, y=x, end y = - 1. -->x = -1 x = - 1. -->if x > 0 then, y = -x, else, y=x, end y = - 1. --> 5.2.2 Comando select-case O condicional select-case tem a forma geral, select variavel_de_teste case expressao_1 sequencia_de_instrucoes_1 case expressao_2 sequencia_de_instrucoes_2 ... ... ... ... ... ... ... ... case expressao_n sequencia_de_instrucoes_n else sequencia_de_instrucoes_n+1 end A forma acima é equivalente à forma -->select variavel_de_teste -->case expressao_1 --> sequencia_de_instrucoes_1 -->case expressao_2 --> sequencia_de_instrucoes_2 -->case expressao_n --> sequencia_de_instrucoes_n Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 62 -->else --> sequencia_de_instrucoes_n+1 -->end O condicional select-case compara o valor de uma variável de teste com as várias expres- sões dos case. Serão executadas as instruções que possuirem o valor da expressão do case igual ao valor da variável de teste. Um exemplo de utilização do condicional select-case, -->x = -1 x = - 1. -->select x -->case 1 --> y = x + 5 -->case -1 --> y = sqrt(x) y = i -->end -->x = 1 x = 1. -->select x, case 1, y = x+5, case -1, y = sqrt(x), end y = 6 --> 5.3 Definindo Scripts Vimos, no Caṕıtulo 3, que é posśıvel, através dos comandos save e load, armazenar e recu- perar valores de variáveis utilizadas no ambiente Scilab. Vimos, também, que é posśıvel, através do comando diary, criar arquivos onde armazenamos a memória das sessões que realizamos no Scilab. Além desses dois tipos de arquivos, podemos criar arquivos contendo comandos do Scilab que serão executados posteriormente dentro do seu ambiente. Um desses arquivos, chamados de arquivos scripts ou simplesmente scripts, são formados por texto puro, sem acentuação, contendo uma seqüência de comandos que o usuário digitaria em uma sessão interativa no prompt do Scilab. Por convenção, os scripts do Scilab possuem extensão sce e são executados através do comando -->exec(‘‘nome_do_arquivo_de_comandos.sce’’) São caracteŕısticas dos arquivos scripts: Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 63 • Todas as variáveis definidas no arquivo de comandos permanecem válidas no ambiente Scilab após a execução dos comandos do arquivo, e • Não há uma definição clara das entradas e sáıdas do script. Esse fato pode dificultar a correção de posśıveis erros. Para exemplificar, vamos escrever um script na linguagem Scilab para obter a √ 2 usando o método iterativo de Newton-Raphson. Segundo esse método [9], a raiz de uma função, f(x) pode ser calculada através da expressão, xi+1 = xi − f(xi) f ′(xi) onde f ′(xi) representa a derivada da função f(x) no ponto xi e i = 0, 1, . . . , n representa o número de iterações. A função f(x) que permite obter a √ 2 é f(x) = x2 − 2 Assim, usando a fórmula de Newton-Raphson, temos xi+1 = xi − x2 − 2 2x Usando x0 = 1.0 como aproximação inicial, escrevemos o script mostrado em Código 1, // script: metodo de Newton-Raphson // f(x) = x * x - 2 N = 10; // Numero maximo de iteracoes x0 = 1.0; // Aproximacao inicial delta = 10^(-5); // Erro xn = x0; for n=1:N xn1 = xn - (xn * xn - 2)/(2 * xn); if abs((xn1-xn)/xn1) < delta then printf(’Valor da raiz = %10.7f’,xn1) return end xn = xn1; end printf(’Nao converge em n=%f iteracoes", N) Código 1: O script que implementa o método de Newton-Raphson para obter √ 2. Observar o ; após alguns comandos. Isso evita que a execução do script seja um processo “ruidoso” no ambiente Scilab. A execução do script, que foi armazenado em um arquivo chamado newton.sce, e o resultado é mostrado na sessão, -->exec newton.sce // executando o script -->// script: metodo de Newton-Raphson Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 66 -->Usando deff -->deff(’[y1, y2]=exemplo(x1, x2)’,’y1=x1+x2, y2=x1*x2’) -->[a, b] = exemplo(3,4) b = 12. a = 7. --> 3. Digitando o texto da função em um arquivo e, em seguida, carregando esse arquivo no ambiente Scilab. Por convenção, as funções definidas pelo usuário possuem extensão sci e são carregadas no ambiente Scilab através do comando: -->getf(‘‘nome_do_arquivo_de_comandos.sci’’) Exemplos de funções constrúıdas desta maneira serão apresentados na seção 5.4.2. A escolha de um dos procedimentos anteriores depende da conveniência do usuário. 5.4.1 Variáveis Globais e Variáveis Locais As variáveis globais são válidas no ambiente do Scilab enquanto as variáveis locais são válidas apenas no escopo de uma função. Para exemplificar os conceitos, vamos considerar a função f(x1, x2), -->function [y1, y2] = f(x1, x2) -->y1 = x1 + x2 -->y2 = x1 - x2 -->endfunction Observe que y1 e y2 são as variáveis de sáıda enquanto x1 e x2 são as variáveis de entrada da função. Vamos considerar alguns exemplos de chamadas desta função. Inicialmente, a função é chamada com argumentos x1 =1 e x2 = 3 tendo seus parâmetros de retorno associados às váriáveis m1 e m2. Observe que y1 e y2, apesar de terem sido calculados dentro da função (definição local), não são definidas no ambiente do Scilab. -->[m1, m2] = f(1,3) // Retorno associado as variaveis [m1, m2] m2 = - 2. m1 = 4. --> // Provocando erro : y1 e y2 nao sao globais -->y1 !--error 4 Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 67 undefined variable : y1 -->y2 !--error 4 undefined variable : y2 --> Continuando com o exemplo, a função é chamada sem a associação expĺıcita de variáveis de retorno. Este caso é como se a função f(x1, x2) tivesse sido chamada com a associação de apenas uma variável de retorno, uma chamada do tipo z = f(1,3) . -->f(1,3) // Chamada equivalente a z = f(1,3) ans = 4. --> O exemplo continua e um erro é provocado quando a função é chamada com apenas um argumento. Logo em seguida, o argumento é definido no ambiente (definição global) e a função é, novamente, chamada com apenas um argumento sem que haja a ocorrência de erro. -->f(1) // Erro por indefinicao de argumento !--error 4 undefined variable : x2 at line 2 of function f called by : f(1) -->x2 = 3 // Definindo x2 no ambiente (global) x2 = 3. -->f(1) // Chamando a funcao com apenas um argumento ans = 4. --> Como está claro pela sessão anterior, a chamada de uma função sem que todos os seus argu- mentos de entrada tenham sido previamente definidos ocasiona erro. Os argumentos de entrada devem ser definidos expĺıcitamente na chamada ou através de definições via variáveis globais. Considerando a função anterior, teremos, como casos interessante (mas não aconselháveis!), os exemplos, -->x1 = 2; x2 = 3; // Definindo x1 e x2 -->f() // Chamando a funcao f sem nenhum argumento ans = Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 68 5. -->[m1, m2] = f() // Retorno associado as variaveis [m1, m2] m2 = - 1. m1 = 5. --> 5.4.2 Arquivos com Funções Como vimos nas seções anteriores, é posśıvel definir funções dentro do próprio ambiente Scilab. Entretanto, quando a função possui muitos comandos, é mais conveniente utilizar um editor de textos para criar, fora do ambiente Scilab, um arquivo contendo a função. É importante observar que o nome desse arquivo não é, necessariamente, o nome que deve ser dado à função. Como primeiro exemplo [9], vamos desenvolver um programa para resolver a equação dife- rencial ordinária, dy dx = (x− y)/2 com condição inicial y(0) = 1, utilizando o método de Runge-Kutta de quarta ordem. Vamos considerar o intervalo de integração [0, 3] e o passo de integração igual a h = 1/8. A solução numérica obtida por Runge-Kutta será comparada com valores da solução exata que é y(x) = 3e−x/2 + x− 2. O método Runge-Kutta de quarta ordem, para resolver uma equação diferencial ordinária de primeira ordem, dy dx = f(x, y) é representado pelas equações, yk+1 = yk + h 6 (f1 + 2f2 + 2f3 + f4) com os coeficientes fi definidos por : f1 = f(xk, yk) f2 = f(xk + h 2 , yk + h 2 f1) f3 = f(xk + h 2 , yk + h 2 f2) f4 = f(xk + h, yk + hf3) e pode ser implementado através do Algoritmo 1: Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 71 -->getf(’fdexy.sci’) // arquivo com a funcao f(x,y) = (x - y)/2 --> carrega a função f(x,y) no ambiente Scilab. Depois, com o comando -->getf(’fsolucao.sci’) // arquivo com a funcao solucao = 3exp(-x/2)+x-2 --> a função com a solução exata é carregada. Finalmente, o comando getf(’rkutta4.sci’) car- rega o arquivo que define a função rk42 e o comando rk4(0, 3, 1/8, 1) executa o programa. Os resultados obtidos são : -->getf(’rkutta4.sci’) // arquivo com o metodo de Runge-Kutta 4a. ordem -->rk4(0, 3, 1/8, 1) // executando o programa ans = ! 0. 1. 1. ! ! 0.125 0.9432392 0.9432392 ! ! 0.25 0.8974908 0.8974907 ! ! 0.375 0.8620874 0.8620874 ! ! 0.5 0.8364024 0.8364023 ! ! 0.625 0.8198470 0.8198469 ! ! 0.75 0.8118679 0.8118678 ! ! 0.875 0.8119457 0.8119456 ! ! 1. 0.8195921 0.8195920 ! ! 1.125 0.8343486 0.8343485 ! ! 1.25 0.8557844 0.8557843 ! ! 1.375 0.8834949 0.8834947 ! ! 1.5 0.9170998 0.9170997 ! ! 1.625 0.9562421 0.9562419 ! ! 1.75 1.0005862 1.0005861 ! ! 1.875 1.049817 1.0498169 ! ! 2. 1.1036385 1.1036383 ! ! 2.125 1.1617724 1.1617723 ! ! 2.25 1.2239575 1.2239574 ! ! 2.375 1.2899485 1.2899483 ! ! 2.5 1.3595145 1.3595144 ! ! 2.625 1.4324392 1.432439 ! ! 2.75 1.5085189 1.5085188 ! ! 2.875 1.5875626 1.5875625 ! ! 3. 1.6693906 1.6693905 ! --> Na primeira coluna são mostrados os valores de x, na segunda coluna são mostrados os valores da solução aproximada, y, e na terceira coluna são mostrados os valores da solução exata, 3e−x/2 + x− 2. 2Esta ordem é irrelevante. Observe que os nomes das funções e os nomes dos arquivos que as contém são, intencionalmente, diferentes. Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 72 Como segundo exemplo de programação, [9], vamos resolver um sistema triangular superior de equações lineares, Este exemplo requer a leitura de um arquivo externo contendo dados. Vamos considerar o sistema triangular superior, 4x1 − x2 + 2x3 + 2x4 − x5 = 4 − 2x2 + 6x3 + 2x4 + 7x5 = 0 x3 − x4 − 2x5 = 3 − 2x4 − x5 = 10 3x5 = 6 Para resolver estes tipos de sistemas, usamos a matriz dos coeficientes aumentada, definida por [A | b] =  4 −1 2 2 −1 0 −2 6 2 7 0 0 1 −1 −2 0 0 0 −2 −1 0 0 0 0 6 ∣∣∣∣∣∣∣∣∣∣∣∣∣∣ 4 0 3 10 6  e o processo de substituição reversa, indicado pelo Algoritmo 2: Algoritmo 2: Método da Substituição Reversa. xn = bn an,n for r = n− 1 até 1 do soma = 0 for j = r + 1 até n do soma = soma + ar,j ∗ xj end xr = b(r)− soma ar,r end A matriz aumentada, neste caso, é armazenada em um arquivo ASCII, que chamamos de arquivo1. O conteúdo de arquivo1, digitado com um editor qualquer, pode ser visto no ambiente Linux usando o comando cat, paulo:~/metodos/funcoes/aula3$ cat arquivo1 4 -1 2 2 -1 4 0 -2 6 2 7 0 0 0 1 -1 -2 3 0 0 0 -2 -1 10 0 0 0 0 3 6 Este arquivo é lido pelo Scilab através do comando: -->Ab = read(’arquivo1’, 5, 6) Ab = ! 4. - 1. 2. 2. - 1. 4. ! ! 0. - 2. 6. 2. 7. 0. ! Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 73 ! 0. 0. 1. - 1. - 2. 3. ! ! 0. 0. 0. - 2. - 1. 10. ! ! 0. 0. 0. 0. 3. 6. ! --> onde Ab é a variável que contém a matriz aumentada. O comando read lê as cinco linhas e as seis colunas de dados do arquivo1 que está armazenado no diretório de trabalho. Caso seja necessário, a matriz dos coeficientes, A, e o vetor dos termos independentes, b, podem ser recuperados da matriz Ab através da seqüência de comandos: -->// Numero de linhas, nl, numero de colunas, nc, de Ab -->[nl nc] = size(Ab) nc = 6. nl = 5. -->A = Ab(:,1:nc-1) // Matriz dos coeficientes A = ! 4. - 1. 2. 2. - 1. ! ! 0. - 2. 6. 2. 7. ! ! 0. 0. 1. - 1. - 2. ! ! 0. 0. 0. - 2. - 1. ! ! 0. 0. 0. 0. 3. ! -->b = Ab(:,nc) // Vetor dos termos independentes b = ! 4. ! ! 0. ! ! 3. ! ! 10. ! ! 6. ! --> O programa para resolver o sistema linear é mostrado no Código 5, Caṕıtulo 6 Gráficos no Scilab Apresentamos alguns comandos que podem ser utilizados para traçar gráficos bi-dimensionais e tri-dimensionais. Informações mais detalhadas sobre todos os comandos dispońıveis na bibli- oteca gráfica do Scilab1 podem ser acessadas através do navegador de help. 6.1 A Janela de Gráficos do Scilab Todas as sáıdas gráficas de comandos do Scilab são apresentadas em uma janela gráfica. Essa janela é mostrada na Figura 6.1. Figura 6.1: Janela gráfica do Scilab Na Figura 6.1, observamos a existência de um menu horizontal com cinco opções: File , Zoom , UnZoom , 3D Rot. e Edit . Utilizando o mouse para selecionar cada uma dessas opções, verificamos que: • A opção File - possui sete sub-opções que permitem manipular arquivos relacionados com gráficos gerados: Clear, Select, Print, Export, Save, Load e Close; 1O Apêndice D contém uma listagem de todos os comandos da biblioteca gráfica do Scilab 76 Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 77 • A opção Zoom - permite a ampliação de uma parte do gráfico. Escolhendo esta opção e delimitando uma área, a parte do gráfico dentro da área escolhida será expandida. Esta opção ainda não está implementada para gráficos tri-dimensionais; • A opção UnZoom - desfaz as manipulações realizadas através da opção Zoom ; • A opção 3D Rot. - permite efetuar rotações em gráficos bi-dimensionais e tri-dimensionais, e • A opção Edit - possui sete sub-opções que permitem manipular o gráfico gerado: Select, Redraw, Erase, Figure Properties, Current Axes Properties, Start Entity Picker, Stop Entity Picker. Algumas dessas opções serão utilizadas no decorrer deste Caṕıtulo. No Scilab, gráficos sucessivos são sobrepostos em uma mesma janela gráfica. Para evitar que isso ocorra, podemos utilizar o comando clf(). As janelas gráficas podem ser manipuladas através da função scf(). Por exemplo, -->// Manipulacao de janelas graficas -->scf(0) // Acesso a janela grafica 0 (default) -->scf(1) // Acesso a janela grafica 1 --> 6.2 Gráficos Bi-dimensionais Gráficos bi-dimensionais podem ser gerados através da utilização da função plot2d()2. A forma mais simples da função plot2d() é: plot2d([x],y) onde x e y podem ser matrizes ou vetores reais. Os colchetes, [ e ], envolvendo x indicam que este parâmetro é opcional. Vamos fazer algumas considerações sobre os parâmetros x e y: 1. Se x e y são vetores, a função plot2d() permite traçar o gráfico de y em função de x. É importante observar que os dois vetores devem ter a mesma dimensão, isto é, os dois vetores devem ter o mesmo número de elementos; 2. Se x é um vetor e y é uma matriz, a função plot2d() permite traçar o gráfico de cada coluna da matriz y em função do vetor x. Neste caso, o número de elementos das colunas da matriz y deve ser igual ao número de elementos do vetor x; 3. Se x e y são matrizes, a função plot2d() permite traçar o gráfico de cada coluna da matriz y em função de cada coluna da matriz x. Neste caso, as matrizes devem ter as mesmas dimensões; 4. Se y é um vetor, a função plot2d() permite traçar o gráfico do vetor y em função do vetor [1:size(y)], e 2O comando plot() está obsoleto. Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 78 5. Se y é uma matriz, a função plot2d() permite traçar o gráfico da matriz y em função do vetor [1:size(y)]. Vamos apresentar exemplos de gráficos gerados para cada uma das opções de entrada x, y apresentadas anteriormente. Os gráficos serão gerados no intervalo [0, 2π], com incremento 0.1. No ambiente Scilab, temos, -->// Definindo o vetor das abcissas, x -->x = [0:0.1:2*%pi]; // Intervalo [0, 2pi], incremento 0.1 -->// Item 1 - x vetor, y vetor -->y = sin(x); --> // Os dois vetores devem ter a mesma dimensao -->size(x) ans = ! 1. 63. ! // Observar que x possui 63 colunas -->size(y) ans = ! 1. 63. ! // Observar que y possui 63 colunas -->plot2d(x,y) -->clf() // Limpa a tela grafica - evitar sobreposicao --> // Item 2 - x vetor, y matriz -->Y = [sin(x)’ cos(x)’]; // Definindo a matriz Y --> // Observar que a matriz Y possui 63 elementos em cada coluna -->size(Y) ans = ! 63. 2. ! -->plot2d(x,Y) -->clf() -->// Item 3 - x e y sao matrizes -->// Definindo uma variavel auxiliar -->t = [0:0.1:2*%pi]; Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 81 // Script para gerar a Figura 2 do capitulo 6 // Graficos - Scilab 3.0 // Definindo o vetor das abcissas, x x = [0:0.1:2*%pi]; // Item 1 - y vetor y = sin(x); // xsetech[abcissa, ordenada, largura, altura] do grafico xsetech([0, 0, 0.3, 0.5]); xtitle("Item 1"); plot2d(x,y) // Item 2 - y matriz Y = [sin(x)’ cos(x)’]; // Definindo a matriz Y xsetech([0.35, 0, 0.3, 0.5]); xtitle("Item2"); plot2d(x,Y) // Item 3 - x e y sao matrizes // Definindo uma variavel auxiliar t = [0:0.1:2*%pi]; // Criando a matriz X X = [t’ t’]; // Criando a matriz Y Y = [cos(t)’ sin(t)’]; xsetech([0.70, 0, 0.3, 0.5]); xtitle("Item 3"); plot2d(X,Y) // Item 4 - y vetor xsetech([0, 0.5, 0.5, 0.5]); xtitle("Item 4"); plot2d(sin(x)) // Item 5 - Y matriz xsetech([0.5, 0.5, 0.5, 0.5]); xtitle("Item 5"); plot2d(Y) Código 6: O script utilizado para gerar o gráfico da Figura 6.2. Esse script, quando executado, gera o gráfico apresentado na Figura 6.2. A forma geral para da função plot2d() inclui um terceiro argumento, <opt_args>, plot2d([x],y,<opt_args>) onde <opt_args> é uma seqüência de opções que determinam as caracteŕısticas do gráfico bi- dimensional, < opt args >:= opcao 1 = valor 1, opcao 2 = valor 2, . . . , opcao n = valor n Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 82 As opções podem ser: • style - é utilizada para especificar o padrão para a curva (ou curvas) que estão sendo traçadas. O valor associado à essa opção deve ser um vetor com valores inteiros positivos ou negativos. Se o valor associado for positivo, a curva é cont́ınua. Nesse caso, o valor associado à opção define, também, a cor da curva que está sendo traçada. Se o valor associado à opção for negativo ou zero, a curva será desenhada usando marcadores. • logflag - define a escala, logaŕıtmica ou linear, a ser utilizada nos eixos x e y do gráfico. Os valores associados à essa opção são strings, “nn”, “nl”, “ln” e “ll”, onde l indica a escala logaŕıtmica, n indica escala normal e a segunda letra indica o tipo de graduação dos eixos (normal ou logaŕıtmica). O valor default desta opção é “nn”, isto é, escala normal com graduação normal dos eixos; • rect - é utilizada para estabelecer os limites do gráfico. O valor associado à essa opção é um vetor real com quatro entradas, [xmin, ymin, xmax, ymax], onde xmin, xmax e ymin, ymax indicam os valores mı́nimo e máximo para os eixos x e y, respectivamente; • frameflag - É utilizada para controlar a escala dos eixos coordenados. O valor associado à essa opção é um número inteiro no intervalo 0 e 8, inclusive; • axesflag - especifica como os eixos serão traçados. O valor associado à essa opção é um número inteiro variando entre 0 e 5, inclusive; • nax - permite definir os nomes e as marcas nos eixos x e y. O valor associado à essa opção, válido apenas quando a opção axesflag=1, é um vetor com quatro entradas inteiras, [nx, Nx, ny, Ny]. O parâmetro Nx é o número de marcações principais (tics) utilizadas no eixo x; nx é o número de divisões (subtics) entre as marcações principais do eixo x; Ny e ny têm significados semelhantes, tratando-se do eixo y, e • leg - permite definir as legendas das curvas. O valor associado à esse parâmetro é uma string de caracteres para cada gráfico traçado. A sessão Scilab, -->x = [-%pi:0.1:%pi]; -->y = [sin(x)’ cos(x)’]; -->plot2d(x,y, style=[1, -1], rect=[-%pi, -1.5, %pi, 1.5],axesflag=5, ... -->leg = "sin(x)@cos(x)") --> exemplifica a forma de utilização de algumas opções do comando plot2d(). A sáıda é mostrada na Figura 6.3. Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 83 Figura 6.3: Sáıdas para a função plot2d([x], y, <opt_args>). Observar que a primeira curva, sin(x), é cont́ınua já que o valor do parâmetro style associado a ela é positivo enquanto a segunda curva, cos(x), está desenhada com marcas já que o parâmetro style associado a ela é negativo. A opção rect estabelece os limites dos eixos x e y, enquanto a opção axesflag=5 traça os eixos na forma apresentada. Finalmente, a opção leg associa uma legenda a cada curva desenhada. O comando plot2d() apresenta algumas variações3, como mostrado na Tabela 6.1. Comando Tipo de Gráfico plot2d2() gráficos 2-D linearizados plot2d3() gráficos 2-D com barras verticais plot2d4() gráficos 2-D com setas Tabela 6.1: Variações do comando plot2d() A sub-opção Graphics da opção Demos apresenta exemplos de utilização da função plot2d() e de suas variações. É importante lembrar que o demo de uma função gráfica também pode ser ativado através da chamada da função. Por exemplo, para ativar o demo da função gráfica histplot, que plota um histograma, basta fazer: -->histplot() 6.2.1 Outros Comandos Existem comandos que podem ser utilizados para melhorar a apresentação de um gráfico. Dentre eles, destacamos: • xgrid - coloca uma grade em um gráfico bi-dimensional. 3O comando plot2d1(), para traçar gráficos bi-dimensionais em escala logaŕıtmica está obsoleto. Utilizar plot2d() com a opção logflag adequada Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 86 • nyquist - permite traçar o gráfico da parte imaginária versus parte real da resposta em freqüência de um sistema linear; • m_cicle - gráfico M-ćırculo usado com o gráfico de Nyquist; • chart - permite traçar a diagrama de Nichols; • black - permite traçar o diagrama de Black para um sistema linear; • evans - permite traçar o o lugar das ráızes pelo método de Evans; • plzr - permite traçar o diagrama de polos e zeros. O help do Scilab fornece informações mais detalhadas sobre a utilização dessas funções. 6.3 Gráficos Tri-dimensionais O comando plot3d() permite traçar gráficos de superf́ıcies, z = f(x, y) Na notação Scilab, as variáveis independentes x e y são vetores de dimensões n1 e n2, respectivamente, e a variável dependente z é uma matriz de dimensão n1×n2. Então, por essa definição, o elemento z(i,j) é o valor da superf́ıcie no ponto (x(i), y(j)). Para exemplificar o uso de plot3d(), vamos considerar a função cos(x) ∗ sin(y) no intervalo [0, 2π] com incremento igual a 0.1. A sessão Scilab, -->x = [0:0.1:2*%pi]’; -->y = x; -->z = cos(x) * sin(x’); -->plot3d(x, x, z) --> gera o gráfico mostrado na Figura 6.6. Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 87 Figura 6.6: Exemplo de sáıda gráfica 3-D. Além da função plot3d(), e de suas variações, Scilab implementa outras funções que per- mitem traçar gráficos tri-dimensionais. Dentre elas, destacamos: • fplot3d - que permite traçar gráficos de superf́ıcies definidas por funções, como no script mostrado no exemplo: deff(’z=f(x,y)’,’z=x^4-y^4’) x=-3:0.2:3 ;y=x ; clf() ;fplot3d(x,y,f,alpha=5,theta=31) • fplot3d1 - que permite traçar gráficos de superf́ıcies definidas por funções, com o no caso anterior. As superf́ıcies são apresentadas em escala cinza ou com uma graduação de cores. 6.3.1 Gráficos 3-D Especiais As seguintes funções permitem traçar gráficos tri-dimensionais especiais: • param3d - permite traçar curvas paramétricas; • hist3d - permite traçar histogramas 3-D; • contour - permite traçar curvas de ńıvel para uma função 3-D. Na Figura 6.7, utilizamos o comando subplot() para dividir a janela gráfica do Scilab e mostrar exemplos de utilização de algumas funções que geram gráficos 3-D especiais. Introdução ao Scilab-Versão 3.0/PSMP/DCA-UFRN 88 Figura 6.7: Exemplos de gráficos 3-D especiais. Para gerar os gráficos apresentados na Figura 6.7, utilizamos os comandos: -->// Exemplos de graficos 3-D especiais -->subplot(121); -->param3d Demo of param3d t=0:0.1:5*%pi;param3d(sin(t),cos(t),t/10,35,45,’X@Y@Z’,[2,4]); -->subplot(122) -->hist3d hist3d(10*rand(10,10)); --> Ressaltamos que a sintaxe de todos esses comandos pode ser verificada usando o help do Scilab.
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved