Professional Documents
Culture Documents
Fundamentos de SCILAB
verso preliminar a
Prefcio a
O SCILAB um software para computao cient e ca ca e visualizaao, gratuito, com cdigo c o fonte aberto e interface para as linguagens FORTRAN e C. Ele permite a soluo de problemas ca numricos em uma frao do tempo que seria necessrio para escrever um programa em uma e ca a linguagem como FORTRAN, Pascal ou C, devido `s suas centenas de funes matemticas. a co a O SCILAB desenvolvido pelo INRIA (Institut National de Recherche en Informatique e et en Automatique) e ENPC (Ecole Nationale des Ponts et Chausses) da Frana. Em e c www.scilab.org esto dispon a veis vrias informaes, documentaao e instrues de como a co c co baixar o programa. As verses do SCILAB esto dispon o a veis na forma pr-compilada para e diversas plataformas: Linux, Windows, HP-UX e Mac OSX . Como o cdigo fonte tambm o e est dispon a vel, ele pode ser compilado para uso em um computador espec co. O objetivo deste texto apresentar o SCILAB (verso 4.1.2) como uma linguagem de proe a gramao dotada de funes no dispon ca co a veis nas linguagens convencionais. Por isto, este material pode ser utilizado em disciplinas, tais como, Programao de Computadores, Clculo ca a Numrico, Anlise Numrica, Algebra Linear e quaisquer outras dos cursos de Engenharia e a e e das reas de Cincias Exatas. Tambm, so exploradas algumas caracter a e e a sticas prprias o que mostram por que o SCILAB uma poderosa ferramenta de apoio ao aprendizado e e utilizao da Computao Cient ca ca ca. No Cap tulo 1 descrito o ambiente de programao do SCILAB mostrando a janela de e ca comandos e como obter informaes de comandos durante a sesso. O Cap co a tulo 2 apresenta as estruturas de dados suportadas pelo SCILAB, como constantes, vetores, matrizes, hipermatrizes, polinmios e listas. No Cap o tulo 3 so mostradas as expresses aritmticas, a o e lgicas e literais, bem como, o modo de execut-las. O Cap o a tulo 4 apresenta os formatos de exibio, gravao e leitura de variveis do espao de trabalho, alm de leitura de gravao ca ca a c e ca de dados em arquivos. No Cap tulo 5, o SCILAB visto como uma linguagem de proe gramao, sendo mostrado como escrever programas e funes, estruturas condicionais e de ca co repetio e depurao de programas. O Cap ca ca tulo 6 dedicado ` elaborao de grcos bi e a ca a e tridimensionais. Finalmente, o Cap tulo 7 apresenta funes do SCILAB para resolver co problemas de Computao Cient ca ca. Sugestes para aprimorar o presente texto, bem como, para efetuar correes sero bemo co a vindas pelo e-mail: ffcampos@dcc.ufmg.br. Belo Horizonte, setembro de 2008. Frederico F. Campos, lho DCC.ICEx.UFMG
Sumrio a
1 Ambiente de programao ca 1.1 Janela de comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.1 1.1.2 1.1.3 Espao de trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . c Mudana do diretrio corrente . . . . . . . . . . . . . . . . . . . . . . c o Gerenciamento de arquivos . . . . . . . . . . . . . . . . . . . . . . . .
1 1 3 4 4 4 5 5 6 6
1.2 Comandos de aux ao usurio . . . . . . . . . . . . . . . . . . . . . . . . . lio a 1.2.1 1.2.2 1.2.3 Comando help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comando apropos . . . . . . . . . . . . . . . . . . . . . . . . . . . . Menu de barras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 Estruturas de dados 2.1 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 2.1.2 2.1.3 Numricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e Lgicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o Literais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii
9 9 9 10 10
iv
SUMARIO 2.2 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 2.2.1 2.2.2 2.2.3 2.3 2.4 2.5 2.6 Regras para nomes de variveis . . . . . . . . . . . . . . . . . . . . . a Comando de atribuio . . . . . . . . . . . . . . . . . . . . . . . . . . ca Variveis especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 10 10 10 11 12 15 24 25 25 26 26 27 27 28 28 29 30 30 31
Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hipermatrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Polinmios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 2.6.6 2.6.7 Construo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca Avaliao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca Adio e subtrao . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca ca Multiplicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca Diviso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a Derivao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca Clculo de ra a zes . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33 33
v 34 35 39 41 41 44 49 50
3.2 Expresses lgicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o o 3.3 Expresses literais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 3.3.1 3.3.2 Converso de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . a Manipulao de caracteres . . . . . . . . . . . . . . . . . . . . . . . . ca
4 Comandos de entrada e sa da 4.1 Formato de exibio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca 4.2 Espao de trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c 4.2.1 4.2.2 4.2.3 4.2.4 Gravar dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Recuperar dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Entrada de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Janela de mensagem . . . . . . . . . . . . . . . . . . . . . . . . . . .
53 53 55 56 56 57 57 59 59 60 60 61 61
4.3 Dirio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 4.4 Leitura e gravao de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . ca 4.4.1 4.4.2 4.4.3 4.4.4 Abertura de arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . Fechamento de arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . Gravao em arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . ca Leitura em arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . .
vi
5 Linguagem de programao ca 5.1 Programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca 5.1.1 5.1.2 5.2 Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Subprograma function . . . . . . . . . . . . . . . . . . . . . . . . .
65 65 65 67 72 72 72 73 74 75 75 77 78 79 80
Estruturas condicionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.1 5.2.2 5.2.3 5.2.4 Estrutura if-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estrutura if-else-end . . . . . . . . . . . . . . . . . . . . . . . . .
5.3
Estruturas de repetio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca 5.3.1 5.3.2 5.3.3 Estrutura for-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estrutura while-end . . . . . . . . . . . . . . . . . . . . . . . . . . . Estrutura com interrupo no interior . . . . . . . . . . . . . . . . . . ca
5.4 5.5
6 Grcos a 6.1 Grcos bidimensionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 6.1.1 6.1.2 6.2 Funo plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca Funo fplot2d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca
83 83 83 86 88
Grcos tridimensionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a
SUMARIO 6.2.1 6.2.2 6.2.3 6.2.4 Funo meshgrid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca Funo plot3d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca Funo mesh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca Funo surf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca
vii 89 90 93 94 94 94 97 97 98 98
6.3 Janela de gura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4 Exerc cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Computao cient ca ca 7.1 Medidas de tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Algebra linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2.1 7.2.2 7.2.3 7.2.4 7.2.5 Parmetros da matriz . . . . . . . . . . . . . . . . . . . . . . . . . . . a
Decomposies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 co Soluo de sistemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 ca Inversa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Autovalores e autovetores . . . . . . . . . . . . . . . . . . . . . . . . 107
7.3 Interpolao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 ca 7.3.1 7.3.2 Clculo das diferenas nitas ascendentes . . . . . . . . . . . . . . . . 108 a c Interpolao unidimensional . . . . . . . . . . . . . . . . . . . . . . . 109 ca
viii
SUMARIO
Cap tulo 1
Ambiente de programao ca
O SCILAB executado por meio do script scilab no diretrio <SCIDIR>/bin, sendo que e o <SCIDIR> denota o diretrio onde o programa foi instalado. A interao entre o SCILAB e o o ca usurio feita por intermdio de uma janela, na qual um comando fornecido e o resultado a e e e exibido. Neste cap tulo ser descrita a janela de comando do SCILAB e seus comandos bsicos, bem a a como, os meios que o programa tem de auxiliar o usurio durante a sesso, no caso de d vida a a u sobre a sintaxe ou mesmo a existncia de um comando. e
1.1
Janela de comando
Para executar o SCILAB em ambiente Windows ou Macintosh, o cursor deve ser colocado sobre o seu cone e pressionado o boto da esquerda do mouse ou ento, no caso de ambia a ente Linux, entrar com o comando scilab ou scilab -nw (no window) em uma janela de comando. Sem a opo -nw aparecer uma nova janela pela qual ser feita a interaao entre ca a a c o SCILAB e o usurio (ver Figura 1.1). a Se for utilizada a opo -nw a janela do SCILAB aparecer na prpria janela de comando ca a o (ver Figura 1.2). O sinal de que o programa est pronto para receber um comando indicado a e pelo prompt formado pelos trs caracteres -->. e Um comando nalizado acionando-se a tecla Enter ou Return. Se um comando for muito e longo, ento trs pontos (...) seguidos do pressionamento da tecla Enter ou Return indica a e que o comando continuar na prxima linha. Vrios comandos podem ser colocados em a o a uma mesma linha se eles forem separados por v rgulas ou pontos-e-v rgulas. Alm disto, as e v rgulas indicam ao SCILAB para mostrar os resultados e os pontos-e-v rgulas para suprimir 1
a exibio. ca Um texto aps duas barras invertidas (//) ignorado; ele pode ser utilizado como um o e comentrio para a documentao de um programa. a ca As teclas e podem ser usadas para listar os comandos previamente dados e as teclas e movem o cursor na linha de comando facilitando a sua modicao. ca O n mero de linhas e colunas a serem exibidas de cada vez na janela de comando pode ser u redenida pelo comando lines. Sua sintaxe e lines(<nmero-de-linhas>,<nmero-de-colunas>) u u onde <nmero-de-linhas> e <nmero-de-colunas> denem o n mero de linhas e colunas, u u u respectivamente, a serem exibidas, sendo o segundo argumento opcional. O comando e
O comando clc usado para limpar a janela de comando1 e tohome posiciona o cursor no e canto superior esquerdo da janela de comando. O trmino de execuo do SCILAB feito e ca e pelos comandos quit ou exit. Quando o SCILAB ativado, os comandos contidos no arquivo scilab.ini so automatie a camente executados, caso ele exista, para que sejam atribu dos valores a alguns parmetros. a Deste modo, o usurio pode criar um arquivo contendo, por exemplo, denio de constantes a ca matemticas e f a sicas, formatos de exibio ou quaisquer comandos do SCILAB para persoca nalizar a sua janela de comando. Este arquivo deve ser criado em um diretrio espec o co, dependendo do sistema operacional utilizado (use help startup para mais informaes). co A abrangncia e potencialidade do SCILAB est muito alm do que ser mostrado neste e a e a 1 texto, por isso aconselhvel executar a opo Demos para visualizar uma demonstrao e e a ca ca se ter uma idia dessa potencialidade. e
1.1.1
Espao de trabalho c
As variveis criadas durante uma sesso cam armazenadas em uma memria denominada a a o espao de trabalho. O comando who lista o nome das variveis que esto sendo usadas, ou c a a seja, que esto presentes no espao de trabalho. Este comando lista as variveis criadas pelo a c a usurio e as denidas pelo prprio SCILAB. Por exemplo, no in de uma sesso, quando a o cio a o usurio criou apenas uma varivel, a a
-->a = 1 // cria a variavel a com o valor 1 a = 1. -->who your variables are... a scicos_pal %scicos_menu %scicos_short %scicos_help %scicos_display_mode modelica_libs scicos_pal_libs %scicos_lhb_list %CmenuTypeOneVector %helps home SCIHOME CreateScilabHomeDir PWD TMPDIR MSDOS SCI guilib sparselib xdesslib percentlib polylib intlib elemlib utillib statslib alglib siglib optlib autolib roblib soundlib metalib armalib tkscilib tdcslib s2flib mtlblib %F %T %z %s %nan %inf COMPILER %gtk %gui %pvm %tk $ %t %f %eps %io %i %e using 31686 elements out of 5000000. and 58 variables out of 9231
1
your global variables are... LANGUAGE %helps demolist %browsehelp %toolboxes %toolboxes_dir using 1122 elements out of 11000. and 7 variables out of LCC
767
1.1.2
Diretrio corrente aquele considerado em uso, sem ser necessrio especic-lo explicitao e a a mente durante uma ao. Para saber qual o diretrio de trabalho corrente utiliza-se o ca o comando pwd,
-->pwd // mostra o diretorio de trabalho corrente ans = /pkg/ccc/scilab
O resultado exibido depende do diretrio de onde o SCILAB foi executado. O diretrio o o corrente pode ser alterado por meio do comando cd,
-->cd ferramentas // muda o diretorio de trabalho corrente para ferramentas ans = /pkg/ccc/scilab/ferramentas
1.1.3
Gerenciamento de arquivos
O SCILAB fornece diversos comandos para gerenciamento de arquivos, os quais so mostraa dos na Tabela 1.1. Tabela 1.1: Comandos para gerenciamento de arquivos. Comando dir ou ls mdelete(<nome do arquivo>) cd <dir> ou chdir <dir> pwd Descrio ca lista os arquivos do diretrio corrrente; o remove o arquivo <nome do arquivo>; muda o diretrio para <dir>; o mostra o diretrio corrente. o
1.2
O SCILAB possui muito mais comandos do que aqueles apresentados neste texto, o que torna mais dif lembr-los. Com o intuito de auxiliar o usurio na procura de comandos, o cil a a programa prov assistncia por intermdio de suas extensivas capacidades de aux direto. e e e lio Estas capacidades esto dispon a veis em trs formas: o comando help, o comando apropos e e, interativamente, por meio de um menu de barras.
1.2.1
Comando help
O comando help a maneira mais simples de obter aux no caso de se conhecer o tpico e lio o em que se quer assistncia. Sua sintaxe e e help <tpico> o onde <tpico> o nome da funo ou de diretrio. Por exemplo, quando se usa help sqrt, o e ca o abre-se uma janela como a mostrada na Figura 1.3.
Figura 1.3: Janela do comando help. Assim so dadas informaes sobre a funo sqrt para extrair raiz quadrada. O comando a co ca help funciona a contento quando se conhece exatamente o tpico sobre o qual se quer o assistncia. Considerando que muitas vezes este no o caso, o help pode ser usado sem e a e <tpico> para apresentar uma pgina de hipertexto contendo a lista de o a tens dispon veis. O comando help mais conveniente se o usurio conhecer exatamente o tpico em que e a o deseja aux lio. No caso de no saber soletrar ou mesmo desconhecer um tpico as outras a o duas formas de assistncia so muitas vezes mais proveitosas. e a
1.2.2
Comando apropos
O comando apropos prov assistncia pela procura em todas as primeiras linhas dos tpicos e e o de aux e retornando aquelas que contenham a palavra-chave especicada. O mais imporlio tante que a palavra-chave no precisa ser um comando do SCILAB. Sua sintaxe e a e apropos <palavra-chave> onde <palavra-chave> a cadeia de caracteres que ser procurada nos comandos do SCIe a
LAB. Por exemplo, para informaes sobre fatorizao, tecla-se apropos factorization, co ca resultando em uma pgina listando os nomes de vrias funes com esta nalidade. Apesar a a co de a palavra factorization no ser um comando do SCILAB, ela foi encontrada na desa crio de vrios comandos. Um clique sobre uma das linhas na pgina exibida, por exemplo ca a a chfact - sparse Cholesky factorization, equivalente ao comando help, como mose trado na Figura 1.4.
1.2.3
Menu de barras
Quando o SCILAB executado sem a opo -nw, um aux por intermdio de menu-dirigido e ca lio e dispon e vel selecionando Help browser ou Apropos na opo Help do menu de barras. ca Como o uso desta forma de assistncia bem intuitivo, o melhor a fazer experimentar! e e e
1.3
Exerc cios
Seo 1.1 ca 1.1. Executar o programa SCILAB. 1.2. Vericar a diferena entre , e ; nos comandos %pi+1, %pi*10 e %pi+1; %pi*10;. c 1.3. Testar o funcionamento das teclas e . 1.4. Ver o funcionamento das teclas e . 1.5. Vericar a diferena entre lines(20), lines() e lines(0). c
1.3. Exerc cios Seo 1.2 ca 1.6. Quantos parmetros tem a funo erro erf? a ca 1.7. Quais so os comandos utilizados para interpolao (interpolation)? a ca 1.8. Qual o comando usado para calcular o determinante (determinant) de uma matriz? 1.9. Qual o comando para achar ra (roots) de uma equao polinomial? zes ca
1.10. Comparar a soma dos autovalores (eigenvalues) com o trao (trace) de uma matriz de c ordem qualquer. Fazer a mesma comparao usando uma matriz com elementos aleatrios. ca o
Cap tulo 2
Estruturas de dados
Neste cap tulo sero apresentados alguns a tens bsicos, tais como, constantes, variveis, a a vetores, matrizes, hipermatrizes, polinmios e listas, o que tornar poss o uso imediato o a vel do SCILAB no modo interativo. Alm disto, o conhecimento sobre as estruturas de dados e e fundamental para um uso eciente do programa.
2.1
Constantes
2.1.1
Numricas e
Uma constante numrica formada por uma seqncia de d e e ue gitos que pode estar ou no a precedida de um sinal positivo (+) ou um negativo (-) e pode conter um ponto decimal (.). Esta seqncia pode terminar ou no por uma das letras e, E, d ou D seguida de outra ue a seqncia de d ue gitos precedida ou no de um sinal positivo (+) ou um negativo (-). Esta a segunda seqncia a potncia de 10 pela qual a primeira seqncia multiplicada. Por ue e e ue e 1 2 exemplo, 1.23e-1 signica 1,2310 = 0,123 e 4.567d2 4,56710 = 456,7, e
-->1.23e-1 ans = 0.123 -->4.567d2 ans = 456.7
Algumas linguagens de programao requerem um tratamento especial para n meros comca u plexos, o que no o caso do SCILAB. Operaes matemticas com n meros complexos so a e co a u a escritas do mesmo modo como para n meros reais. Para indicar a parte imaginria basta u a acrescentar os trs caracteres (*%i), ou seja, multiplicar (*) por 1 = i representado por e (%i), 9
10
2.1.2
Lgicas o
Uma constante lgica pode assumir apenas dois valores: %t (ou %T) para verdadeiro e %f (ou o %F) para falso,
-->%t // valor verdadeiro ans = T -->%f // valor falso ans = F
2.1.3
Literais
Uma constante literal composta por uma cadeia de caracteres em vez de n meros ou e u verdadeiro e falso. A cadeia de caracteres deve estar delimitada por aspas () ou apstrofos o ("),
-->abcde ans = abcde // um valor literal
2.2
Variveis a
Uma varivel uma regio da memria do computador utilizada para armazenar uma ina e a o formao, sendo representada por um identicador. ca
2.2.1
Como qualquer outra linguagem de programao, o SCILAB tem regras a respeito do nome ca de variveis, conforme mostrado na Tabela 2.1. a
2.2.2
Comando de atribuio ca
O SCILAB um interpretador de expresses. A expresso fornecida analisada sintaticae o a e mente e se estiver correta ento ser avaliada. O resultado atribu ` uma varivel por a a e do a a intermdio do comando de atribuio e ca <varivel> = <express~o> a a Por exemplo,
2.2. Variveis a
11
Tabela 2.1: Regras para nomes de variveis. a Regra sobre nome de varivel a Comentrio a conter at 24 caracteres e caracteres alm do 24o so ignorados; e a comear com letra seguida de alguns caracteres de pontuao so permitidos; c ca a letras, n meros ou dos caracteres u , #, $, ! e ? tamanho da letra diferenciador raiz, Raiz e RAIZ so variveis distintas. e a a
-->a=10.2+5.1 a = 15.3
Quando o comando de atribuio for nalizado pelo caracter (;) ento o resultado atribu ca a e do ` varivel, porm o seu conte do no exibido, a a e u a e
-->b=5-2; // atribuicao sem exibir o resultado -->b // conteudo da variavel b ans = 3.
Se o nome da varivel e o sinal de atribuio (=) forem omitidos ento o resultado ser dado a ca a a ` varivel default ans, a a
-->8/5 ans = 1.6
2.2.3
Variveis especiais a
O SCILAB tem diversas variveis especiais, as quais so consideradas como pr-denidas, a a e no podendo ser alteradas ou removidas (com excesso de ans). Elas esto listadas na a a a Tabela 2.2. Para obter os valores destas variveis especiais, faz-se a
-->%e, %eps, %i, %inf, %nan, %pi, %s %e = 2.7182818 %eps = 2.220D-16 %i = i %inf = Inf %nan = Nan %pi = 3.1415927 %s = s
12
Tabela 2.2: Variveis especiais do SCILAB. a Varivel a ans %e %eps Valor nome de varivel default usada para resultados; a base do logaritmo natural, e = 2,71828 . . . menor n mero tal que quando adicionado a 1 cria um n mero de u u 52 ponto utuante maior que 1. Seu valor eps = 2 e 2,22041016 em computadores com aritmtica de ponto utuante IEEE; e i = 1; innito, por exemplo, 1/0; no um n mero (Not-A-Number), por exemplo, 0/0; a e u = 3, 14159 . . . usada como varivel de polinmio. a o
2.3
Vetores
Um vetor ou arranjo um conjunto de variveis homogneas (conte do de mesmo tipo) e a e u identicadas por um mesmo nome e individualizadas por meio de um ndice. No SCILAB o arranjo denido de vrias formas, por exemplo, elemento por elemento, separados por e a espao em branco ou v c rgula e delimitado por [ e ], <vetor> = [ e1 , e2 , ... , en ] sendo <vetor> o nome da varivel e ei o i-simo elemento, a e
-->a = [5 1.5,-0.3] a = 5. 1.5 - 0.3
O vetor a possui os elementos a(1)=5, a(2)=1.5 e a(3)=-0.3. Se os valores do arranjo forem igualmente espaados ele pode ser denido por intermdio da expresso c e a <vetor> = <valor inicial>:<incremento>:<valor final> Para gerar um vetor com o primeiro elemento igual a 10, o segundo igual a 15, o terceiro igual a 20 e assim sucessivamente at o ultimo igual a 40 basta o comando e
-->b = 10:5:40 b = 10. 15.
20.
25.
30.
35.
40.
7.
8.
9.
2.3. Vetores
13
Em vez de usar incremento, um arranjo pode tambm ser constru denindo o n mero e do u desejado de elementos na funo linspace, cuja sintaxe ca e <vetor> = linspace(<valor inicial>,<valor final>,<nmero de elementos>) u Assim, para criar um arranjo com o primeiro elemento igual a 10, o ultimo igual a 40 e possuindo 7 elementos,
-->c = linspace(10,40,7) c = 10. 15. 20. 25.
30.
35.
40.
Isto produz um vetor idntico a b=10:5:40 denido acima. Se no comando linspace o e parmetro <nmero de elementos> for omitido ento sero gerados 100 pontos. No caso a u a a de n meros complexos, os incrementos so feitos separadamente para a parte real e para a u a parte imaginria, a
-->d = linspace(1+%i,2+4*%i,5) d = 1. + i 1.25 + 1.75i 1.5 + 2.5i
1.75 + 3.25i
2. + 4.i
O endereamento indireto tambm poss c e e vel, permitindo referenciar os elementos em qualquer ordem
-->c([4 1]) // quarto e primeiro elementos ans = 25. 10.
Nos exemplos acima os arranjos possuem uma linha e vrias colunas, por isto so tambm a a e chamados vetores linha. Do mesmo modo, podem existir vetores coluna, ou seja, arranjos com vrias linhas e uma unica coluna. Para criar um vetor coluna elemento por elemento a estes devem estar separados por (;) <vetor> = [ e1 ; e2 ; ... ; en ] Deste modo, para gerar um vetor coluna com os elementos 1.5, -3.2 e -8.9,
14
Por isto, separando os elementos de um arranjo por brancos ou v rgulas so especicados os a elementos em diferentes colunas (vetor linha). Por outro lado, separando os elementos por ponto-e-v rgula especica-se os elementos em diferentes linhas (vetor coluna). Para transformar um vetor linha em vetor coluna e vice-versa, usa-se o operador de transposio (), ca
-->x = v x = 1.5 - 3.2 -->y = (1:3) y = 1. 2. 3.
- 8.9
No caso do vetor ser complexo, a transposio obtida pelo operador (.), pois o uso do ca e operador () resultar em um complexo conjugado transposto. Por exemplo, seja o vetor a complexo,
-->z = (1:3)+(0.1:0.1:0.3)*%i z = 1. + 0.1i 2. + 0.2i 3. + 0.3i
o transposto e
-->t = t = 1. 2. 3. z. + 0.1i + 0.2i + 0.3i
Assim, no caso do vetor no ser complexo a transposio pode ser feita usando () ou (.). a ca A funo length utilizada para saber o comprimento de um vetor ca e
-->l = length(z) l = 3.
2.4. Matrizes
15
2.4
Matrizes
As matrizes so arranjos bidimensionais homogneos e constituem as estruturas fundamena e tais do SCILAB e por isto existem vrias maneiras de manipul-las. Uma vez denidas, elas a a podem ser modicadas de vrias formas, como por insero, extrao e rearranjo. a ca ca Similarmente aos vetores, para construir uma matriz os elementos de uma mesma linha devem estar separados por branco ou v rgula e as linhas separadas por ponto-e-v rgula ou Enter (ou Return), <matriz> = [ e11 e12 ... e1n ; e21 e22 ... e2n ; ... ; em1 em2 ... emn ] Para criar uma matriz A com 2 linhas e 3 colunas,
-->A = [3 2 -5; 4 7 9] A = 3. 2. - 5. 4. 7. 9.
- 5. 9.
Se for atribu um valor a um elemento no existente, ou seja, alm dos elementos da do a e matriz ento o SCILAB aumenta esta matriz automaticamente preenchendo-a com valores a nulos de forma a matriz permanecer retangular,
-->A(3,6)=1 A = 3. 8. 4. 7. 0. 0.
- 5. 9. 0.
0. 0. 0.
0. 0. 0.
0. 0. 1.
16
-->B = [1 2 3; 4 5 6; 7 8 9] B = 1. 2. 3. 4. 5. 6. 7. 8. 9.
De modo similar aos arranjos, os elementos de uma matriz podem ser referenciados individualmente, tal como,
-->B(2,3) ans = 6.
ou em conjuntos, neste caso usando a notao de arranjo. Por exemplo, os elementos das ca linhas 1 e 3 e coluna 2,
-->B([1 3],2) ans = 2. 8.
A notao de vetor, <valor inicial>:<incremento>:<valor final>, tambm pode ser ca e usada ou at mesmo linspace. Lembrando que 3:-1:1 gera a seqncia 3, 2 e 1 e 1:3 e ue produz 1, 2 e 3, ento o comando, a
-->C = B(3:-1:1,1:3) C = 7. 8. 9. 4. 5. 6. 1. 2. 3.
cria uma matriz C a partir das linhas 3, 2 e 1 e colunas 1, 2 e 3 de B, ou seja, cria uma matriz C a partir das linhas de B em ordem contrria. a Considerando que so referenciadas todas as 3 colunas de B, a notao simplicada (:) pode a ca ser igualmente usada em vez de 1:3
-->C = B(3:-1:1,:) C = 7. 8. 9. 4. 5. 6. 1. 2. 3.
Para construir uma matriz E a partir da matriz B seguida da coluna 2 de C seguida ainda de uma coluna com os elementos iguais a 3,
2.4. Matrizes
17
3. 3. 3.
Para remover uma linha ou coluna de uma matriz usa-se a matriz vazia []. Para remover a coluna 3 de E,
-->E(:,3) E = 1. 4. 7. = [] 2. 5. 8. 8. 5. 2. 3. 3. 3.
5. 2.
3. 3.
Quando o s mbolo (:) for usado sozinho para referenciar os dois ndices de uma matriz ento a gerado um vetor constitu pelas colunas da matriz. Seja o vetor vet obtido das colunas e do da matriz E,
-->vet = E(:) vet = 4. 7. 5. 8. 5. 2. 3. 3. // vetor formado pelas colunas da matriz E
O s mbolo ($) utilizado para indicar o e ndice da ultima linha ou coluna da matriz,
-->E(1,$-1) ans = 5. // elemento da primeira linha e penultima coluna da matriz E
A funo size usada para fornecer o n mero de linhas e colunas de uma matriz. Ela pode ca e u ser usada de duas formas:
-->t = size(E) t = 2. 4.
onde a varivel t um vetor linha com duas posies, contendo o n mero de linhas e colunas a e co u de E, respectivamente. A outra forma e
18
-->[l,c] = size(E) c = 4. l = 2.
onde as variveis simples c e l contm o n mero de colunas e linhas de E, respectivamente. a e u Se a funo length for usada em uma matriz ela fornecer o n mero de elementos da matriz, ca a u
-->e = length(E) e = 8.
O SCILAB tem funes que se aplicam a vetores e a matrizes. Algumas destas funes so co co a mostradas na Tabela 2.3. Tabela 2.3: Exemplos de funes do SCILAB. co Funo ca sum prod max min sort mean stdev Descrio ca soma dos elementos; produto dos elementos; maior elemento; menor elemento; ordenao em ordem decrescente; ca mdia aritmtica; e e desvio padro. a
Se for acrescentado o argumento r ento a funo se aplica `s linhas da matriz. Se o a ca a argumento for c ento sero utilizadas as colunas da matriz. Se no for usado o argumento a a a extra ento a funo se aplica a todos elementos. Para a matriz A, a ca
-->A = [1 2 3;4 A = 1. 2. 4. 5. 7. 8. 5 6;7 8 9] 3. 6. 9.
Uso de sum,
-->sum(A,r) ans = 12. 15. -->sum(A,c) ans = 6. 15. 24. -->sum(A) ans = 45.
18.
2.4. Matrizes
19
Uso de prod,
-->prod(A,r) ans = 28. 80. -->prod(A,c) ans = 6. 120. 504. -->prod(A) ans = 362880.
162.
Uso de max,
-->max(A,r) ans = 7. 8. -->max(A,c) ans = 3. 6. 9. -->max(A) ans = 9.
9.
Uso de min,
-->min(A,r) ans = 1. 2. -->min(A,c) ans = 1. 4. 7. -->min(A) ans = 1.
3.
Uso de sort,
-->sort(A,r) ans = 7. 8. 4. 5. 1. 2. -->sort(A,c) ans = 3. 2.
9. 6. 3.
1.
20
6. 5. 9. 8. -->sort(A) ans = 9. 6. 8. 5. 7. 4.
4. 7.
3. 2. 1.
Uso de mean,
-->mean(A,r) ans = 4. 5. 6. -->mean(A,c) ans = 2. 5. 8. -->mean(A) ans = 5.
Uso de stdev,
-->stdev(A,r) ans = 3. 3. 3. -->stdev(A,c) ans = 1. 1. 1. -->stdev(A) ans = 2.7386128
O SCILAB possui tambm vrias funes para manipulaao de matrizes dentre as quais e a co c destacam-se aquelas mostradas na Tabela 2.4. Tabela 2.4: Algumas funes para operaes de matrizes. co co Funo ca diag Descrio ca se o argumento for uma matriz ento produz um vetor coluna cona tendo os elementos da diagonal; se o argumento for um vetor ento a cria uma matriz diagonal com os elementos do vetor; obtm a parte triangular inferior de uma matriz; e obtm a parte triangular superior de uma matriz; e altera a forma de uma matriz; cria uma matriz esparsa.
2.4. Matrizes
21
diag(A)
// cria matriz diagonal a partir de um vetor 0. 0. 9. // obtem a parte triangular inferior 0. 0. 9. // obtem a parte triangular superior 3. 6. 9.
A funo ca matrix(<matriz>,<linhas>,<coluna>) cria uma matriz com n mero de linhas dados por <linhas> e n mero de colunas igual a u u <colunas>, a partir de <matriz> com (<linhas> <colunas>) elementos selecionados no sentido das colunas. Por exemplo, para a matriz B de dimenso 2 3, a
-->B = [1 2 3;4 5 6] B = 1. 2. 3. 4. 5. 6. -->c = matrix(B,1,6) // matriz de dimensao 1 x 6 c = 1. 4. 2. 5. 3. 6. -->D = matrix(B,3,2) // matriz de dimensao 3 x 2 D = 1. 5. 4. 3. 2. 6.
A partir de <matriz> com alguns elementos nulos, a funo sparse(<matriz>) cria uma ca matriz esparsa armazenando somente os elementos no nulos. Para a matriz E, a
-->E = [2 0 -1; 0 5 6; 7 0 9] E = 2. 0. - 1. 0. 5. 6. 7. 0. 9. -->S = sparse(E) // cria matriz esparsa S =
22
( ( ( ( ( ( (
3, 1, 1, 2, 2, 3, 3,
3) sparse matrix 1) 2. 3) - 1. 2) 5. 3) 6. 1) 7. 3) 9.
Os tripletos acima indicam (linha, coluna, valor), ou seja, linha = 1, coluna = 1, valor = 2; linha = 1, coluna = 3, valor = 1 e assim sucessivamente. De forma alternativa, a partir de uma matriz <linha coluna> com duas colunas contendo os ndices dos elementos no nulos e do vetor <valor> com os valores desses elementos, o comando a sparse(<linha coluna>,<valor>) cria uma matriz esparsa,
-->mat = [1 1; 1 3; 2 2; 2 4; 3 3; 4 1; 5 5] // matriz de dimensao 7 x 2 mat = 1. 1. 1. 3. 2. 2. 2. 4. 3. 3. 4. 1. 5. 5. -->vet = [2 -1 5 4 3 8 -9] // vetor com 7 elementos vet = 2. - 1. 5. 4. 3. 8. - 9. -->F = sparse(mat,vet) // cria matriz esparsa F = ( 5, 5) sparse matrix ( 1, 1) 2. ( 1, 3) - 1. ( 2, 2) 5. ( 2, 4) 4. ( 3, 3) 3. ( 4, 1) 8. ( 5, 5) - 9.
O comando full(<esparsa>) converte a matriz <esparsa> para a sua representao cheia. ca Para a matriz F acima,
-->FF = full(F) FF = 2. 0. - 1. 0. 5. 0. 0. 0. 3. 8. 0. 0. 0. 0. 0.
0. 4. 0. 0. 0.
0. 0. 0. 0. - 9.
O SCILAB fornece vrias matrizes elementares de grande utilidade, como as mostradas na a Tabela 2.5. O n mero de parmetros providos fornecem as dimenses da matriz. u a o Por exemplo,
2.4. Matrizes
23
Tabela 2.5: Algumas matrizes elementares do SCILAB. Funo ca zeros ones eye rand Descrio da matriz ca nula; elementos iguais a 1; identidade ou parte dela; elementos aleatrios com dada distribuio. o ca
-->z = zeros(1,4) // matriz nula de dimensao 1 x 4 z = 0. 0. 0. 0. -->U = ones(2,3) // matriz de 1s de dimensao 2 x 3 U = 1. 1. 1. 1. 1. 1. -->I = eye(3,3) // matriz identidade de dimensao 3 x 3 I = 1. 0. 0. 0. 1. 0. 0. 0. 1.
A funo rand com ou sem o argumento extra uniform gera uma matriz com elementos ca aleatrios uniformemente distribu o dos entre 0 e 1. Se o argumento extra for normal ento a a matriz conter elementos aleatrios com distribuio normal com mdia 0 e varincia 1, a o ca e a
-->Ru = rand(2,4,uniform) matriz 2 x Ru = 0.2113249 0.0002211 0.6653811 0.7560439 0.3303271 0.6283918 -->Rn = rand(2,4,normal) // matriz 2 Rn = 0.7223316 0.6380837 0.2546697 1.9273333 - 0.8498895 - 1.5417209 4 aleatoria com distribuicao uniforme 0.8497452 0.6857310 x 4 aleatoria com distribuicao normal - 0.6834217 - 0.7209534
A funo rand produz n meros pseudo-aleatrios e a seqncia gerada determinada pelo ca u o ue e estado do gerador. Quando o SCILAB for ativado, atribu um valor inicial ao estado, e do o qual alterado a cada chamada da funo rand. Para atribuir um valor ao estado do e ca gerador quando esta funo j tiver sido executada usa-se os argumentos seed e n (valor ca a do estado). Por exemplo,
-->rand(seed,0) // atribui 0 ao estado -->a = rand(1,5,uniform) // gera uma sequencia aleatoria uniforme a = 0.2113249 0.7560439 0.0002211 0.3303271 0.6653811 -->rand(seed) // verifica o valor do estado ans = 1.429D+09 -->b = rand(1,5,uniform) // gera outra sequencia aleatoria uniforme b =
24
0.6283918 0.8497452 0.6857310 0.8782165 0.0683740 -->rand(seed,0) // atribui 0 ao estado -->c = rand(1,5,uniform) // gera uma sequencia igual a primeira c = 0.2113249 0.7560439 0.0002211 0.3303271 0.6653811
2.5
Hipermatrizes
Hipermatrizes so variveis homogneas com vrias dimenses. Elas podem ser criadas pelo a a e a o comando hypermat(<dim>,<val>), onde o vetor <dim> dene as dimenses da hipermatriz e o a matriz <val> dene os elementos. Por exemplo, para criar a hipermatriz H com dimenses o 2 3 4, ou seja, composta por 4 submatrizes de dimenses 2 3, faz-se o
-->mat1 = [1.1 1.2 1.3; 1.4 1.5 1.6] define submatriz 1 mat1 = 1.1 1.2 1.3 1.4 1.5 1.6 -->mat2 = [2.1 2.2 2.3; 2.4 2.5 2.6] // define submatriz 2 mat2 = 2.1 2.2 2.3 2.4 2.5 2.6 -->mat3 = [3.1 3.2 3.3; 3.4 3.5 3.6] // define submatriz 3 mat3 = 3.1 3.2 3.3 3.4 3.5 3.6 -->mat4 = [4.1 4.2 4.3; 4.4 4.5 4.6] // define submatriz 4 mat4 = 4.1 4.2 4.3 4.4 4.5 4.6 -->H = hypermat([2 3 4],[mat1 mat2 mat3 mat4]) // hipermatriz H de dimensao 2 x 3 x 4 H = (:,:,1) 1.1 1.2 1.3 1.4 1.5 1.6 (:,:,2) 2.1 2.2 2.3 2.4 2.5 2.6 (:,:,3) 3.1 3.2 3.3 3.4 3.5 3.6 (:,:,4) 4.1 4.2 4.3 4.4 4.5 4.6
As hipermatrizes podem ser manipuladas como as matrizes bidimensionais. Assim, para alterar para 12.3 os elementos da posio (2,1) das submatrizes 1 e 4 da hipermatriz H ca acima,
-->H(2,1,[1 4]) = 12.3 H =
2.6. Polinmios o
25
(:,:,1) 1.1 12.3 (:,:,2) 2.1 2.4 (:,:,3) 3.1 3.4 (:,:,4) 4.1 12.3
Outros comandos,
-->size(H) // dimensoes da hipermatriz ans = 2. 3. 4. -->sum(H(:,:,3),r) // soma das linhas da submatriz 3 ans = 6.5 6.7 6.9 -->min(H(:,:,2),c) // menores elementos das colunas da submatriz 2 ans = 2.1 2.4
2.6
Polinmios o
O SCILAB fornece vrias funes que permitem que as operaes envolvendo polinmios a co co o seja feita de um modo bem simples.
2.6.1
Construo ca
Os polinmios podem ser constru o dos ou a partir de seus coecientes ou de seus zeros. Construo a partir dos coecientes ca Um polinmio na forma P (x) = c1 + c2 x + c3 x2 + . . . + cn1 xn2 + cn xn1 pode ser conso tru a partir dos coecientes ci denidos no vetor <par^metros>, utilizando a funo do a ca poly(<par^metros>,<varivel>,<modo>), onde <varivel> uma cadeia de caracteres a a a e que determina a varivel do polinmio e a outra cadeia de caracteres <modo> especica como a o o polinmio ser constru o a do. Se <modo> = coeff ento ele ser constru a partir de a a do seus coecientes. Por exemplo, para construir o polinmio P (x) = 24 + 14x13x2 2x3 + x4 o basta,
-->P = poly([24 14 -13 -2 1],x,coeff) P = 2 3 4 24 + 14x - 13x - 2x + x // polinomio P(x) a partir dos coeficientes
26
Construo a partir das ra ca zes Usando a mesma funo poly, mas com <par^metros> contendo os zeros do polinmio e ca a o sendo <modo> = roots ou no sendo especicado ento ele ser constru a partir de a a a do seus zeros. Para um polinmio com zeros 1 = 1, 2 = 3, 3 = 2 e 4 = 4, faz-se o
-->R = poly([-1 -3 2 4],s,roots) R = 2 3 4 24 + 14s - 13s - 2s + s // polinomio R(s) a partir dos zeros
2.6.2
Avaliao ca
Um polinmio avaliado por meio da funo horner(<polin^mio>,<abscissas>), onde o e ca o <polin^mio> contm o polinmio e <abscissas> contm os pontos nos quais ele deve ser o e o e avaliado. Por exemplo, para avaliar T (x) = 1 3x + 7x2 + 5x3 2x4 + 3x5 nos pontos x = 1, 0, 1, 2 e 3,
-->T = poly([1 -3 7 5 -2 3],x,coeff) // constroi T(x) a partir dos coeficientes T = 2 3 4 5 1 - 3x + 7x + 5x - 2x + 3x -->y = horner(T,(-1:3)) // avalia T(x) em x = -1, 0, 1, 2 e 3 y = 1. 1. 11. 127. 757.
2.6.3
Adio e subtrao ca ca
Para somar e subtrair polinmios, mesmo de graus diferentes, basta usar os operadores de o adio (+) e substrao (-). Assim, para somar os polinmios a(x) = 1 4x2 + 5x3 + 8x4 e ca ca o 2 3 b(x) = 4 x + 5x + 2x ,
-->a = poly([1 0 -4 5 8],x,coeff) // constroi a(x) a = 2 3 4 1 - 4x + 5x + 8x -->b = poly([-4 -1 5 2],x,coeff) // constroi b(x) b = 2 3 - 4 - x + 5x + 2x -->c = a + b // soma polinomios c = 2 3 4 - 3 - x + x + 7x + 8x
2.6. Polinmios o
27
2.6.4
Multiplicao ca
A multiplicao de dois polinmios feita utilizando o operador de multiplicao (*). Sejam ca o e ca 2 os polinmios e(v) = 4 5v + 3v e f (v) = 1 + 2v, a multiplicao resulta em, o ca
-->e = poly([4 -5 3],v,coeff) // constroi e(v) e = 2 4 - 5v + 3v -->f = poly([-1 2],v,coeff) // constroi f(v) f = - 1 + 2v -->g = e * f g =
2 3 - 4 + 13v - 13v + 6v
2.6.5
Diviso a
O comando [<resto>,<quociente>] = pdiv(<polin^mio 1>,<polin^mio 2>) faz a dio o viso entre o <polin^mio 1> e o <polin^mio 2>, retornando o polinmio quociente em a o o o <quociente> e o polinmio do resto da diviso em <resto>, ou seja, <polin^mio 1> = o a o <polin^mio 2> * <quociente> + <resto>. Por exemplo, a diviso de h(x) = 6 5x + o a 4x2 3x3 + 2x4 por i(x) = 1 3x + x2 efetuada por, e
-->h = poly([6 -5 4 -3 2],x,coeff) h = // constroi h(x)
2 3 4 6 - 5x + 4x - 3x + 2x -->i = poly([1 -3 1],x,coeff) // constroi i(x) i = 2 1 - 3x + x -->[r,q] = pdiv(h,i) // divide h(x) por i(x) q = 2 11 + 3x + 2x r = - 5 + 25x
resultado no quociente q(x) = 11 + 3x + 2x2 com resto r(x) = 5 + 25x. No caso do uso do operador de diviso (/) em vez da funo pdiv, criado um polinmio racional. Para os a ca e o polinmios h(x) e i(x) denidos acima, o
-->j = h / i // polinomio racional obtido da divisao de h(x) por i(x)
28
= 2 3 4 6 - 5x + 4x - 3x + 2x --------------------2 1 - 3x + x
2.6.6
Derivao ca
A funo derivat efetua a derivao polinomial. Deste modo, para obter a primeira e ca ca segunda derivada de P (x) = 5 + 14x 12x2 + 2x3 + x4 ,
-->p = poly([-5 14 -12 2 1],x,coeff) // constroi p(x) p = 2 3 4 - 5 + 14x - 12x + 2x + x -->p1 = derivat(p) // derivada primeira de p(x) p1 = 2 3 14 - 24x + 6x + 4x -->p2 = derivat(p1) // derivada segunda de p(x) p2 = 2 - 24 + 12x + 12x
2.6.7
Clculo de ra a zes
A funo roots(<polin^mio>) calcula os zeros de <polin^mio>. Por exemplo, para calcular ca o o 2 3 4 as quatro ra de T (x) = 24 14x 13x + 2x + x = 0, zes
-->T = poly([24 -14 -13 2 1],x,coeff) // constroi T(x) T = 2 3 4 24 - 14x - 13x + 2x + x -->raizes = roots(T) // calcula as raizes de T(x) = 0 raizes = 1. - 2. 3. - 4.
Quando o polinmio for real e possuir grau menor ou igual a 100 a funo roots calcula o ca os zeros por um algoritmo rpido, caso contrrio, os zeros so calculados por meio dos a a a autovalores da matriz companheira. Se for acrescentado o segundo argumento da funo ca roots, dado por e, ento os zeros sero calculados utilizando os autovalores, independente a a do grau do polinmio. o
29
Pode ser mostrado que as ra zes de P (x) = c1 + c2 x + c3 x2 + . . . + cn1 xn2 + cn xn1 = 0 so os autovalores da matriz companheira, a cn1 /cn cn2 /cn . . . c2 /cn c1 /cn 1 0 ... 0 0 0 1 ... 0 0 C= . . . . . . . . . . . . . . . . 0 0 ... 1 0 Deste modo, r = roots(T,e) equivalente ` e a
-->A = companion(T) // matriz companheira do polinomio T(x) A = - 2. 13. 14. - 24. 1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1. 0. -->r = spec(A) // autovalores da matriz companheira A r = - 4. 3. - 2. 1.
2.7
Variveis lgicas a o
Conforme visto, uma constante lgica tem os valores %t (ou %T) para verdadeiro e %f (ou o %F) para falso, os quais podem ser atribu dos ` uma varivel lgica, com estrutura de vetor a a o ou matriz. Por exemplo,
-->a = %t // variavel logica simples a = T -->b = [%f %F %t %T] // vetor logico b = F F T T -->C = [%T %f %t;%f %T %F] // matriz logica C = T F T F T F
As variveis lgicas podem ser utilizadas para acessar os elementos de uma matriz (ou vetor). a o Quando o valor for verdadeiro o ndice acessado e no caso de ser falso o e ndice no ser a a acessado. Por exemplo,
-->v = [ 11 12 13 14 15 16 17 18 ] // define o vetor v com 8 elementos v = 11. 12. 13. 14. 15. 16. 17. 18. -->ind = [%t %t %f %t %f] // define vetor logico ind com 5 elementos
30
O n mero de elementos do vetor lgico deve ser menor ou igual ao n mero de elementos do u o u vetor que ele referencia. O uso de variveis lgicas fundamental nas expresses lgicas que a o e o o sero vistas na Seo 3.2. a ca
2.8
Variveis literais a
Uma varivel literal contm uma constante literal formada por uma cadeia de caracteres a e delimitada por aspas () ou apstrofos ("). Por exemplo, o
-->a = SCILAB, b = "cadeia de caracteres" a = SCILAB b = cadeia de caracteres
A utilizao de variveis literais ser abordada com mais detalhes na Seo 3.3. ca a a ca
2.9
Listas
Uma lista um conjunto de dados no necessariamente do mesmo tipo, podendo conter e a matrizes ou mesmo outras listas. As listas so uteis para denirem dados estruturados. a Uma lista constru a partir do comando list, e da
-->Rol = list(tipo,%f,[1 2 3; 4 5 6]) Rol = Rol(1) tipo Rol(2) F Rol(3) 1. 2. 3. 4. 5. 6. -->Rol(2) // objeto 2 de Rol ans = // gera a lista Rol com 3 objetos
31
F -->Rol(3)(2,1) ans = 4.
2.10
Exerc cios
Sees 2.1 e 2.2 co Observar atentamente e anotar o resultado dos comandos do SCILAB. Apesar de os comandos estarem separados por v rgula, entrar com um de cada vez. 2.1. Atribuir o valor 1,23103 ` varivel a e 4,17102 ` varivel b. a a a a 2.2. Conferir os nomes permitidos de variveis arco-seno=0, limite:sup=3, Area=3, a area=1.
32
2.3. Criar um vetor lgico com cinco elementos sendo o primeiro, segundo e quarto com o o valor verdadeiro e os outros com o valor falso. 2.4. Criar uma matriz de dimenso 2 3 com elementos lgicos, com a terceira coluna com a o elementos com o valor falso e as demais com o valor verdadeiro. 2.5. Atribuir a cadeia de caracteres abc ` varivel literal letras e 01234 ` varivel a a a a literal numeros. Seo 2.3 ca Construir os vetores e analisar as operaes: co 2.6. al = [1 3.5 -4.2 7.5], ac = (2:3:11). 2.7. b = 10:5:30, c = 5:-2:-6, d = 5:10. 2.8. e = linspace(0,10,5), e(3), e(2:4). 2.9. f = linspace(10,20,6), f(3:-1:1), f([6 5 1 3]). 2.10. g = linspace(2,11,4) + linspace(0.2,1.1,4)*%i , h = g, i = g. Seo 2.4 ca Construir as matrizes e vericar o resultado das operaes e funes co co 2.11. A = [6 -1 4; 0 2 -3; 5 7 8], A(2,1) = 1, sum(A,r), sum(A,c), prod(A,r), prod(A,c). 2.12. B = A(2:3,[2 3 1]), min(B,r), max(B,c). 2.13. C = [A B], C(:,[2 4])=[], C(2,:) 2.14. zeros(3,5), ones(2,4), eye(5,3). 2.15. D = rand(3,3,uniform), diag(diag(D)), triu(D), tril(D). = [], size(C).
Cap tulo 3
Expresses o
Uma expresso uma combinao de constantes, variveis e operadores, cuja avaliao a e ca a ca resulta em um valor unico. Neste cap tulo sero mostrados os trs tipos de expresses do a e o SCILAB: aritmticas, lgicas e literais. e o
3.1
Expresses aritmticas o e
Tabela 3.1: Operaes aritmticas bsicas do SCILAB. co e a Operao ca adio ca subtrao ca multiplicao ca diviso a potenciao ca Expresso a a+b ab ab ab ab Operador Exemplo + 1+2 5.1-4.7 * 6*9.98 / ou \ 6/7 5\3 ^ 2^10
expresses so avaliadas da esquerda para a direita, tendo a potenciao maior ordem de o a ca precedncia, seguida pela multiplicao e diviso (ambas tendo igual precedncia) e seguida e ca a e pela adio e subtrao (com igual precedncia). Os parnteses so usados para alterar a ca ca e e a b ordem de precedncia. Por exemplo, x = a expresso como x = a - b / c, enquanto e e c ab y = (a - b) / c. e que y = c 33
34
3.1.1
Expresses vetoriais o
As operaes bsicas entre vetores s so denidas quando estes tiverem o mesmo tamanho co a o a e orientao (linha ou coluna). Estas operaes bsicas so apresentadas na Tabela 3.2. ca co a a As operaes de multiplicao, diviso e potenciaao envolvendo vetores quando antecedico ca a c das pelo caracter (.) signica que estas operaes so efetuadas entre os correspondentes co a elementos dos vetores. Tabela 3.2: Operaes vetoriais bsicas. co a Sejam a = [ a1 a2 ...an ], b = [ b1 b2 ...bn ] e c um escalar Operao ca adio escalar ca adio vetorial ca multiplicao escalar ca multiplicao vetorial ca diviso ` direita a a diviso ` esquerda a a potenciao ca Expresso a a+c a+b a*c a.*b a./b a.\b a.^c c.^a a.^b Considere as variveis, a
-->a = 1:5, b = 10:10:50, c = 2 a = 1. 2. 3. 4. 5. b = 10. 20. 30. 40. 50. c = 2.
Resultado [ a1 +c a2 +c ... an +c ] [ a1 +b1 a2 +b2 ... an +bn ] [ a1 b1 a2 b2 ... an bn ] [ a1 /b1 a2 /b2 ... an /bn ] [ b1 /a1 b2 /a2 ... bn /an ] [ a1 ^c a2 ^c ... an ^c ] [ c^a1 c^a2 ... c^an ] [ a1 ^b1 a2 ^b2 ... an ^bn ] [ a1 c a2 c ... an c ]
Adio escalar, ca
-->a + c ans = 3.
4.
5.
6.
7.
Adio vetorial, ca
-->a + b ans = 11.
22.
33.
44.
55.
Multiplicao escalar, ca
35
-->a * c ans = 2.
4.
6.
8.
10.
40.
90.
160.
250.
0.1
0.1
0.1
0.1
10.
10.
10.
10.
Potenciao, ca
-->a .^ c ans = 1. 4. 9. -->c .^ a ans = 2. 4. 8. -->a .^ b ans = 1. 1048576.
16.
25.
16.
32.
2.059D+14
1.209D+24
8.882D+34
3.1.2
Expresses matriciais o
De modo similar `s operaes vetorias, existem as operaes matriciais bsicas, as quais esto a co co a a compiladas na Tabela 3.3. O operador (\) envolvendo matrizes e vetores est relacionado a com soluo de sistemas lineares, conforme ser visto na Seo 7.2.3. ca a ca Sejam as matrizes A e B de ordem 3 e o escalar c,
-->A = [1 A = 1. 4. 7. B = 10. 40. 70. c = 3. 2 3; 4 5 6; 7 8 9], B = [10 20 30; 40 50 60; 70 80 90], c = 3 2. 5. 8. 20. 50. 80. 3. 6. 9. 30. 60. 90.
36
Tabela 3.3: Operaes matriciais bsicas. co a Sejam c um escalar e A = [ a11 a12 ... a1p ; a21 a22 ... a2p ; ... ; am1 am2 ... amp ] B = [ b11 b12 ... b1n ; b21 b22 ... b2n ; ... ; bp1 bp2 ... bpn ] Operao ca adio escalar ca adio matricial ca multiplicao escalar ca multiplicao matricial ca multiplicao entre elementos correspondentes ca diviso ` direita entre elementos correspondentes a a diviso ` esquerda entre elementos correspondentes a a potenciao ca Expresso a A+c A+B A*c A*B A.*B A./B A.\B A^c A.^c c.^A A.^B Resultado aij + c aij + bij aij c AB aij bij aij /bij Ac ac ij caij
ij aij
bij /aij
Adio escalar, ca
-->A + c ans = 4. 7. 10.
5. 8. 11.
6. 9. 12.
Adio matricial, ca
-->A + B ans = 11. 44. 77.
Multiplicao escalar, ca
-->A * c ans = 3. 12. 21.
6. 15. 24.
9. 18. 27.
A diferena no resultado das expresses quando os operadores contm o caracter (.) deve c o e ser observada. Na multiplicao matricial, ca
37
38
E importante observar que no SCILAB as operaes c.^A e c^A so equivalentes. Como pode co a ser esperado de uma linguagem para aplicaes nas reas tcnicas e cient co a e cas, o SCILAB oferece vrias funes importantes. A Tabela 3.4 apresenta algumas funes matemticas a co co a elementares do SCILAB. Se a varivel for um vetor ou uma matriz a avaliao de uma funo se d para cada elemento a ca ca a da varivel, a
-->a = 1:5 a = 1. 2. 3. 4. 5. -->b = sqrt(a) // raiz quadrada b = 1. 1.4142136 1.7320508
2.
2.236068
Os resultados acima podem ser apresentados na forma de uma tabela por intermdio do e comando
-->[a;b] ans = 1. 1.
Tabela 3.4: Funes matemticas elementares do SCILAB. co a Funo ca acos asin atan cos acosh asinh atanh cosh coth exp abs conj ceil fix floor gcd Descrio ca arco co-seno arco seno arco tangente co-seno Funo ca trigonomtricas e cotg sin tan Descrio ca co-tangente seno tangente logaritmo natural logaritmo decimal seno hiperblico o raiz quadrada tangente hiperblica o parte imaginria do complexo a parte real do complexo m nimo m ltiplo comum u resto de diviso a arredonda em direo ao inca teiro mais prximo o sinal
exponenciais arco co-seno hiperblico o log arco seno hiperblico o log10 arco tangente hiperblica o sinh co-seno hiperblico o sqrt co-tangente hiperblica o tanh exponencial complexas valor absoluto imag complexo conjugado real numricas e arredonda em direo a + ca lcm arredonda em direo a 0 ca modulo arredonda em direo a ca round mximo divisor comum a sign
39
2. 3. 4. 5.
3.2
Expresses lgicas o o
Uma expresso se diz lgica quando os operadores forem lgicos e os operandos forem relaes a o o co e/ou variveis do tipo lgico. Uma relao uma comparao realizada entre valores do a o ca e ca mesmo tipo. A natureza da comparao indicada por um operador relacional conforme a ca e Tabela 3.5. Tabela 3.5: Operadores relacionais do SCILAB. Operador relacional == > >= < <= ~= ou <> Descrio ca igual a maior que maior ou igual a menor que menor ou igual a diferente de
O resultado de uma relao ou de uma expresso lgica verdadeiro ou falso. No SCILAB ca a o e o resultado literal, sendo que T signica verdadeiro e F signica falso. Note que o caracter e (=) usado para atribuio de um valor ` uma varivel enquanto que os caracteres (==) so e ca a a a usados para comparao de igualdade. Os operadores relacionais so usados para comparar ca a vetores ou matrizes do mesmo tamanho ou comparar um escalar com os elementos de um vetor ou de matriz. Sejam os vetores a e b e o escalar c,
-->a = 1:10, b = 9:-1:0, c = 5 a = 1. 2. 3. 4. 5. b = 9. 8. 7. 6. 5. c = 5.
6. 4.
7. 3.
8. 2.
9. 1.
10. 0.
Assim,
-->d = a >= c d = F F F F T T T T T T
produz um vetor que contm o valor T (verdadeiro) quando o elemento correspondente do e vetor a for maior ou igual a 5, caso contrrio contm o valor F (falso). Apesar de o resultado a e da relao lgica ser um valor literal, ele pode fazer parte de uma expresso aritmtica, ca o a e sendo que F vale 0 e T tem o valor 1,
40
-->e = a + (b <= 3) e = 1. 2. 3.
4.
5.
6.
8.
9.
10.
11.
Quando um elemento de b for menor ou igual a 3, o valor 1 (resultado da relao lgica) ca o e adicionado ao correspondente valor de a. Os operadores lgicos permitem a combinao ou o ca negao das relaes lgicas. Os operadores lgicos do SCILAB so listados na Tabela 3.6. ca co o o a Tabela 3.6: Operadores lgicos do SCILAB. o Operador lgico Descrio o ca & e | ou ~ no a Para os vetores a e b denidos anteriormente,
-->f = (a>3) & (a<=8) f = F F F T T T T T F F
Os elementos de f so iguais a T quando os correspondentes elementos de a forem maiores a do que 3 e menores ou iguais a 8, caso contrrio so iguais a F. Para fazer a negao, ou a a ca seja, onde for T ser F e vice-versa basta, a
-->g = ~f g = T T T F F F F F T T
A Tabela 3.7 apresenta a tabela verdade para os operadores lgicos do SCILAB. o Tabela 3.7: Tabela verdade. a T T F F b T F T F a & b T F F F a | b ~a T F T F T T F T
A ordem de precedncia no SCILAB para expresses envolvendo operadores aritmticos e e o e lgicos so indicados na Tabela 3.8. o a Os parnteses podem ser usados para alterar a ordem de precedncia. Para os vetores a e b e e denidos acima, a avaliao da expresso, ca a
-->h = -(a-5).^2 > -9 & 3*b <= 15 h = F F F F T T T F F F
41
Tabela 3.8: Ordem de precedncia das operaes aritmticas e lgicas. e co e o Ordem de precedncia e 1a 2a 3a 4a 5a ^ * + > | Operadores .^ . / \ .* ./ .\ - ~ +(unrio) -(unrio) a a >= < <= == ~= &
2.
3.
4.
5.
4.
9.
16.
25.
12.
9.
6.
3.
0.
- 4.
- 9.
- 16.
- 25.
3.3
Expresses literais o
O SCILAB dispe de vrias funes para manipulao de cadeia de caracteres, sendo algumas o a co ca delas mostradas a seguir.
3.3.1
Converso de caracteres a
Sero apresentadas funes para alterar o tamanho da caixa das letras e fazer a converso a co a de caracteres para n mero e vice-versa. u Caixas altas e baixas A funo convstr(<texto>,<tipo>) converte a cadeia de caracteres <texto> de acordo ca com o <tipo>. Se ele for u ento converte para caixa alta (mai sculo) e se for l ou a u omitido converte para caixa baixa (min sculo), u
42
-->texto = Caixas Altas e Baixas // define o texto texto = Caixas Altas e Baixas -->convstr(texto,u) // converte para caixa alta ans = CAIXAS ALTAS E BAIXAS -->convstr(texto) // converte para caixa baixa ans = caixas altas e baixas
Cdigo ASCII o Os comandos <nmero> = ascii(<texto>) e <texto> = ascii(<nmero>) fazem a conu u verso dos caracteres ASCII (American Standard Code for Information Interchange) contia dos no vetor de caracteres <texto> para valores numricos e atribuem ao vetor <nmero> e e u vice-versa, de acordo com a Tabela 3.9. Tabela 3.9: Caracteres em cdigo ASCII. o Representao decimal dos caracteres ca 33 ! 34 " 35 # 36 $ 37 % 38 & 39 40 ( 41 ) 42 * 43 + 44 , 45 46 . 47 / 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z 91 [ 92 \ 93 94 95 96 97 98 99 ] ^ _ a b c 105 i 106 j 107 k 108 l 109 m 110 n 111 o 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w 120 x 121 y 122 z 123 { 124 | 125 } 126 ~
// converte caracteres para numeros 51. 42. 105. // converte numeros para caracteres
43
Tabela 3.10: Caracteres em cdigo ASCII estendido do SCILAB. o Representao decimal dos caracteres ca 192 ` A 193 A A 194 ^ 195 ~ A 196 A A 197 198 199 C 200 ` E 201 E E 202 ^ 203 E 204 ` I I 205 206 ^ I 207 I 208 209 210 211 212 213 214 D ~ N ` O O ^ O ~ O O 216 217 ` U U 218 219 ^ U 220 U Y 221 222 223 224 ` a 225 a 226 ^ a 227 ~ a 228 a 229 a 230 231 c 232 ` e 233 e 234 ^ e 235 e 236 ` 237 238 ^ 239 240 241 242 243 244 245 246
~ n ` o o ^ o ~ o o
215
247
Este comando particularmente util para escrever textos em portugus (ver Tabela 3.10). e e
-->m = [ 70 117 110 231 227 111 ] m = 70. 117. 110. 231. -->c = ascii(m) c = Fun~o ca
227.
111.
Cdigo do SCILAB o Os comandos <texto> = code2str(<nmero>) e <nmero> = str2code(<texto>) fazem a u u converso de um vetor numrico <nmero> para a cadeia de caracteres <texto> e vice-versa, a e u segundo o cdigo do SCILAB, o
-->texto = Caracteres // define o texto texto = Caracteres -->numero = str2code(texto) // converte texto para numero (vetor transposto) numero = - 12. 10. 27. 10. 12. 29. 14. 27. 14. 28. -->palavra = code2str(numero) // converte numero para texto palavra = Caracteres
E importante observar que os cdigos de converso produzidos pelas funes code2str e o a co str2code so diferentes daqueles produzidos pela funo ascii, a ca
44
-->car = 01AZaz // define caracteres car = 01AZaz -->cod = str2code(car) // converte para codigo do SCILAB (vetor transposto) cod = 0. 1. - 10. - 35. 10. 35. -->asc = ascii(car) // converte para codigo ASCII asc = 48. 49. 65. 90. 97. 122.
Nmeros u O comando <texto> = string(<nmero>) converte a constante numrica <nmero> para u e u a sua representao em caracteres e atribui o resultado a <texto>. Este comando de ca e grande utilidade quando da escrita de rtulos e t o tulos em grcos, conforme ser visto no a a Cap tulo 6,
-->v = 4.25 v = 4.25 -->titulo = velocidade = + string(v) + m/s titulo = velocidade = 4.25 m/s
3.3.2
Manipulao de caracteres ca
Sero descritas, a seguir, funes para obter o tamanho, criar, operar e procurar caracteres. a co Tamanho A funo length(<varivel>) fornece o n mero de caracteres presentes na cadeia de caca a u racteres <varivel>; se ela for uma matriz ento informado o n mero de caracteres de a a e u cada elemento,
-->length(abcde) // numero de caracteres ans = 5. -->length([ab 123; * abcd]) // numero de caracteres de matriz ans = 2. 3. 1. 4.
Criao ca O comando <varivel> = emptystr(<linhas>,<colunas>) gera uma matriz de caractea res <varivel> vazia de dimenso <linhas> <colunas>. Por sua vez, <varivel> = a a a emptystr(<matriz>) cria a matriz de caracteres <varivel> vazia com as mesmas dia menses de <matriz>, o
45
-->mat = emptystr(2,3) // matriz vazia de dimensao 2 x 3 mat = ! ! ! ! ! ! -->length(mat) // numero de caracteres de mat ans = 0. 0. 0. 0. 0. 0. -->matnum = [ 1 2; 3 4] // define matriz numerica matnum = 1. 2. 3. 4. -->S = emptystr(matnum) // matriz vazia com mesma dimensao de matnum S = ! ! ! ! ! ! -->length(S) // numero de caracteres de S ans = 0. 0. 0. 0.
A funo strcat(<vetor>,<caracteres>) insere a cadeia <caracteres> entre cada eleca mento da cadeia de caracteres <vetor>,
-->vet = [a b c d e] // define vetor de caracteres vet = !a b c d e ! -->vv = strcat(vet,,) // insere , entre cada elemento vv = a,b,c,d,e -->ve = strcat(vet, >= ) // insere >= entre cada elemento ve = a >= b >= c >= d >= e
Operao ca O comando <matriz pos> = justify(<matriz>,<posi~o>) cria <matriz pos>, uma maca triz de caracteres, alterando a posio das colunas da matriz de caracteres <matriz> de ca acordo com <posi~o>. Se for igual a l as colunas sero movidas para a esquerda, se for ca a c elas sero centradas e se <posi~o> = r as colunas sero movidas para a direita, a ca a
-->M = [abcdefg h ijklmnopq; 1 1234567 7890; abc 01 def] // matriz M = !abcdefg h ijklmnopq ! ! ! !1 1234567 7890 ! ! ! !abc 01 def ! -->C = justify(M,c) // cria matriz C a partir de M com colunas centradas
46
C = !abcdefg ! ! 1 ! ! abc
h 1234567 01
! ! ! ! !
A funo stripblanks(<texto>) elimina os caracteres brancos do in e do nal da cadeia ca cio de caracteres <texto>,
-->v = a b c // vetor v com 3 caracteres brancos no inicio e no final v = a b c -->length(v) // numero de caracteres de v ans = 11. -->s = stripblanks(v) // remove caracteres brancos do inicio e do final de v s = a b c -->length(s) // numero de caracteres de s ans = 5.
A funo strsplit(<texto>,<ndice>) quebra a cadeia de caracteres <texto> nas posies ca co dadas no vetor numrico <ndice> gerando um vetor de caracteres, e
-->s = 1234567890abcdefgh s = 1234567890abcdefgh -->v = strsplit(s,[3 8 12]) v = !123 ! ! ! !45678 ! ! ! !90ab ! ! ! !cdefgh ! // define vetor de caracteres
A funo strsubst(<matriz>,<texto 1>,<texto 2>) substitui todas as ocorrncias da caca e deia de caracteres <texto 1> na matriz de caracteres <matriz> pelos caracteres contidos em <texto 2>,
-->frase = determinante = produto dos autovalores // define o texto frase = determinante = produto dos autovalores -->strsubst(frase,e,E) // substitui as letras e por E ans = dEtErminantE = produto dos autovalorEs -->strsubst(frase, = , e igual ao ) // substitui simbolo por texto ans = determinante e igual ao produto dos autovalores -->strsubst(frase, ,) // remove todos os caracteres brancos ans = determinante=produtodosautovalores
47
Procura Seja o comando [<linhas>,<qual>] = grep(<vetor>,<texto>). Para cada entrada do <vetor> de caracteres, a funo grep pesquisa se pelo menos uma cadeia de caracteres no ca vetor <texto> igual a uma subcadeia de <vetor>. O vetor numrico <linhas> informa e e os ndices das entradas de <vetor> onde, pelo menos, uma igualdade foi encontrada. O argumento opcional <qual> fornece ndices informando qual das cadeias de caracteres de <texto> foi a primeira a ser encontrada. Por exemplo,
-->vetor = [o scilab e um software livre; --> para aplicacoes cientificas; --> ver www.scilab.org] // define o vetor de caracteres vetor = !o scilab e um software livre ! ! ! !para aplicacoes cientificas ! ! ! !ver www.scilab.org ! -->[linha,qual] = grep(vetor,[ver,scilab]) // procura por ver e scilab qual = 2. 1. linha = 1. 3.
Os caracteres ver e scilab foram encontrados nas linhas 1 e 3, sendo que na linha 1 o primeiro a ser encontrado tem o ndice 2 (scilab) e na linha 3 foi o de ndice 1 (ver). Considere o comando [<ndices>,<qual>] = strindex(<texto>,<vetor i>). A funo ca strindex procura os ndices de onde o i-simo elemento do vetor de caracteres <vetor i> foi e encontrado na cadeia de caracteres <texto>. Estes ndices so retornados no vetor numrico a e <ndices>. O argumento opcional <qual> fornece ndices informando qual das cadeias de caracteres de <vetor i> foram encontradas. Por exemplo,
-->ind = strindex(abcd dabc,a) // procura os indices de ocorrencia de a ind = 1. 7. -->ind = strindex(baad daaa,aa) // indices de ocorrencia de aa ind = 2. 7. 8. -->[ind,qual] = strindex(baad daaa bdac,[aa da]) qual = 1. 2. 1. 1. 2. ind = 2. 6. 7. 8. 12.
Os caracteres aa e da foram encontrados nas posies 2, 6, 7, 8, e 12 e os elementos que co apareceram foram, respectivamente, 1 (aa), 2 (da), 1 (aa), 1 (aa) e 2 (da). O comando <elementos> = tokens(<texto>,<delimitador>) cria um vetor coluna de caracteres <elementos> particionando a cadeia de caracteres <texto> onde ocorrer a presena c
48
de um dos componentes do vetor <delimitador>. Cada componente do segundo argumento formado por um unico caracter. Se este argumento for omitido ento assumido o vetor e a e [ ,<Tab>] (caracteres branco e ascii(9)). Por exemplo,
-->tokens(Exemplo de cadeia de caracteres) // particiona com delimitador ans = !Exemplo ! ! ! !de ! ! ! !cadeia ! ! ! !de ! ! ! !caracteres ! -->tokens(Exemplo de cadeia de caracteres,c) // delimitador c ans = !Exemplo de ! ! ! !adeia de ! ! ! !ara ! ! ! !teres ! -->tokens(Exemplo de cadeia de caracteres,[d t]) ans = !Exemplo ! ! ! !e ca ! ! ! !eia ! ! ! !e carac ! ! ! !eres !
// delimitadores d e t
Seja o comando <matriz> = tokenpos(<texto>,<delimitador>). A funo tokenpos ca particiona a cadeia de caracteres <texto> onde ocorrer a presena de um dos componentes c do vetor <delimitador>. Os ndices inicial e nal de cada elemento resultante da partio ca so atribu a dos ` matriz numrica de duas colunas <matriz>. Cada componente do segundo a e argumento formado por um unico caracter. Se este argumento for omitido ento assumido e a e o vetor [ ,<Tab>] (caracteres branco e ascii(9)). Por exemplo,
-->tokenpos(Exemplo de cadeia de caracteres) ans = 1. 7. 9. 10. 12. 17. 19. 20. // particiona com delimitador
49
22. 31. -->tokenpos(Exemplo de cadeia de caracteres,[d t]) ans = 1. 8. 10. 13. 15. 18. 20. 26. 28. 31.
// delimitadores d e t
Seja o comando <elementos> = part(<texto>,<ndices>), onde <elementos> e <texto> so matrizes de caracteres e <ndices> um vetor numrico de a e e ndices. A funo part obtm ca e <elementos> a partir dos elementos de <texto> nas posies especicadas em <ndice>. co Por exemplo,
-->c = part([123,4567,890],[1,3]) c = !13 46 80 ! // obtencao usando indices 1 e 3
Se um elemento de <ndice> for maior que o comprimento de um componente de <texto> ento <elementos> receber um caractere branco, a a
-->vet = part([a,bcd,efghi],[1,2,4,1]) vet = !a a bc b efhe ! // obtencao usando indices 1, 2, 4 e 1
O comprimento do primeiro componente a 1 que menor que 2 e 4, portanto, o primeiro e e componente de vet recebe dois caracteres brancos nas posies 2 e 3. O segundo componente co bcd tem comprimento 3 que menor que 4 por isso recebe um branco na posio 3. e ca
3.4
Execuo de expresses ca o
O SCILAB possui comandos com o propsito de executar expresses, um dos quais o eval, o o e cuja sintaxe e <resultado> = eval(<express~o>) a A cadeia de caracteres <express~o> contm a expresso matemtica que deve ser interprea e a a tada e atribu ` varivel <resultado>. Por exemplo, da a a
-->r = eval(sin(%pi/2)) r = 1. -->x = 1; y = 2; eval(2*x+exp(y-2)) ans = 3.
Note que para avaliar uma expresso que possui as variveis x e y, estas tm que ser previa a e amente denidas. A funo eval tambm capaz de executar tarefas mais complexas, ca e e
50
-->Tabela = [sqrt(x); exp(x);1/x+5*x^2] // define uma matriz com 3 expressoes Tabela = !sqrt(x) ! ! ! !exp(x) ! ! ! !1/x+5*x^2 ! -->x = 16; eval(Tabela(1,:)) // avalia a expressao da linha 1 com x = 16 ans = 4. -->x = 2; eval(Tabela(3,:)) // avalia a expressao da linha 3 com x = 2 ans = 20.5
A funo evstr(<express~o>) converte a representao do valor numrico da cadeia de ca a ca e caracteres <express~o> escrita em cdigo ASCII para a representao numrica. O argua o ca e mento <express~o> deve estar escrito de acordo com as regras de denio de constantes a ca numricas vistas na Seo 2.1, e ca
-->x = evstr(1.23d2+5.678e-1*%i) x = 123. + 0.5678i
com este valor numrico poss e e vel, por exemplo, calcular a raiz quadrada,
-->y = sqrt(x) y = 11.090566 + 0.0255983i
3.5
Exerc cios
Observar atentamente e anotar o resultado dos comandos do SCILAB. Apesar de os comandos estarem separados por v rgula, entrar com um de cada vez. Seo 3.1 ca 3.1. Avaliar as expresses escalares o 5+3, 4-1, 6*3, 10/2, 2\ 5, 3^2, 1+2*3-4/5, 6*2^3. 3.2. Sejam a = 1, b = 2, c = 3, d = 4, e = 5. Avaliar x=
3
b2 c + y =a d+e z = log10 b d + e2
c2 b+a 1 + b2 . + b a 1 + b3
51
Avaliar as expresses vetoriais para u = 2:6, v = linspace(10,14,5), k = 5, o 3.3. u-k, u+v, u*k, u.*v, u./v, u.\v. 3.4. u.^k, k.^u, v.^u. 3.5. w = sqrt(u+v) - cos(u-k*v). Avaliar as expresses matriciais para o M = [2 -3 1; 4 6 -1; -5 2 1], N = [1 1 2; 3 1 -1; 3 2 1], x = (1:3), z = 2. 3.6. M-z, M+N, M*z. 3.7. M.*N, M*N, M*x, M./N, M.\N. 3.8. M.^z, M^z, z.^M, z^M, M.^N. 3.9. Vericar a diferena entre as funes usando a = e a = 5,6, c co ceil(a), fix(a), floor(a), round(a), sign(a). 3.10. Para c = 3 + 4i e c = 5 3i, observar os resultados das funes complexas, co abs(c), conj(c), real(c), imag(c). Seo 3.2 ca 3.11. Com relao `s variveis lgicas, dados a = %t, b = %f, c = sqrt(2) > 1, d = ca a a o exp(0) == 0, completar a tabela a b c d a&b a&c b&d a|b a|c b|d ~a ~b
Avaliar as expresses lgicas para x = -2:2 e v = 1:5, o o 3.12. x > -1. 3.13. abs(x) == 1. 3.14. x <= -1 & v > 1. 3.15. x > 1 | abs(v-3) < 1.
52
Seo 3.3 ca 3.16. Denir os comandos para gerar as cadeias de caracteres Ttulo, varivel e equa~es. a co 3.17. Dada a cadeia de caracteres [1 2 3 4], inserir menor que entre eles. 3.18. Quebrar a cadeia de caracteres 123456789012345 nas posies 5 e 10. co 3.19. Dado abcde edabc eacdb, substituir toda ocorrncia do caracter d pelo caracter e X. 3.20. Dada a seqncia de caracteres abcdeedabceacdbdbcae determinar os ue ndices de onde ocorre bc. Seo 3.4 ca 3.21. Avaliar o resultado da expresso dada pela cadeia de caracteres sqrt(4)+cos(%pi). a Para x = 1:5 e y = 3, avaliar as expresses abaixo, o 3.22. exp(x-y). 3.23. modulo(x,y) .* sinh(x*y/10). 3.24. Converter para n mero as cadeias de caracteres 12.3d-1 e 0.0456789e2. u 3.25. Qual a diferena entre as funes evstr e string? c co
Cap tulo 4
Comandos de entrada e sa da
O SCILAB fornece algumas facilidades para especicar o formato de sa dos resultados, da gravao e leitura das variveis de uma sesso de trabalho e de arquivos. ca a a
4.1
Formato de exibio ca
Para saber o valor de uma varivel basta entrar com o seu nome. O resultado exibido a e usando um formato pr-denido, e
-->%pi %pi = 3.1415927
O comando disp(<varivel>) usado para exibir o conte do de <varivel> sem mostrar a e u a o seu nome ou para exibir uma cadeia de caracteres contida na <varivel>. a
-->disp(numeros aleatorios entre 0 e 1), disp(rand(2,6,uniform)) numeros aleatorios entre 0 e 1 0.2113249 0.0002211 0.6653811 0.8497452 0.8782165 0.5608486 0.7560439 0.3303271 0.6283918 0.6857310 0.0683740 0.6623569
Ao exibir um resultado numrico o SCILAB segue diversas regras. Se o resultado for um e n mero real (ponto utuante), ele mostrado com dez caracteres, incluindo o ponto decimal u e e o sinal. Quando o sinal for positivo exibido um caracter branco em seu lugar. Se os e d gitos signicativos do resultado estiverem fora desta faixa ento o resultado ser exibido a a em notao cient ca ca,
-->disp([%e*1e-5 %e*1e5 %e*1e-10 %e*1e10]) 0.0000272 271828.18 2.718D-10 2.718D+10
A funo format(<tipo>,<dgitos>) usada para alterar o formato numrico de exibio, ca e e ca onde <tipo> um dos caracteres v ou e para indicar formato varivel ou em notao e a ca 53
54
cient ca, respectivamente. O parmetro <dgitos> indica o n mero mximo de caracteres a a u a serem exibidos, incluindo sinal, ponto decimal e no caso de formato e os quatro caracteres referentes ` potncia de 10. Caso esse parmetro no seja fornecido assumido o valor 10. a e a a e Uma vez denido o formato de exibio ele mantido at que seja modicado por um outro ca e e comando format,
-->format(v,8), %pi // pi com formato variavel com 8 caracteres ans = 3.14159 -->format(v,12), %pi // pi com formato variavel com 12 caracteres ans = 3.141592654 -->format(e,8), %eps // eps em notacao cientifica com 8 caracteres ans = 2.2D-16 -->format(e,12), %eps // eps em notacao cientifica com 12 caracteres ans = 2.22045D-16 -->sqrt(%eps) // verificar que o ultimo formato e mantido ans = 1.49012D-08
A funo mprintf exibe dados formatados pertencentes ao espao de trabalho na tela princa c cipal do SCILAB. Sua sintaxe e mprintf(<formato>,<variveis>) a onde a cadeia de caracteres <formato> contm caracteres alfanumricos e/ou especicaes e e co de converso para exibir na tela a lista <variveis>. Estas especicaes de converso so a a co a a delimitadas pelo caracter % e uma das letras i, e, f, g ou s, de acordo com a Tabela 4.1. Tabela 4.1: Formatos de exibio. ca Formato Especicao ca %ni usado para valores inteiros, sendo n o tamanho do campo de exibio; ca %n.df notao na forma []888.888, sendo n o tamanho do campo (n mero ca u total de caracteres exibidos) e d o n mero de d u gitos decimais; %n.de notao na forma []8.888 88, sendo n o tamanho do campo (n mero ca u total de caracteres exibidos) e d o n mero de d u gitos decimais; %n.dg equivalente a %n.de ou %n.df, dependendo de qual formato for mais curto, alm disso os zeros insignicantes no so exibidos; e a a %ns exibe caracteres em um campo de tamanho n.
Deste modo,
-->mprintf(a precisao deste computador =%12.5e\n,%eps/2) a precisao deste computador = 1.11022e-16
55
onde \n usado para comear uma nova linha. Quando for necessrio ter o caracter () e c a exibido basta us-lo duas vezes, a
-->mprintf(o valor de pi e aproximadamente%13.10f\n,%pi) o valor de pi e aproximadamente 3.1415926536
4.2
Espao de trabalho c
Durante uma sesso as variveis utilizadas residem no espao de trabalho do SCILAB e a a c podem ser armazenadas em um arquivo quando desejado. Conforme visto, o comando who lista o nome das variveis que esto sendo usadas, ou seja, que esto presentes no espao a a a c de trabalho. Por sua vez, o comando whos fornece informaes mais detalhadas sobre essas co variveis. Estes dois comandos listam as variveis criadas pelo usurio e as denidas pelo a a a prprio SCILAB. Por exemplo, no in de uma sesso, quando o usurio criou apenas as o cio a a variveis a, b, C e d, tem-se, a
-->a = 2.5, b = [1.2 3.2 a = 2.5 b = 1.2 3.2 - 5.4 C = 2.1 3.4 6.1 - 9.3 d = caracteres -->whos Name whos d C b -5.4], C = [2.1 3.4; 6.1 -9.3], d = caracteres
Size 1 by 1 2 by 2 1 by 3
Bytes 8512 64 48 40
56
a constant 1 by 1 scicos_pal string 14 by 2 . . algumas variaveis foram removidas da lista . %t boolean 1 by 1 %f boolean 1 by 1 %eps constant 1 by 1 %io constant 1 by 2 %i constant 1 by 1 %e constant 1 by 1 %pi constant 1 by 1
24 2352
24 24 24 32 32 24 24
As variveis no espao de trabalho criadas pelo usurio podem ser removidas, incondicioa c a nalmente, usando o comando clear --> clear tempo raiz --> clear remove as variveis tempo e raiz, a remove todas as variveis do espao de trabalho. a c Ateno: no ser solicitada a conrmao. Todas ca a a ca as variveis estaro, irremediavelmente, removidas. a a
4.2.1
Gravar dados
O comando save usado para gravar as variveis do espao de trabalho em um arquivo. e a c Sua sintaxe e save(<nome do arquivo>,<variveis>) a e onde <nome do arquivo> uma cadeia de caracteres que especica o nome do arquivo binrio onde variveis do espao de trabalho sero gravadas e <variveis> uma lista a a c a a e de nomes que dene quais as variveis do espao de trabalho criadas pelo usurio sero a c a a gravadas no arquivo <nome do arquivo>. As variveis devem estar separadas por v a rgula. Se os nomes <variveis> no forem especicados, ento todas as variveis do espaco de a a a a c trabalho criadas pelo usurio sero salvas. Por exemplo, considerando as variveis a, b, C e a a a d criadas acima,
-->save(quatro.dat) // salva as quatro variaveis no arquivo quatro.dat -->save(duas.dat,b,d) // salva as variaveis b e d no arquivo duas.dat
4.2.2
Recuperar dados
O comando load usado para recuperar os dados gravados em um arquivo pelo comando e save e coloc-los de volta no espao de trabalho. Sua sintaxe a c e load(<nome do arquivo>,<variveis>) a a a onde <nome do arquivo> e <variveis> so os mesmos denidos para o comando save. Se o arquivo contiver uma varivel com o mesmo nome de uma j existente no espao de a a c trabalho ento o comando load faz com que a varivel do espao de trabalho seja substitu a a c da pela varivel existente no arquivo, a
57
-->clear // remove todas as variaveis do espaco de trabalho -->d = novos // atribui novo valor a variavel d d = novos -->load(duas.dat,b,d) // recupera as variaveis b e d do arquivo duas.dat -->d // verifica o valor de d ans = caracteres
4.2.3
Entrada de dados
<varivel> = input(<mensagem>,string) a
A leitura de dados pelo teclado feita pelo comando input, cuja sintaxe e e
O comando acima exibe a cadeia de caracteres <mensagem> e espera at que o usurio fornea e a c o valor de <varivel> pelo teclado. O segundo argumento string ou simplesmente s a opcional e informa que <varivel> uma cadeia de caracteres, e a e
-->Indice = input(entre com o indice: ) entre com o indice: -->13 Indice = 13. -->texto = input(fornecer o texto: ,s) // cadeia de caracteres com parametro s fornecer o texto: -->programa SCILAB texto = programa SCILAB -->texto = input(fornecer o texto: ) // caracteres sem o parametro s, mas com fornecer o texto: -->programa SCILAB texto = programa SCILAB
4.2.4
Janela de mensagem
A interao SCILAB / usurio pode tambm ser feita por meio de janelas de mensagens ca a e utilizando comandos, tais como, x mdialog e x message. O comando o <resultado> = x mdialog(<ttulo>,<rtulos i>,<valores i>) exibe uma janela contendo a cadeia de caracteres <ttulo> com uma mensagem, vrios a vetores de caracteres <rtulos i> com o nome do i-simo valor requerido e os vetores de o e caracteres <valores i> com os valores iniciais sugeridos, correspondentes a <rtulos i>. o Se for acionado o boto Ok ento <resultado> receber os valores sugeridos ou os outros a a a valores digitados; caso seja acionado o boto Cancel ento <resultado> = []. Por exemplo, a a
-->nomes = [Comprimento:;Largura:;Altura:] nomes = !Comprimento: ! ! ! !Largura: ! ! ! // define os nomes das variaveis
58
!Altura: ! -->valor_ini = [;;] // define os valores iniciais (nenhum no caso) valor_ini = ! ! ! ! ! ! ! ! ! ! -->dimensao = x_mdialog(Entre com as dimensoes, nomes, valor_ini) // abre a janela
apresenta a janela mostrada na Figura 4.1. Digita-se os valores desejados e pressiona-se Ok. O vetor de caracteres dimensao apresentado. Em seguida converte os caracteres para e n meros, utilizando a funo eval (ver Seo 3.4), u ca ca
dimensao = !1.23 ! ! ! !4.56 ! ! ! !7.89 ! -->com = eval(dimensao(1)) com = 1.23 -->lar = eval(dimensao(2)) lar = 4.56 -->alt = eval(dimensao(3)) alt = 7.89
Figura 4.1: Janela do comando x mdialog. Por sua vez, <resultado> = x message(<ttulo>,<bot~es i>) o exibe uma janela contendo a cadeia de caracteres <ttulo> com uma mensagem e vrios a co e a a vetores de caracteres <bot~es i> com as opes. Se for acionado o i-simo boto ento o <resultado> = i. Se <bot~es i> no for especicado assume-se o valor Ok. Por exemplo, o a o comando
4.3. Dirio a
59
apresenta a janela mostrada na Figura 4.2. Se for escolhida a opo Sim ento a varivel ca a a resp receber o valor 1, a
resp = 1.
4.3
Dirio a
Todos os comandos solicitados pelo usurio e as respostas fornecidas pelo SCILAB (com exa cesso de grcos) podem ser gravados em um arquivo ASCII para que possam ser impressos a a ou mesmo inclu dos em algum relatrio, como foi feito neste texto! o Para esta gravao basta usar o comando diary(<nome do arquivo>), a partir do qual a ca interao SCILAB / usurio ser registrada no arquivo, cujo nome dado pela cadeia de ca a a e caracteres <nome do arquivo>. A nalizao do registro feita por diary(0). Por exemplo, ca e
-->diary(diario) // cria o arquivo diario -->a = 1, b = sqrt(%eps) a = 1. b = 1.490D-08 -->diary(0) // fecha o arquivo diario
4.4
A transferncia de dados entre o espao de trabalho e algum dispositivo de entrada e sa e c da (arquivo em disco, impressora etc) aumenta a utilizao do SCILAB visto tornar poss ca vel, por exemplo, at a troca de informaes com um outro programa. e co
60
4.4.1
Abertura de arquivo
a [<idenarq>,<erro>] = mopen(<nome do arquivo>,<permiss~o>)
Deste modo, a funo mopen associa o nome externo do arquivo dado pela cadeia de caracca teres <nome do arquivo> ` unidade <idenarq> que ser utilizada nos comandos de entrada a a e sa no modo especicado pela <permiss~o>. O escalar <erro> indica a ocorrncia de da a e algum erro. Os caracteres permitidos para <permiss~o> esto listados na Tabela 4.2. O a a caractere b indica que o arquivo binrio. e a Tabela 4.2: Atributos de arquivo. <permiss~o> a r ou rb r+ ou r+b w ou wb w+ ou w+b a ou ab a+ ou a+b Especicao ca Abre o arquivo para leitura. Abre o arquivo para atualizao (leitura e escrita), mas no cria o ca a arquivo. Abre o arquivo para escrita e caso necessrio cria o arquivo. Porm, a e remove o conte do do arquivo existente. u Abre o arquivo para atualizao (leitura e escrita) e se necessrio ca a cria o arquivo. Todavia, remove o conte do do arquivo existente. u Cria e abre um arquivo novo ou abre um arquivo j existente para a escrita, anexando ao nal do arquivo. Cria e abre um arquivo novo ou abre um arquivo j existente para a atualizao (leitura e escrita), anexando ao nal do arquivo. ca
Se <permiss~o> for omitida ento ser assumido o valor r. Caso o comando mopen tenha a a a sucesso ao abrir o arquivo, ele retornar o identicador de arquivo <idenarq> contendo um a n mero inteiro positivo e o valor de <erro> ser 0. Em caso de algum erro o valor de <erro> u a ser negativo. O <idenarq> usado com outras rotinas de entrada e sa para identicar a e da o arquivo no qual as operaes sero realizadas. Por exemplo, co a
-->[fid,erro] = mopen(dados.dat,w) erro = 0. fid = 1. // abre o arquivo dados.dat para escrita
4.4.2
Fechamento de arquivo
A funo mclose(<idenarq>) fecha o arquivo previamente aberto pela funo mopen, cujo ca ca identicador associado a este arquivo seja <idenarq>. Quando um arquivo fechado, a e associao entre o identicador <idenarq> e o arquivo f ca sico <nome do arquivo> desfeita, e
-->mclose(1) ans = 0. // fecha o arquivo dados.dat
61
4.4.3
Gravao em arquivo ca
mfprintf(<idenarq>,<formato>,<variveis>) a
onde a cadeia de caracteres <formato> contm caracteres alfanumricos e/ou especicaes e e co de converso para gravar no arquivo com identicador associado <idenarq> a lista contendo a <variveis>. Estas especicaes de converso so delimitadas pelo caracter % e uma das a co a a letras i, e, f, g ou s, de acordo com a Tabela 4.1. No exemplo abaixo, uma tabela contendo x, no arquivo sqrtexp.dat, x e ex para 1 x 2 gerada e gravada e
-->x = 1:0.2:2; // define o vetor x -->tab = [x; sqrt(x); exp(-x)] // gera a tabela tab tab = 1. 1. 0.3678794 1.2 1.0954451 0.3011942 1.4 1.183216 0.2465970 1.6 1.2649111 0.2018965 1.8 1.3416408 0.1652989 2. 1.4142136 0.1353353 -->[fid,erro] = mopen(sqrtexp.dat,w) // abre o arquivo sqrtexp.dat para escrita erro = 0. fid = 1. -->mfprintf(fid,%5.2f%15.10f%15.10f\n,tab) // escreve tabela no arquivo -->mclose(fid) // fecha o arquivo ans = 0.
4.4.4
Leitura em arquivo
[<tamanho>,<variveis>] = mfscanf(<num>,<idenarq>,<formato>) a
A funo mfscanf efetua a leitura de dados formatados em um arquivo, sendo sua sintaxe ca
onde <idenarq> o identicador associado ao arquivo no qual est sendo feita a leitura e a dos dados escritos no formato especicado na cadeia de caracteres <formato> e o parmetro a
62
opcional <num> especica o n mero de vezes que o formato usado. Os dados so conu e a vertidos segundo a cadeia de caracteres <formato> e atribu dos ` lista <variveis>. As a a especicaes de converso so mostradas na Tabela 4.1. A varivel <tamanho> retorna o co a a a n mero de elementos que foram lidos do arquivo com sucesso, u
-->fid = mopen(sqrtexp.dat,r) // abre arquivo para leitura fid = 1. -->[n,a,b,c] = mfscanf(1,fid,%5f%15f%15f) // leitura de 1 linha em 3 variaveis c = 0.3678795 b = 1. a = 1. n = 3. -->vetor = mfscanf(1,fid,%5f%15f%15f) // leitura de 1 linha em 1 vetor vetor = 1.2 1.0954452 0.3011942 -->matriz = mfscanf(2,fid,%5f%15f%15f) // leitura de 2 linhas em 1 matriz matriz = 1.4 1.183216 0.2465970 1.6 1.2649111 0.2018965
A funo mseek(<nmero>,<idenarq>,<posi~o>) usada para posicionar ca u ca e registro do arquivo, cujo identicador seja <idenarq>. A nova posio ca e partir da distncia dada pelo <nmero> de bytes do in (se <posi~o> = a u cio ca posio atual (se <posi~o> = cur) ou do m de arquivo (se <posi~o> ca ca ca o parmetro <posi~o> no for especicado assumido o valor set, a ca a e
-->mseek(0,fid) // posiciona leitura para o inicio do arquivo -->matriz = mfscanf(6,fid,%5f%15f%15f) // leitura das 6 linhas em 1 matriz matriz = 1. 1. 0.3678795 1.2 1.0954452 0.3011942 1.4 1.183216 0.2465970 1.6 1.2649111 0.2018965 1.8 1.3416408 0.1652989 2. 1.4142135 0.1353353
Durante o processo de leitura importante vericar se o ultimo registro do arquivo j foi e a lido. A funo meof(<idenarq>) faz esta vericao no arquivo de identicador <idenarq>. ca ca Se o ultimo registro j foi lido ento ser retornado o valor 1, caso contrrio 0 ser retornado. a a a a a Continuando o exemplo acima,
-->meof(fid) // verifica se fim de arquivo ans = 0. -->[n,m] = mfscanf(1,fid,%5f%15f%15f) // leitura de 1 linha em 1 variavel
63
m n
= []
4.5
Exerc cios
Seo 4.1 ca Vericar as diferenas entre os formatos de exibio para as variveis a = sqrt(2), e = c ca a exp(10), x = 1:10, y = x e M = rand(3,3), 4.1. a, M, disp(a), disp(M). 4.2. format(15,e), a, e, x. 4.3. mprintf(%10.5f %12.3e\n,a,e). 4.4. mprintf(%5.1f\n,x) e mprintf(%5.1f\n,y). 4.5. Explicar a diferena de d c gitos entre a varivel tab e o conte do do arquivo sqrtexp.dat a u na mostrado Seo 4.4.3. ca Seo 4.2 ca Observar os resultados dos comandos para controle do espao de trabalho utilizando as c variveis dos Exerc a cios 4.14.5, 4.6. who, whos. 4.7. save (dados), clear, who. 4.8. load (dados), who. 4.9. save (esptrab,x,y), clear, who. 4.10. load (esptrab), who, x, y.
64
Seo 4.3 ca Entre com os comandos abaixo, 4.11. diary(meudiario). 4.12. a = 4. 4.13. b = log10(a). 4.14. diary(0). 4.15. Vericar o conte do do arquivo meudiario. u Seo 4.4 ca 4.16. Gerar uma tabela com 10 linhas de x, sen(x), 0 x /2 e grav-la no arquivo a seno.dat. 4.17. Fechar o arquivo seno.dat gravado no Exerc 4.16 e vericar o seu conte do. cio u 4.18. Acrescentar o valor + 1, sen( + 1) na ultima linha do arquivo seno.dat e vericar o seu conte do. u 4.19. Abrir o arquivo seno.dat para leitura e ler a primeira linha. 4.20. Gravar os valores -1 e -2 na ultima linha de seno.dat e observar o resultado.
Cap tulo 5
Linguagem de programao ca
Nos cap tulos anteriores foram descritos os elementos fundamentais do SCILAB, os quais possibilitam sua utilizao em um modo interativo. Neste cap ca tulo sero abordadas algumas a estruturas de programao que tornaro poss desenvolver programas e funes escritos ca a vel co em SCILAB, tais como, estruturas condicionais e estruturas de repetio. ca
5.1
Programao ca
Alm de poder entrar com cada comando de uma vez, o SCILAB permite, como qualquer e outra linguagem de programao, que seja executada uma seqncia de comandos escrita ca ue em um arquivo. Por esta razo este tipo de arquivo chamado de roteiro (script). Sero a e a apresentados dois tipos de roteiros: programa e funo. ca
5.1.1
Programa
Um arquivo contendo um programa criado usando um editor de texto qualquer e para e executar esse programa utiliza-se o comando exec, cuja sintaxe e exec(<arquivo>,<modo>) onde a cadeia de caracteres <arquivo> determina o nome do arquivo (incluido o caminho) com o programa a ser executado e o escalar opcional <modo> especica como ser a execuo, a ca de acordo com a Tabela 5.1. Seja o programa escrito no arquivo decsomat.sci para gerar uma matriz com elementos aleatrios entre 100 e 100 e decomp-la na soma de trs matrizes: uma triangular inferior, o o e uma diagonal e outra triangular superior,
65
66
Tabela 5.1: Modos de execuo do comando exec. ca <modo> 0 -1 1 2 3 4 7 Descrio ca exibe resultados, no ecoa linha de comando e no exibe a a o prompt --> (valor default); nada exibido; e ecoa cada linha de comando; o prompt --> exibido; e ecoa cada linha de comando e exibe o prompt -->; pra antes de cada prompt e continua aps um Enter; a o modos 3 e 4 juntos.
// editado no arquivo decsomat.sci // programa decomposicao_matriz // Objetivo: decompor uma matriz aleatoria na soma de tres matrizes: // uma triangular inferior, uma diagonal e outra triangular superior n = input(Ordem da matriz: ); A = fix(200*(rand(n,n)-0.5*ones(n,n))); // gera matriz com elementos aleatorios D = diag(diag(A)); // obtem matriz diagonal L = tril(A) - D; // matriz triangular inferior com diagonal nula U = triu(A) - D; // matriz triangular superior com diagonal nula A, L, D, U
5.1. Programao ca
67
0. 0. = 0. 0. 0.
33. 0. - 33. 0. 0.
Um programa tem acesso `s variveis no espao de trabalho e as variveis criadas por ele a a c a faro parte do espao de trabalho. No exemplo acima, as matrizes A, D, L e U foram criadas a c no espao de trabalho. c O comando halt interrompe a execuo do SCILAB at que se tecle Enter. Qualquer ca e comando digitado entre o prompt e o Enter ser ignorado, a
-->a = 1 // comando qualquer a = 1. -->halt // causa a interrupcao do SCILAB halt-->b = 2 // atribui o valor 2 a variavel b -->b // a atribuicao acima nao foi efetuada !--error 4 undefined variable : b
5.1.2
Subprograma function
Um outro tipo de arquivo de roteiro usado para o prprio usurio criar novas funes para e o a co o SCILAB. Sua sintaxe e function [<par^metros sada>] = <nome fun~o> (<par^metros entrada>) a ca a <comandos> endfunction sendo function uma palavra-chave que determina o in da funo, <par^metros sada> cio ca a e um conjunto de variveis contendo os argumentos gerados pela funo (separados por v a ca rgula ca e e delimitados por [ e ]), <nome fun~o> uma cadeia de caracteres que especica o nome da funo e <par^metros entrada> um conjunto de variveis com os argumentos fornecidos ca a e a ` funo (separados por v a ca rgula e delimitados por ( e )). Os <par^metros entrada> so a a opcionais e mesmo no caso de sua omisso os parnteses devem ser mantidos. Os <comandos> a e especicam o conte do da funo e a palavra-chave endfunction o seu nal. u ca Por exemplo, seja o arquivo parabola.sci contendo uma funo para calcular as duas ra ca zes de uma parbola, a
function raizes = parabola(a,b,c) // Objetivo: calcular as duas raizes de uma parabola // PARABOLA(A,B,C) calcula as duas raizes da parabola // P(X) = A*X^2 + B*X + C = 0 // retornando-as no vetor RAIZES. delta = sqrt(b^2-4*a*c);
68
O comando exec, apresentado na Seo 5.1.1, utilizado para que as functions editadas ca e em um dado arquivo passem a fazer parte da biblioteca do SCILAB para uso posterior. Por exemplo,
-->exists(parabola) // verifica que parabola nao existe ans = 0. -->exec(parabola.sci,-1) // function carregada do arquivo para o espaco de trabalho -->exists(parabola) // verifica que parabola agora existe ans = 1.
Ao contrrio do programa no qual as variveis so globais, em uma function a lista dos a a a <par^metros entrada> e as variveis internas so locais, ou seja, elas no tem acesso `s a a a a a variveis do espao de trabalho. Por sua vez, os <par^metros sada> so criados no espao a c a a c de trabalho. No caso da function parabola acima, a varivel raizes criada no espao a e c de trabalho do SCILAB. E possivel chamar uma function com n meros diferentes de parmetros de entrada ou de u a sa do que aqueles denidos no arquivo que a contm. Isto feito pela funo argn, cuja da e e ca sintaxe e [<nmero par^metros sada>,<nmero par^metros entrada>] = argn() u a u a a Ao evocar argn dentro da function so fornecidos o <nmero par^metros sada> e o a u a e <nmero par^metros entrada>. O segundo argumento opcional. u A function pegaso escrita no arquivo pegaso.sci calcula o zero pertence ao intervalo [a b] da funo denida na cadeia de caracteres funcao, utilizando o robusto e eciente mtodo ca e pgaso. Nesta function utilizado o comando eval para avaliao de expresso, o qual e e ca a e descrito na Seo 3.4. ca
function [Raiz,Erro,Iter] = pegaso(funcao,a,b,Toler,IterMax,Exibe) // Objetivo: Calcular raiz de equacao pelo metodo pegaso. // // PEGASO(FUNCAO,A,B,TOLER,ITERMAX,EXIBE) calcula a raiz de uma // equacao F(X)=0 contida no intervalo [A B] com tolerancia TOLER // e com no maximo ITERMAX iteracoes, usando o metodo pegaso,
5.1. Programao ca
69
// sendo a funcao F(X) dada na cadeia de caracteres FUNCAO. // EXIBE especifica se os resultados intermediarios serao // mostrados, O: nao exibe e 1: exibe. // FUNCAO, A e B sao necessarios enquanto que TOLER, ITERMAX e // EXIBE terao valores pre-definidos caso nao sejam fornecidos. // [nargsai,nargent] = argn() // numero de argumentos de saida e de entrada if nargent < 3, error(Numero de argumentos insuficientes); end if nargent < 4, Toler = 1e-10; end if nargent < 5, IterMax = 100; end if nargent < 6, Exibe = 0; end x = a; Fa = eval(funcao); x = b; Fb = eval(funcao); if Exibe ~= 0 disp( Calculo de raiz de equacao pelo metodo pegaso) disp(iter a b x Fx delta_x) end k = 0; x = b; Fx = Fb; while 1 k = k + 1; DeltaX = -Fx / (Fb - Fa) * (b - a); x = x + DeltaX; Fx = eval(funcao); if Exibe ~= 0 mprintf(%3i%11.5f%11.5f%11.5f%14.5e%14.5e\n,k,a,b,x,Fx,DeltaX); end if ((abs(DeltaX) < Toler & abs(Fx) < Toler) | k >= IterMax), break, end if Fx*Fb < 0 a = b; Fa = Fb; else Fa = Fa * Fb / (Fb + Fx); end b = x; Fb = Fx; end Raiz = x; if nargsai > 1, Erro = abs(DeltaX) >= Toler | abs(Fx) >= Toler; end if nargsai > 2, Iter = k; end endfunction
O comando erro(<mensagem>) exibe a cadeia de caracteres <mensagem> e interrompe a execuo de um programa ou funo. ca ca Os argumentos funcao, a e b devem ser fornecidos seno uma mensagem de erro ser exibida a a e a execuo da function interrompida. No entanto, os argumentos Toler (tolerncia da ca a raiz), IterMax (n mero mximo de iteraes) e Exibe (exibe resultados intermedirios) u a co a so opcionais; caso no sejam inclu a a dos na lista de argumentos de entrada sero atribu a dos valores pr-denidos. Se forem especicados mais de seis argumentos de sa haver a e da a exibio de uma mensagem de erro e a interrupo da function. ca ca Se nenhum ou apenas um argumento de sa for especicado ento ser retornado a raiz da da a a equao na varivel Raiz. Se forem dois argumentos ento alm da Raiz ser retornado a ca a a e a condio de erro na varivel Erro. Se forem trs argumentos de sa ento sero retornados ca a e da a a Raiz, Erro e o n mero de iteraes Iter. Mais de trs argumentos de sa causam a u co e da exibio de uma mensagem de erro e a no execuo da function pegaso. ca a ca
70
Para calcular a raiz de f (x) = cos(x2 1) x + 1 = 0 pertencente ao intervalo [0 2], com tolerncia = 101 , com no mximo 10 iteraes, listando os resultados intermedirios e a a co a retornado a raiz, a condio de erro e o n mero de iteraoes, ca u c
-->exec(pegaso.sci,0) -->[r,e,i] = pegaso(cos(x^2-1)*sqrt(x+1),0,2,1e-1,10,1) Calculo de raiz de equacao pelo metodo pegaso iter a b x Fx delta_x 1 0.00000 2.00000 0.47920 8.72828e-01 -1.52080e+00 2 2.00000 0.47920 0.99219 1.41128e+00 5.12995e-01 3 2.00000 0.99219 1.68045 -4.09987e-01 6.88254e-01 4 0.99219 1.68045 1.52552 3.83307e-01 -1.54933e-01 5 1.68045 1.52552 1.60038 1.54647e-02 7.48614e-02 i = 5. e = F r = 1.6003769
Por sua vez, calculando a mesma raiz com os argumentos de entrada opcionais previamente atribu dos, ou seja, tolerncia = 1010 , mximo de 100 iteraes, no listando os resultados a a co a intermedirios e alm disto retornado somente a raiz e a condio de erro, faz-se a e ca
-->[r,e] = pegaso(cos(x^2-1)*sqrt(x+1),0,2) e = F r = 1.6033703
Conforme j mencionado, as variveis de uma function so locais, ou seja, s podem ser refea a a o renciadas internamente, no sendo reconhecidas pelo espao de trabalho e outras functions. a c No entanto, alm do uso de argumentos, um outro modo de trocar informaes entre o espao e co c de trabalho e as functionss pelo uso de variveis globais. A declarao e a ca global <lista de variveis> a faz com que as variveis especicadas na <lista de variveis>, separadas por branco, a a tornem-se globais e portanto esta declarao deve aparecer no programa e nas functions ca de interesse. Por exemplo, seja a funo no arquivo soma diagonal.sci para calcular a ca soma da diagonal da matriz resultante do produto das matrizes A e B denidas no espao de c trabalho,
function somadiag = soma_diagonal // Objetivo: // calcular a soma da diagonal do produto das matrizes A*B do espaco de trabalho global A B somadiag = sum(diag(A*B)); endfunction
5.1. Programao ca
71
O uso de variveis globais diculta o entedimento e a modicao das functions, alm a ca e de tornar os mdulos do programa menos independentes. Por estas razes, a utilizao de o o ca variveis globais deve ser evitada. a O comando return colocado dentro de uma function causa um retorno normal para o comando seguinte `quele que chamou a function. J o comando a a [<varesp 1>,...,<varesp n>] = return (<varloc 1>,...,<varloc n>) faz com que as variveis locais <varloc i> sejam copiadas no espao de trabalho com os a c ca correspondentes nomes <varesp i>. Seja a funo descrita no arquivo consistencia.sci,
function y = consiste(a,b) // Objetivo: // exemplo de consistencia de dados if a <= 0 | b > 1 y = %i [e,f] = return(a,b) end y = log10(a) + sqrt(1-b); endfunction
Uma funo pode tambm ser denida na janela de comando pela funo deff, ca e ca deff([<param sada>] = <nome fun~o> (<param entrada>), [<comandos>]) ca e ca onde <param sada> uma lista contendo os argumentos gerados pela funo (separados por v rgula e delimitados por [ e ]), <nome fun~o> uma cadeia de caracteres que especica ca e e a ca o nome da funo e <param entrada> uma lista com os argumentos fornecidos ` funo ca (separados por v rgula e delimitados por ( e )). A matriz de caracteres <comandos> especica o corpo da funo. Por exemplo, seja a funo para multiplicar e dividir dois n meros, ca ca u
72
-->deff([mul,div] = operacao(a,b),[mul = a * b;div = a / b]) -->[multiplica, divide] = operacao(3,2) // uso da funcao operacao divide = 1.5 multiplica = 6.
// define funcao
5.2
Estruturas condicionais
Uma estrutura condicional permite a escolha do grupo de comandos a serem executados quando uma dada condio for satisfeita ou no, possibilitando desta forma alterar o uxo ca a natural de comandos. Esta condio representada por uma expresso lgica. ca e a o
5.2.1
Estrutura if-end
if <condi~o> ca <comandos> end
Se o resultado da expresso lgica <condi~o> for T (verdadeiro) ento a lista <comandos> a o ca a ser executada. Se o resultado for F (falso) ento <comandos> no sero executados. Cona a a a sidere o programa logaritmo decimal.sci,
// programa logaritmo_decimal // Objetivo: calcular logaritmo decimal x = input(Entre com x: ); if x > 0 LogDec = log10(x); disp([x LogDec]); end
Neste exemplo, o logaritmo decimal de x ser atribu a LogDec se, e somente se, o valor a do de x for maior que 0.
5.2.2
Estrutura if-else-end
if <condi~o> ca <comandos 1> else
No caso de haver duas alternativas, uma outra estrutura condicional deve ser usada
73
Se o resultado da expresso lgica <condi~o> for T (verdadeiro) ento somente a lista a o ca a contendo <comandos 1> ser executada. Se <condi~o> for F (falso) ento ser a lista a ca a a ca <comando 2> a unica a ser executada. O programa funcao modular.sci utiliza a funo modular f (x) = |2x|. Se x for positivo ou nulo ento ser atribu ` varivel fx o resultado a a do a a de 2*x, todavia, se x for negativo ento fx ser igual a -2*x, a a
// programa funcao_modular // Objetivo: avaliar uma funcao modular x = input(Entre com x: ); if x >= 0 fx = 2 * x; else fx = -2 * x; end disp([x fx]);
5.2.3
Estrutura if-elseif-end
if <condi~o 1> ca <comandos 1> elseif <condi~o 2> ca <comandos 2> elseif <condi~o 3> ca <comandos 3> . . . else <comandos n> end
A lista <comandos 1> ser executada se <condi~o 1> for igual a T (verdadeiro); j a lista a ca a a ca co <comandos 2> ser executada se <condi~o 2> for T e assim para as outras condies. Se nenhuma das condies for T ento <comandos n> ser executada. Quando a <condi~o i> co a a ca for satisfeita e os <comandos i> executados, a estrutura if-elseif-end ser abandonada, a ou seja, o controle do processamento ser transferido para o comando imediatamente aps a o o end. Seja o programa modulo.sci para calcular o valor absoluto de um n mero real ou complexo, u
74
// programa modulo // Objetivo: calcular o valor absoluto de um numero real ou complexo a = input(Entre com a: ); if imag(a) ~= 0 b = sqrt(real(a).^2+imag(a).^2); elseif a < 0 b = -a; else b = a; end disp([a b]);
Para a = 3 - 4*%i,
-->exec(modulo.sci,-1) Entre com a: -->3-4*%i 3. - 4.i 5.
Deste modo foi executado o primeiro comando para o qual a condio imag(a) ~= 0 foi ca satisfeita. Assim, na estrutura if-elseif-end uma unica lista de comandos executada. e
5.2.4
Estrutura select-case-end
select <express~o> a case <express~o 1> a case <express~o 2> a case <express~o 3> a . . . case <express~o n> a else <comandos e> end
Esta estrutura similar a if-elseif-end e sua sixtaxe e e then <comandos 1> then <comandos 2> then <comandos 3> then <comandos n>
A lista <comandos 1> ser executada se <express~o> for igual a <express~o 1>. A lista a a a <comandos 2> ser executada se <express~o> for igual a <express~o 2> e assim para as a a a outras expresses. Se <express~o> no for igual a nenhuma das expresses anteriores ento o a a o a a a <comandos e> ser executada. Cabe ressaltar que somente uma lista de comandos ser executada. Considere o programa posicao poltrona.sci para determinar a posio de uma poltrona ca para quem entra em um nibus, o
// programa posicao_poltrona // Objetivo: determinar a posicao de uma poltrona em onibus poltrona = input(Entre com o numero da poltrona: ); fila = fix(poltrona/4) + 1; select modulo(poltrona,4) case 0 then
75
if poltrona > 0 fila = fila - 1; posicao = esquerda / corredor mprintf(poltrona%3i na fila%3i a %s\n,poltrona,fila,posicao) else posicao = nao existe mprintf(poltrona%3i %s\n,poltrona,posicao) end case 1 then posicao = direita / janela mprintf(poltrona%3i na fila%3i a %s\n,poltrona,fila,posicao) case 2 then posicao = direita / corredor mprintf(poltrona%3i na fila%3i a %s\n,poltrona,fila,posicao) case 3 then posicao = esquerda / janela mprintf(poltrona%3i na fila%3i a %s\n,poltrona,fila,posicao) else posicao = nao existe mprintf(poltrona%3i %s\n,poltrona,posicao) end
5.3
Estruturas de repetio ca
As estruturas de repetio fazem com que uma seqncia de comandos seja executada reca ue petidamente at que uma dada condio de interrupo seja satisfeita. O SCILAB possui e ca ca duas estruturas de repetio, as estruturas for-end e a while-end, com as quais poss ca e vel construir uma terceira estrutura com interrupo no interior. ca
5.3.1
Estrutura for-end
A estrutura for-end permite que um grupo de comandos seja repetido um n mero deteru minado de vezes. Sua sintaxe e for <varivel>=<arranjo> a <comandos>
76
end onde <varivel> a varivel-de-controle que assume todos os valores contidos no vetor a e a linha <arranjo>. Assim, o n mero de repeties da lista <comandos> igual ao n mero u co e u de elementos no vetor <arranjo>. A varivel-de-controle no pode ser redenida dentro da a a estrutura for-end. O programa primeiros impares.sci mostra que a soma dos n primeiros n meros u mpares igual ao quadrado de n, e
// programa primeiros_impares // Objetivo: verificar propriedade dos numeros impares n = input(Entre com n: ); Soma = 0; for i = 1:2:2*n-1 Soma = Soma + i; end disp([Soma n^2])
Para n = 5 a varivel-de-controle i assume os valores 1 3 5 7 9, cuja soma igual a 25. a e Para mostrar que as estruturas for-end podem estar encadeadas, considere o programa soma matriz.sci para calcular a soma dos elementos das linhas, colunas e diagonal de uma matriz,
// programa soma_matriz // Objetivo: calcular a soma dos elmentos das linhas, colunas e diagonal de matriz A = input(Entre com a matriz: ); [nlin,ncol] = size(A); Soma_Linhas = zeros(nlin,1); Soma_Colunas = zeros(1,ncol); Soma_Diagonal = 0; for i = 1:nlin Soma_Diagonal = Soma_Diagonal + A(i,i); for j = 1:ncol Soma_Linhas(i) = Soma_Linhas(i) + A(i,j); Soma_Colunas(j) = Soma_Colunas(j) + A(i,j); end end A, Soma_Linhas, Soma_Colunas, Soma_Diagonal
Um quadrado mgico de ordem n uma matriz com elementos no repetidos e com valores a e a 2 entre 1 e n , tal que a soma dos elementos das linhas, das colunas e da diagonal sejam iguais. Para o quadrado mgico de ordem 4, a
77
-->exec(soma_matriz.sci,0) Entre com a matriz: -->[16 2 3 13; 5 11 10 8; 9 7 6 12; 4 14 15 1] A = 16. 2. 3. 13. 5. 11. 10. 8. 9. 7. 6. 12. 4. 14. 15. 1. Soma_Linhas = 34. 34. 34. 34. Soma_Colunas = 34. 34. 34. 34. Soma_Diagonal = 34.
Cumpre observar que o SCILAB possui comandos para determinar estes somatrios de um o modo bem simples, pelo uso da funo sum que fornece a soma dos elementos de uma matriz. ca
5.3.2
Estrutura while-end
A estrutura while-end, ao contrrio da for-end, repete um grupo de comandos um n mero a u indeterminado de vezes. Sua sintaxe e while <condi~o> ca <comandos 1> [else <comandos 2>] end Enquanto a expresso lgica <condi~o> for T (verdadeira) a lista <comandos 1> ser repea o ca a tida. Quando ela for F (falsa) ento a lista <comandos 2> ser executada. O comando else a a opcional. e Por exemplo, seja o programa precisao.sci para determinar a preciso de um computador, a
// programa precisao // Objetivo: determinar a precisao de um computador n = 0; Epsilon = 1; while 1 + Epsilon > 1 n = n + 1; Epsilon = Epsilon / 2; end n, Epsilon, %eps
78
Epsilon a chamada preciso da mquina , ou seja, o maior n mero que somado a 1 e a a u e 53 igual a 1. Para computadores com aritmtica IEEE = 2 . Comparada com a varivel e a 52 especial %eps = 2 do SCILAB,
-->1 + %eps - 1 ans = 2.220D-16 -->1 + Epsilon - 1 ans = 0.
Note que quando %eps for somado a 1 resulta em um n mero maior do que 1. O mesmo u no ocorre com Epsilon, porque qualquer valor igual ou menor do que ele somado a 1 ser a a simplesmente 1, ou seja, o computador j no consegue mais representar 1 + . a a
5.3.3
A estrutura while-end permite que um grupo de comandos seja repetido um n mero indeu terminado de vezes, no entanto, a condio de interrupao testada no in da estrutura. ca c e cio Em vrias situaes em programao se faz necessrio interromper a execuo da repetio a co ca a ca ca vericando a condio no interior ou nal da estrutura e no somente no seu in ca a cio. O comando break interrompe a execuo de uma estrutura while-end ou for-end e transca fere a execuo para o comando imediatamente seguinte ao end. Em repeties aninhadas, o ca co break interrompe a execuo apenas da estrutura mais interna. Assim, uma repetio com ca ca condio de interrupo no interior pode ter a forma ca ca while %T <comandos 1> if <condi~o> ca break end <comandos 2> end A estrutura while-end executada indenidamente a princ e pio, pois a condio do while ca sempre T (verdadeira). Contudo, quando a <condi~o> do if for satisfeita o comando e ca break ser executado causando a interrupo da repetio while-end. a ca ca Seja o programa racional.sci para fornecer a aproximao racional de um n mero positivo ca u com uma dada tolerncia, a
79
// programa racional // Objetivo: fornecer a aproximacao racional de um numero positivo com dada precisao while %T numero = input(Entre com um numero > 0: ); if numero <= 0 break end tol = input(Entre com tolerancia: ); [num,den] = rat(numero,tol); disp([numero num den numero-num/den]) end
2 e ,
-->exec(racional.sci,0) Entre com um numero > 0: -->sqrt(2) Entre com tolerancia: -->1e-5 1.4142136 239. 169. 0.0000124 Entre com um numero > 0: -->%pi Entre com tolerancia: -->1e-10 3.1415927 208341. 66317. 1.224D-10 Entre com um numero > 0: -->0
Ele lista continuamente a representao racional de um nmero fornecido enquanto este for ca u positivo.
5.4
Depurao de programa ca
O comando pause interrompe a execuo de um programa e transfere o controle para o ca teclado; quando em uma funo ele interrompe a sua execuo. No modo de pausa aparece ca ca o s mbolo do prompt indicando o n vel da pausa, por exemplo, -1->. E disponibilizado, ento, um novo espao de trabalho no qual todas as variveis de n a c a vel mais baixo esto a acess veis, mesmo as variveis de uma funo. a ca Para voltar ao espao de trabalho que evocou a pausa usa-se o comando return. Conforme c mencionado na Seo 5.1.2 o comando ca [<varesp 1>,...,<varesp n>] = return (<varloc 1>,...,<varloc n>) faz com que as variveis locais <varloc i> sejam copiadas no espao de trabalho que evocou a c a a a pausa com os correspondentes nomes <varesp i>. Se o comando no for usado ento as variveis de n mais baixo esto protegidas e no podem ser modicadas. Seja a funo a vel a a ca no arquivo avalia.sci,
function expressao = avalia(a) divide = a/10; raiz = sqrt(a); logdec = log10(a) expressao = divide + raiz + logdec; endfunction
80
e sua execuo, ca
-->exec(avalia.sci,-1) // carrega a funcao para o espaco de trabalho -->valor = avalia(100) // avalia a funcao valor = 22. -->exists(raiz) // verifica a inexistencia da variavel local raiz ans = 0.
A varivel raiz no existe no espao de trabalho por se tratar de uma varivel local. Se for a a c a colocado o comando pause, todas as variveis denidas antes dele estaro dispon a a veis. Por exemplo, se for colocado depois de raiz = sqrt(a);
-->exec(avalia.sci,-1) // carrega a funcao modificada Warning :redefining function: avalia -->valor = avalia(100) // avalia a funcao entrando no modo de pausa -1->raiz // existencia da variavel local raiz no novo espaco de trabalho ans = 10. -1->exists(logdec) // inexistencia da variavel logdec ans = 0. -1->return valor = 22.
Neste caso a varivel local raiz est dispon no espao de trabalho e logdec no est a a vel c a a porque ela foi denida depois do pause.
5.5
Exerc cios
Executar o programa acima para n = 5, 10 e 30. 5.2. Escrever uma function para calcular a norma-2 de um vetor. 5.3. Escrever uma function para calcular a norma- de um vetor.
81
5.4. Dada a matriz triangular inferior L = {lij } e o vetor c, escrever uma function para calcular y tal que Ly = c: l11 l21 l31 . . . l33 . . . y1 y2 y 3 . . . yn c1 c2 c3 . . . cn
l22 l32 . . .
5.5. Dada a matriz triangular superior U = {uij } e o vetor d, escrever uma function para calcular x tal que Ux = d: u11 u12 u13 u1n u22 u23 u2n u33 u3n . . . unn Seo 5.2 ca 5.6. Qual o valor de LogDec no exemplo sobre a estrutura if-end mostrada na Seo 5.2.1 ca para x = 2? 5.7. Encontrar o valor de fx no exemplo sobre if-else-end da Seo 5.2.2 para x = 10. ca 5.8. Achar o valor de b no exemplo de if-elseif-end da Seo 5.2.3 para a = -3. ca 5.9. Qual o valor de b no exemplo sobre a estrutura if-elseif-end da Seo 5.2.3 para a ca = -3+4*%i? 5.10. Encontrar as posies das poltronas 4, 25 e 40 usando o exemplo da estrutura co select-case-end da Seo 5.2.4. ca Seo 5.3 ca 5.11. Determinar o valor de Soma no exemplo sobre a estrutura for-end mostrada na Seo 5.3.1 para n = 7. ca 5.12. Calcular a soma das linhas, das colunas e da diagonal de uma matriz de Toeplitz de ordem 5. d1 d2 d = 3 . . . dn xn x1 x2 x3 . . .
82
5.13. Explicar como feita a determinao da preciso de um computador. e ca a 5.14. Calcular a norma-2 do vetor x = [1e200 2e200 3e200] usando a function escrita no Exerc 5.2. Qual a alterao a ser feita para que a funo calcule corretamente? cio ca ca 5.15. Calcular a raiz de f (x) = sen(x)x + 4 = 0 que est no intervalo [1 5], utilizando a a function pegaso mostrada na Seo 5.1.2. ca
Cap tulo 6
Grcos a
Uma das grandes virtudes do SCILAB a facilidade que ele oferece para produzir grcos e a de boa qualidade. Neste cap tulo sero vistos como gerar grcos bi e tridimensionais e os a a modos de imprimi-los ou grav-los em arquivos para que possam ser inclu a dos em textos.
6.1
Grcos bidimensionais a
6.1.1
Funo plot ca
plot(<x 1>,<y 1>,<tipo de linha 1>,...,<x n>,<y n>,<tipo de linha n>)
a onde <x i> e <y i> so vetores contendo as abscissas e ordenadas dos pontos a serem exibie dos, respectivamente e <tipo de linha i> uma cadeia de 1 a 4 caracteres que especica a cor, o estilo da linha e o marcador dos pontos dados. Os tipos de linha so mostrados na a Tabela 6.1. Considere os vetores
-->x = linspace(-8,8,50); // define as abscissas -->y = sin(x); // funcao seno -->z = cos(x); // funcao co-seno
83
84
Tabela 6.1: Tipos de linha da funo plot. ca S mbolo r g b c m y k w Cor vermelho verde azul turquesa lils a amarelo preto branco S mbolo -: -. Estilo de linha linha slida o linha tracejada linha pontilhada linha de trao e ponto c S mbolo + o * . x s d ^ v > < pentagram none Marcador mais c rculo asterisco ponto cruz quadrado diamante triang. cima triang. baixo triang. direita triang. esquerda pentagrama sem marca
O grco produzido mostrado na Figura 6.1(a). Tambm pode ser gerado um grco um a e e a pouco mais complexo, sen(x) e cos(x) em funo de x com os valores de sen(x) em linha ca slida e os pontos dados sendo destacados com (*) e os de cos(x) em linha tracejada e com o (o). Para produzir o graco da Figura 6.1(b) basta o comando
-->plot(x,y,-*,x,z,--o)
1.0 0.8 0.6 0.4 0.2 0.0 0.2 0.4 0.6 0.8 1.0 8 6 4 2 0 2 4 6 8
1.0 0.8 0.6 0.4 0.2 0.0 0.2 0.4 0.6 0.8 1.0 8 6 4 2 0 2 4 6 8
Figura 6.1: Grcos produzidos pela funo plot. a ca O SCILAB oferece algumas funes para identicao dos grcos. co ca a
6.1. Grcos bidimensionais a T tulos e rtulos o A funo ca o o xtitle(<ttulo>,<rtulo x>,<rtulo y>,<rtulo z>) o
85
escreve a cadeia de caracteres <ttulo> no cabealho e a cadeia de caracteres <rtulo i> c o a no i-simo eixo do grco. Os trs argumentos <rtulo i> so opcionais. e a e o
Texto A funo ca xstring(x,y,<texto>,<^ngulo>,<caixa>) a escreve a cadeia de caracteres <texto> na posio de coordenadas x,y com inclinao ca ca <^ngulo>, em graus, no sentido horrio. O escalar inteiro <caixa> informa se ser dea a a senhada uma caixa em torno do <texto>. Se ele for igual a 1 e <^ngulo> = 0 ento a caixa a a ser desenhada. Os argumentos <^ngulo> e <caixa> so opcionais. Assim os comandos, a a a
-->xtitle(fun+ascii(231)+ascii(245)+es seno e co-seno,eixo x,eixo y) -->xstring(4.1,0.7,cos(x))
produziro os t a tulos e rtulos no grco da Figura 6.1(b), como mostrado na Figura 6.2(a). o a Note que a funo ascii foi usada para gerar os caracteres da l ca ngua portuguesa mostrados na Tabela 3.10 da pgina 43. a
funes seno e coseno 1.0 0.8 cos(x) 0.6 0.4 0.2 eixo y 0.0 0.2 0.4 0.6 0.8 1.0 8 6 4 2 0 eixo x 2 4 6 8 eixo y 0.6 0.4 0.2 0.0 0.2 0.4 0.6 sen(x) 0.8 1.0 8 6 4 2 0 eixo x 2 4 6 8 cos(x) 1.0 0.8 cos(x) funes seno e coseno
Legendas e grade.
86
Legenda A funo ca legend([<texto 1>,...,<texto n>],<posi~o>,<caixa>) ca adiciona legendas ao esboo da gura, usando as cadeias de caracteres <texto i> como c rtulos. O argumento <posi~o> especica onde as legendas sero colocadas, 1: canto o ca a superior direito (default), 2: canto superior esquerdo, 3: canto inferior esquerdo, 4: canto inferior direito e 5: a legenda colocada usando o mouse. A caixa de legendas move-se com e o mouse e assim que estiver na posio desejada pressiona-se um boto. A varivel lgica ca a a o <caixa> indica se uma caixa ser ou no desenhada em torno das legendas, sendo o valor a a default igual a %T. Os argumentos <posi~o> e <caixa> so opcionais. ca a Grade A funo xgrid(<estilo>) faz com que aparea uma grade no grco produzido de acordo ca c a com a constante inteira <estilo>, que dene a forma e a cor da grade. A Figura 6.2(b) mostra o efeito dos comandos.
-->legend([sen(x),cos(x)],5) -->xgrid(1)
6.1.2
Funo fplot2d ca
fplot2d(<abscissas>,<fun~o>,<argumentos>) ca
A funo fplot2d utilizada para esboar grco de funo no R2 , sendo sua sintaxe ca e c a ca
onde <abscissas> um vetor numrico contendo as abscissas, <fun~o> o nome de uma e e ca e function externa e <argumentos> um conjunto opcional que dene o estilo do grco na e a forma <op~o 1> = <valor 1>,..., <op~o n> = <valor n>. O argumento <op~o i> ca ca ca pode ser style, rect, logflag, frameflag, axesflag, nax e leg. style Esta opo utilizada para denir como as curvas sero desenhadas, com seus valores sendo ca e a dados por um vetor com elementos inteiros de tamanho igual ao n mero de curvas. Se u style(i) for positivo a linha ento desenhada como uma linha plana e o a e ndice dene qual cor ser usada. Se style(i) for negativo ou nulo ento a curva esboada usando a a e c marcadores e abs(style(i)) dene o tipo de marcador. rect Dene os limites das abscissas e ordenadas com os valores denidos por um vetor de quatro elementos (rect = [Xmin, Ymin, Xmax, Ymax]). As abscissas estaro entre os limites Xmin a e Xmax e as ordenadas entre Ymin e Ymax.
87
Especica a escala (linear ou logar tmica) ao longo dos dois eixos de coordenadas com valores associados podendo ser nn, nl, ln, ll, sendo que cada letra representa um eixo com n signicando escala normal ou linear e l para escala logar tmica. frameflag Esta opo controla o clculo dos limites das coordenadas atuais a partir dos valores m ca a nimos requeridos. Este argumento pode assumir um valor inteiro, tal que, 0: escala default (sem clculos); 1: limites dados pela opo rect; 2: calculados pelos mximos e m a ca a nimos dos vetores de abscissas e ordenadas; 3: dados pela opo rect, porm aumentados para obter ca e uma escala isomtrica; 4: calculados pelos mximos e m e a nimos dos vetores de abscissas e ordenadas, mas aumentados para obter uma escala isomtrica; 5: dados pela opo rect, e ca porm aumentados para produzir melhores rtulos dos eixos; 6: calculados pelos mximos e o a e m nimos dos vetores de abscissas e ordenadas, mas aumentados para produzir melhores rtulos dos eixos; 7: igual a frameflag = 1, todavia os grcos anteriores so redesenhados o a a para usar a nova escala e 8: igual a frameflag = 2, contudo os grcos anteriores so a a redesenhados para usar a nova escala. axesflag Especica como os eixos sero desenhados podendo ter um valor inteiro, tal que, 0: nada a desenhado em torno do grco; 1: eixos desenhados com o eixo de ordenadas mostrado ` e a a esquerda; 2: grco contornado por uma caixa sem marcadores; 3: eixos desenhados com o a eixo de ordenadas mostrado ` direita; 4: eixos desenhados centrados no meio do contorno a da caixa e 5: eixos desenhados de modo a cruzar o ponto (0,0) e caso este ponto no esteja a dentro da rea exibida ento os eixos no aparecero. a a a a nax Atribui os rtulos e dene as marcas nos eixos quando a opao axesflag = 1 for usada. o c Os valores so denidos por um vetor de quatro elementos inteiros ([<nx>, <Nx>, <ny>, a <Ny>]), tal que, <Nx>: n mero de marcas principais a ser usado no eixo das abscissas; <nx>: u n mero de submarcas a serem desenhadas entre marcas no eixo das abscissas; <Ny> e <ny>: u fornecem informaes similares, mas para o eixo das ordenadas. Se a opo axesflag no co ca a for usada ento a opo nax supe que axesflag = 1. a ca o leg Esta opo dene as legendas referentes ` cada curva devendo ser uma cadeia de caracteres ca a na forma <legenda 1>@<legenda 2>@...@<legenda n>, sendo <legenda i> correspondente ` i-sima curva. Se essa opo no for denida assumido o valor . a e ca a e
88
Exemplos A seguir sero mostrados alguns grcos gerados pela funo fplot2d. A lista de comandos a a ca
-->x = -20:0.1:20; // define valores de x -->deff([y]=f(x),y=sin(x)*x) // define funcao -->fplot2d(x,f) // esboca grafico -->xtitle(f(x) = sen(x) * x,x,f(x)) // titulos e rotulos
produzem o grco apresentado na Figura 6.3(a) apenas com o t a tulo e os rtulos dos eixos. o Os comandos abaixo geram o grco da Figura 6.3(b), com o uso das opes style e rect, a co
-->fplot2d(x,f,style=-10,rect=[-15 -10 15 10]) // grafico com style e rect -->xtitle(f(x) = sen(x) * x,x,f(x)) // titulos e rotulos
f(x) = sen(x) * x 20 10 8 6 10 4 5 f(x) f(x) 2 0 2 4 10 6 15 8 10 15 f(x) = sen(x) * x
15
20 20
15
10
0 x
10
15
20
10
0 x
10
15
Figura 6.3: Esboos de f (x) = sen(x)x pela funo fplot2d. c ca O comando abaixo apresenta as opes frameflag e axesflag, produzindo o grco da co a Figura 6.4(a),
-->fplot2d(x,f,frameflag=4,axesflag=5) // grafico com frameflag e axesflag
As opes nax e leg podem ser vistas no comando abaixo, que gera o grco da Figura 6.4(b), co a
-->fplot2d(x,f,nax=[5 10 4 8],leg=sen(x)*x) // grafico com nax e leg
Para mais informaes sobre os comandos para manipulaao de grcos bidimensionais use co c a help fplot2d.
6.2
Grcos tridimensionais a
De uma maneira similar aos grcos bidimensionais, o SCILAB possui vrios comandos para a a que grcos tridimensionais sejam tambm facilmente esboados. Sero descritas a seguir, a e c a de modo sucinto, algumas funes com esta nalidade. Para mais informaes sobre essas co co funes deve ser utilizado o comando help graphics. co
89
20 18.3 15 13.2 10 8.1 5 3.0 0 20 10 5 7.1 10 12.2 15 17.3 20 20.0 15.6 11.1 sen(x)*x 6.7 2.2 2.2 6.7 11.1 15.6 20.0 0 10 20 2.1
Figura 6.4: Esboos de f (x) = sen(x)x pela funo fplot2d com opes. c ca co
6.2.1
Funo meshgrid ca
A funo [<matriz X>,<matriz Y>] = meshgrid(<vetor x>,<vetor y>) transforma o doca m nio especicado por <vetor x> e <vetor y> em matrizes <matriz X> e <matriz Y> que possam ser usadas para avaliar funes de duas variveis e fazer esboos tridimensionais co a c a o de malhas e superf cies. As linhas de <matriz X> so cpias de <vetor x> e as colunas de <matriz Y> so cpias de <vetor y>, a o
-->x = -1:0.5:2 // define vetor x x = - 1. - 0.5 0. 0.5 1. 1.5 2. -->y = -1:0.5:1 // define vetor y y = - 1. - 0.5 0. 0.5 1. -->[X,Y] = meshgrid(x,y) // cria matrizes X Y = - 1. - 1. - 1. - 1. - 1. - 1. - 0.5 - 0.5 - 0.5 - 0.5 - 0.5 - 0.5 0. 0. 0. 0. 0. 0. 0.5 0.5 0.5 0.5 0.5 0.5 1. 1. 1. 1. 1. 1. X = - 1. - 0.5 0. 0.5 1. 1.5 2. - 1. - 0.5 0. 0.5 1. 1.5 2. - 1. - 0.5 0. 0.5 1. 1.5 2. - 1. - 0.5 0. 0.5 1. 1.5 2. - 1. - 0.5 0. 0.5 1. 1.5 2. -->Z = X + Y // operacao com X e Y Z = - 2. - 1.5 - 1. - 0.5 0. 0.5
e Y 1. 0.5 0. 0.5 1.
1.
90
- 1.5 - 1. - 0.5 0.
- 1. - 0.5 0. 0.5
- 0.5 0. 0.5 1.
0. 0.5 1. 1.5
0.5 1. 1.5 2.
1. 1.5 2. 2.5
1.5 2. 2.5 3.
6.2.2
Funo plot3d ca
Esta funo uma generalizao da funo plot vista na Seo 6.1 para esboos tridimenca e ca ca ca c sionais. Sua sintaxe e plot3d(<matriz X>,<matriz Y>,<matriz Z>,<argumentos>) onde <matriz X>, <matriz Y> e <matriz Z> so matrizes de mesmas dimenses contendo a o as coordenadas tridimensionais dos pontos a serem exibidos e <argumentos> um conjunto e opcional que dene o estilo do grco na forma <op~o 1> = <valor 1>,..., <op~o n> a ca ca ca = <valor n>. O argumento <op~o i> pode ser alpha, theta, leg, flag e ebox. alpha e theta So ngulos, em graus, que denem as coordenadas esfricas do ponto do observador. O a a e argumento theta descreve o ngulo no plano xy e alpha em torno do eixo z. Se no forem a a especicados so assumidos os valores pr-denidos alpha = 35 e theta = 45. a e leg Dene os rtulos referentes ` cada um dos trs eixos devendo ser uma cadeia de caracteres o a e na forma <legenda x>@<legenda y>@<legenda z>, sendo <legenda i> correpondente ao i-simo eixo. Se essa opo no for fornecida ento assumido o valor . e ca a a e flag Essa opo um vetor numrico com trs elementos flag = [<modo>,<tipo>,<caixa>]. O ca e e e elemento inteiro <modo> dene a cor da superf cie. Se positivo ento a superf desenhada a cie e com a cor <modo> e o contorno de cada faceta desenhado com estilo de linha e cor denidos. e Se ele for nulo ento somente a malha da superf desenhada e se ele for negativo ento a cie e a a superf desenhada com a cor -<modo> e o contorno da faceta no desenhado. cie e a e O segundo elemento inteiro <tipo> dene a escala, tal que, 0: o grco feito usando a a e escala 3D atual; 1: reescala automaticamente a caixa 3D com razo de aspecto extremo e os a contornos so denidos pelo valor do argumento opcional ebox; 2: reescala automaticamente a a caixa 3D com razo de aspecto extremo e os contornos so computados usando os dados a a fornecidos; 3: 3D isomtrico com limites da caixa fornecido por ebox; 4: 3D isomtrico com e e limites derivados dos dados fornecidos; 5: limites isomtricos expandidos 3D com os limites e da caixa fornecidos por ebox e 6: limites isomtricos expandidos 3D com limites derivados e dos dados fornecidos.
91
O terceiro elemento inteiro <caixa> dene a moldura em torno do grco, tal que, 0: nada a desenhado em torno do grco; 1: o mesmo que o anterior porque ainda no est implee a a a mentado (!); 2: somente os eixos atrs da superf so desenhados; 3: uma caixa em torno a cie a da superf desenhada e os t cie e tulos so adicionados e 4: uma caixa em torno da superf a cie desenhada e t e tulos e eixos so adicionados. a ebox Esta opo dene os limites das trs coordenadas do grco com os valores dados em um vetor ca e a de seis elementos (ebox = [Xmin, Xmax, Ymin, Ymax, Zmin, Zmax]). Este argumento e usado junto com <tipo> da opo flag, caso <tipo> tenha o valor 1, 3 ou 5. Se a opo ca ca flag no for fornecida ento ebox no considerado. a a a e Exemplos Para produzir o esboo da funo z = sen(x) cos(y)2 no intervalo 3 x 3 e 2 y 2, c ca mostrado na Figura 6.5(a), utiliza-se os comandos
-->[X,Y] = meshgrid(-3:0.2:3,-2:0.2:2); // cria matrizes X e Y a partir de dois vetores -->Z = sin(X).*cos(Y).^2; // calcula pontos da funcao -->plot3d(X,Y,Z) // desenha grafico 3D
Nesta gura foram utilizados os valores pr-denidos alpha = 35 e theta = 45 graus. A e Figura 6.5(b) apresenta o grco com os valores alterados para alpha = 30 e theta = 60, a usando o comando
-->plot3d(X,Y,Z,alpha=30,theta=60)
Figura 6.5: Esboos de z = sen(x) cos(y)2 usando a funo plot3d. c ca Quando os argumentos tm os valores alterados para alpha = 60 e theta = 30, pelo coe mando abaixo, o grco rotacionado do modo mostrado na Figura 6.6(a), a e
92
1.0 0.8 0.6 0.4 0.2 1.0 0.6 0.2 Z 0.2 1 0.6 1.0 2.0 1.5 1 1.0 0.5 0.0 Y 2 0.5 1.0 1.5 2.0 3 X 2 1 0 Y 1 2 3 2 1 0 X 2 1 0 1.0 3 2 3 Z 0.0 0.2 0.4 0.6 0.8
Figura 6.6: Esboos de z = sen(x) cos(y)2 usando plot3d com variao de alpha e theta. c ca
-->plot3d(X,Y,Z,alpha=60,theta=30)
Um grco com a orientao dos eixos mais natural apresentado na Figura 6.6(b), sendo a ca e obtido pelo comando com alpha = 80 e theta = 230,
-->plot3d(X,Y,Z,alpha=80,theta=230)
Um exemplo de uso da opo leg pode ser visto na Figura 6.7(a), obtida pelos comandos ca
-->legenda = eixo x@eixo y@eixo z // define legenda legenda = eixo x@eixo y@eixo z -->plot3d(X,Y,Z,alpha=80,theta=230,leg=legenda)
Acrescentando a opo flag com os argumentos <modo> = 0, <tipo> = 2 e <caixa> = 3 ca pelo comando abaixo, tem-se a Figura 6.7(b),
-->plot3d(X,Y,Z,alpha=80,theta=230,leg=legenda,flag=[0 2 3])
93
1.0 0.8 0.6 0.4 0.2 eixo z 0.0 0.2 0.4 0.6 0.8 1.0 3 2 1 0 eixo y 1 2 3 2 1 0 eixo x eixo y eixo x 2 1 eixo z
Figura 6.7: Esboos de z = sen(x) cos(y)2 usando plot3d com as opes leg e flag. c co
6.2.3
Funo mesh ca
A funo mesh(<matriz X>,<matriz Y>,<matriz Z>) produz o esboo de uma malha na ca c superf especicada pelas matrizes <matriz X>, <matriz Y> e <matriz Z>. Os comandos cie abaixo geram o esboo mostrado na Figura 6.8(a), c
-->[X,Y] = meshgrid(-3:0.2:3,-2:0.2:2); // define as matrizes X e Y -->Z = sin(X).*cos(Y).^2; // define a matriz Z com a funcao -->mesh(X,Y,Z); // desenha a malha -->xgrid(1) // coloca a grade -->xtitle(mesh,eixo x,eixo y,eixo z) // titulos e rotulos
mesh
surf
1.0 0.8 0.6 0.4 0.2 0.0 0.2 0.4 0.6 0.8 1.0 2 1 0 1 eixo y 2 3 2 0 1 eixo x 2 1 3
1.0 0.8 0.6 0.4 0.2 0.0 0.2 0.4 0.6 0.8 1.0 2 1 0 1 eixo y 2 3 2 0 1 eixo x 2 1 3
eixo z
eixo z
94
6.2.4
Funo surf ca
A funo surf(<matriz X>,<matriz Y>,<matriz Z>) produz uma superf ca cie sombreada tridimensional especicada pelas matrizes <matriz X>, <matriz Y> e <matriz Z>. Deste modo, os comandos abaixo produzem a Figura 6.8(b),
-->[X,Y] = meshgrid(-3:0.2:3,-2:0.2:2); // define as matrizes X e Y -->Z = sin(X).*cos(Y).^2; // define a matriz Z com a funcao -->surf(X,Y,Z); // desenha a superficie -->xtitle(surf,eixo x,eixo y,eixo z) // titulos e rotulos -->xgrid(1) // coloca a grade
6.3
Janela de gura
As guras geradas pelo SCILAB podem ser facilmente modicadas, impressas ou gravadas em um arquivo para posterior impresso ou incluso em um texto. a a Uma gura gerada na janela Scilab Graphic(0) que apresenta cinco botes: File, Zoom, e o UnZoom, 3D Rot. e Edit. Escolhendo File aparecem vrias opes entre as quais Export, com a qual surge a janela a co Xscilab, mostrada na Figura 6.9, com vrias opes para produzir um arquivo com o grco. a co a
6.4
Exerc cios
95
Gerar uma tabela com 20 pontos para 5 x 5 e exibir o grco da funo usando o a ca comando plot colocando rtulos e grade. o 6.2. Repetir a operao acima usando 50 pontos e sem usar grade. ca 6.3. Utilizar a funo fplot2d no Exerc 6.1 variando os argumentos opcionais. ca cio 6.4. Gerar uma tabela de 40 pontos para y = sen(x)x, 10 x 10 e exibir o seu grco usando o comando fplot2d com rtulos e grade. a o 6.5. Usar a funo plot no Exerc 6.4. ca cio Sees 6.2 e 6.3 co 6.6. Seja a funo ca z = sen(x)y 2 . Gerar uma malha com 5 x 5 e 3 y 3 usando a funo meshgrid. ca 6.7. Gerar um grco usando a funo plot3d. a ca 6.8. Repetir o Exerc 6.7 variando os argumentos opcionais. cio 6.9. Usando o comando surf exibir a superf de cie z = x cos(x) sen(y) com x e y . 6.10. Gravar a gura do Exerc 6.9 no arquivo figura.eps, utilizando a janela Xscilab. cio
96
Cap tulo 7
Computao cient ca ca
7.1 Medidas de tempo
O SCILAB prov duas maneiras de medir o tempo gasto para executar um conjunto de e comandos: o tempo de execuo e o tempo de CPU. ca Usando o tic-toc poss saber o tempo gasto para a execuo de um grupo de comandos. e vel ca A sua sintaxe e tic() <comandos> <varivel> = toc() a O tic inicia a contagem do tempo e o toc fornece para <varivel> o tempo, em segundos, a passado desde o ultimo tic. A atribuio do tempo gasto a <varivel> opcional. Se o ca a e computador estiver executando vrias tarefas simultaneamente, tic-toc pode no ser uma a a medida muito convel. Uma outra medida obtida por timer que fornece o tempo de a e CPU (unidade central de processamento) que o tempo gasto para execuo de operaes e ca co aritmticas e lgicas. Pode ser usado na forma e o <varivel 1> = timer() a <comandos> <varivel 2> = timer() - <varivel 1> a a Por exemplo, considere a execuo do programa no arquivo medidas.sci, ca
A = rand(3000,350); B = rand(350,600); // define duas matrizes aleatorias tic() // inicia contagem do tempo de execucao t0 = timer(); // inicia contagem do tempo de CPU C = A * B - 0.5; maximo = max(abs(diag(C))); tempo_cpu = timer() - t0 // tempo de CPU
97
98
tempo_exec = toc()
// tempo de execucao
A diferena de tempo produzida por tic-toc e timer pode ser bem signicativa se o comc putador estiver executando outros programas ao mesmo tempo. Alm disso, esses tempos e medidos dependero do computador utilizado. a
7.2
Algebra linear
Nesta seo sero mostrados alguns comandos do SCILAB relativos aos tpicos usualmente ca a o abordados em textos de Clculo Numrico. Para um conhecimento mais amplo dos comandos a e do SCILAB com respeito a vetores e matrizes usar os comandos apropos vector e apropos matrix.
7.2.1
Parmetros da matriz a
O SCILAB disponibiliza diversas funes para se obter informaes sobre matrizes, tais co co como, normas, n mero de condio, determinante, posto e trao. u ca c Normas A funo norm(<varivel>,<tipo>) fornece a norma <tipo> de um vetor ou matriz contido ca a em <varivel>, de acordo com a Tabela 7.1. No caso de um vetor, <tipo> pode ser qualquer a n mero (inteiro ou real, positivo ou negativo). u Exemplos de normas vetoriais,
-->x = [1 2 3 4 5]; // define vetor x -->norm(x,1) // norma de soma de magnitudes ans = 15. -->norm(x), norm(x,2) // norma Euclidiana ans = 7.4161985 ans = 7.4161985 -->norm(x,inf) // norma de maxima magnitude ans = 5. -->norm(x,-%pi) // norma -pi ans = 0.9527515
99
Tabela 7.1: Normas vetoriais e matriciais. Sejam v = [ v1 v2 . . . vm ] e M = [ m11 m12 . . . m1p ; m21 m22 . . . m2p ; . . . ; mn1 mn2 . . . mnp ] <tipo> norm(v,p) v Descrio ca
m p
i=1 m
v v
1
=
i=1
norma Euclidiana norma de mxima magnitude a norma de soma mxima de coluna a norma de soma mxima de linha a
= max |vi |
1im n 1jp i=1 p
= max
= max
n
1in
j=1 p
=
i=1 j=1
e normas matriciais,
-->A = [1 2 3; 4 5 6; 7 8 9]; // define matriz A -->norm(A,1) // norma de soma maxima de coluna ans = 18. -->norm(A,inf) // norma de soma maxima de linha ans = 24. -->norm(A,fro) // norma de Frobenius ans = 16.881943 -->norm(A,2), norm(A) // norma espectral ans = 16.848103 ans = 16.848103
100
Nmero de condio u ca A funo cond(<matriz>) calcula o n mero de condio de <matriz> quadrada denido ca u ca em termos da norma-2, ou seja, a razo entre o maior e o menor valor singular, e a max cond(M) = 2 (M) = M 2 M 1 2 = . min Para a matrix,
-->B = [5 3 0; -1 8 6; 4 2 9]; -->cond(B) ans = 2.6641005
A funo rcond(<matriz>) fornece uma estimativa do rec ca proco do n mero de condiao de u c <matriz> denido em termos da norma-1. Se <matriz> for bem condicionada ento rcond a prximo de 1 e se ela for mal-condicionada rcond ser prximo de 0. Para a matriz B e o a o acima,
-->r = rcond(B) r = 0.2094488 -->1/r ans = 4.7744361
Determinante A funo det(<matriz>) calcula o determinante de <matriz>, sendo ela quadrada. Na ca forma [<mantissa>,<expoente>] = det(<matriz>) o valor do determinante apresentado e <expoente> . Para A e B denidas previamente, em notao cient ca ca: <mantissa>10
-->det(B) // determinante de B ans = 399. -->[man,exp] = det(A) // determinante de A em notacao cientifica exp = 6.6613381 man = - 16. -->det(A) ans = 6.661D-16
Posto O posto de uma matriz A (m n) o n mero mximo de vetores linhas ou de vetores e u a colunas de A que so linearmente independentes, sendo posto(A) min(m, n). No SCILAB a o posto de <matriz> obtido por rank(<matriz>,<toler^ncia>), sendo igual ao n mero e a u de valores singulares de <matriz> maiores que <toler^ncia>. Se <toler^ncia> no for a a a dada ento assumido o valor <toler^ncia> = max(m, n) * norm(<matriz>) * %eps. a e a Para as matrizes A e B,
101
-->rank(A) // posto de A ans = 2. -->rank(A,1e-20) // posto de A com tolerancia 1e-20 ans = 3. -->rank(B) // posto de B ans = 3.
Trao c A funo trace(<matriz>) determina o trao de <matriz>, isto , a soma dos elementos ca c e da sua diagonal principal. Para a matriz A denida anteriormente,
-->trace(A) ans = 15. // traco de A
7.2.2
Decomposies co
O SCILAB disponibiliza vrios tipos de decomposies de matrizes entre as quais, LU, a co Cholesky, QR e SVD. Decomposio LU ca A funo lu(<matriz>) faz a decomposio LU de <matriz>, de dimenso m n, usando ca ca a o mtodo de eliminao de Gauss com pivotao parcial. e ca ca O uso do comando [<fatorL>,<fatorU>,<matrizP>] = lu(<matriz>) gera uma matriz triangular inferior unitria <fatorL> (dimenso m min(m, n)), uma matriz triangular a a superior <fatorU> (dimenso min(m, n) n) e uma matriz de permutaes <matrizP> a co (dimenso n n), tal que <matrizP> * <matriz> = <fatorL> * <fatorU>. Por exemplo, a
-->M = [2 -3 5; 4 1 -1; 1 8 6] // definicao da matriz M M = 2. - 3. 5. 4. 1. - 1. 1. 8. 6. -->[L,U,P] = lu(M) // decomposicao LU de M P = 0. 1. 0. 0. 0. 1. 1. 0. 0. U = 4. 1. - 1. 0. 7.75 6.25 0. 0. 8.3225806 L = 1. 0. 0.
102
0. 1. // verificando que P * M = L * U
Contudo, o uso de dois parmetros de sa [<matrizInf>,<matrizSup>] = lu(<matriz>) a da gera uma matriz triangular superior <matrizSup> = <fatorU> e uma matriz triangular inferior <matrizInf> tal que <matrizP> * <matrizInf> = <fatorL> de modo que <matriz> = <matrizInf> * <matrizSup>. Para as matrizes acima,
-->[Tinf,Tsup] = lu(M) // decomposicao LU de M com dois parametros Tsup = 4. 1. - 1. 0. 7.75 6.25 0. 0. 8.3225806 Tinf = 0.5 - 0.4516129 1. 1. 0. 0. 0.25 1. 0. -->M - Tinf * Tsup // verificando que M = Tinf * Tsup ans = 0. 0. 0. 0. 0. 0. 0. 0. 0. -->Tsup - U // verificando que Tsup = U ans = 0. 0. 0. 0. 0. 0. 0. 0. 0. -->P * Tinf - L // verificando que P * Tinf = L ans = 0. 0. 0. 0. 0. 0. 0. 0. 0.
Decomposio de Cholesky ca A funo <fator> = chol(<matriz>) fatora <matriz> simtrica denida positiva pelo ca e mtodo de Cholesky produzindo uma matriz <fator> triangular superior tal que <fator> e * <fator> = <matriz>. Por exemplo,
-->A = [4 -2 2; -2 10 -7; 2 -7 30] // define a matriz A A = 4. - 2. 2. - 2. 10. - 7. 2. - 7. 30. -->U = chol(A) // calcula o fator U
103
= 2. - 1. 1. 0. 3. - 2. 0. 0. 5. -->A - U * U // verificando que A = U*U ans = 0. 0. 0. 0. 0. 0. 0. 0. 0. -->B = [1 -2 4; -2 5 3; 4 3 8] // define a matriz B B = 1. - 2. 4. - 2. 5. 3. 4. 3. 8. -->F = chol(B) // calcula o fator F !--error 29 matrix is not positive definite
Houve um erro porque a matriz B no denida positiva. a e Decomposio QR ca A funo qr faz a decomposio QR de uma matriz de dimenso m n. O uso na forma ca ca a [<matrizQ>,<matrizR>]=qr(<matriz>) produz uma matriz ortonormal <matrizQ> de ordem m (<matrizQ>*<matrizQ>=eye(m,m)) e uma matriz triangular superior <matrizR> com a mesma dimenso mn de <matriz>, de modo que <matriz>=<matrizQ>*<matrizR>. a Sejam,
-->A = [2 -4; 3 5; 1 -7; 8 6] // define a matriz A A = 2. - 4. 3. 5. 1. - 7. 8. 6. -->[Q,R] = qr(A) // calcula fatores Q e R R = - 8.8317609 - 5.4349298 0. - 9.8214835 0. 0. 0. 0. Q = - 0.2264554 0.5325844 - 0.5445505 - 0.6070721 - 0.3396831 - 0.3211171 0.5753910 - 0.6711366 - 0.1132277 0.7753803 0.5906262 0.1926801 - 0.9058216 - 0.1096497 - 0.1534623 0.3793593 -->round(Q*Q) // verificando que Q e ortonormal ans = 1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1. 0.
104
0. -->round( ans = 0. 0. 0. 0.
Quando os quatro caracteres (,e) forem colocados aps o nome de uma matriz de dimenso o a (m n, m > n) o SCILAB produz uma decomposio econmica, de modo que <matrizQ> ca o ter dimenso (m n) e <matrizR> ser (n n). Para a matriz A acima, a a a
-->[Qe,Re] = qr(A,e) // calcula fatores Q e R na forma economica Re = - 8.8317609 - 5.4349298 0. - 9.8214835 Qe = - 0.2264554 0.5325844 - 0.3396831 - 0.3211171 - 0.1132277 0.7753803 - 0.9058216 - 0.1096497 -->round(A - Qe * Re) // verificando que A = Qe * Re ans = 0. 0. 0. 0. 0. 0. 0. 0.
A funo qr possui diversas formas de ser utilizada; para maiores informaes use help qr. ca co Decomposio em valores singulares ca A funo svd faz a decomposio em valores singulares de uma matriz de dimenso m ca ca a n. O comando [<matrizU>,<matrizS>,<matrizV>] = svd(<matriz>) produz uma matriz ortonormal <matrizU> de ordem m, uma matriz diagonal <matrizS> de dimenso m n a contendo os valores singulares de <matriz> em ordem decrescente e uma matriz ortonormal <matrizV> de ordem n, de modo que <matriz> = <matrizU> * <matrizS> * <matrizV>. Por exemplo,
-->A = [2 -4; 3 5; 1 -7; 8 6] // define a matriz A A = 2. - 4. 3. 5. 1. - 7. 8. 6. -->[U,S,V] = svd(A) // calcula os fatores U, S e V de A V = - 0.5257311 0.8506508 - 0.8506508 - 0.5257311 S =
105
12.476603 0. 0. 6.9522923 0. 0. 0. 0. U = 0.188444 0.5471902 - 0.5445505 - 0.4673105 - 0.0110328 0.5753910 0.4351204 0.6516942 0.5906262 - 0.7461769 0.5251246 - 0.1534623 -->round( U*U ) // verificando que U e ans = 1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1. -->round( V*V ) // verificando que V e ans = 1. 0. 0. 1. -->round( A - U * S * V) // verificando ans = 0. 0. 0. 0. 0. 0. 0. 0.
ortonormal
que A = U*S*V
Se os quatro caracteres (,e) forem colocados aps o nome de uma matriz de dimenso o a (m n, m > n) ser computada uma decomposio econmica, de modo que <matrizU> a ca o ter dimenso (m n), <matrizS> e <matrizR> sero (n n). Utilizando a mesma matriz a a a A,
-->[Ue,Se,Ve] Ve = - 0.5257311 - 0.8506508 Se = 12.476603 0. Ue = 0.188444 - 0.4673105 0.4351204 - 0.7461769 -->round( A ans = 0. 0. 0. 0. 0. 0. 0. 0. = svd(A,e) 0.8506508 - 0.5257311 0. 6.9522923 0.5471902 - 0.0110328 0.6516942 0.5251246 Ue * Se * Ve) // calcula os fatores U, S e V na forma economica
Para se obter apenas os valores singulares de <matriz> em <vetor> basta <vetor> = svd(<matriz>),
106
A funo svd possui outras formas de ser utilizada; para maiores informaes use help svd. ca co
7.2.3
Soluo de sistemas ca
Dado um sistema Ax = b, a soluo x pode ser facilmente calculada pelo SCILAB pelo ca operador (\), por exemplo, para um sistema com matriz simtrica, e
-->A = [4 -2 2; -2 10 -7; 2 -7 30] // matriz dos coeficientes A = 4. - 2. 2. - 2. 10. - 7. 2. - 7. 30. -->b = [8 11 -31] // vetor dos termos independentes b = 8. 11. - 31. -->x = A \ b // solucao de Ax = b x = 3. 1. - 1. -->r = ( b - A * x ) // verificando a exatidao da solucao r = 0. 0. 0.
107
7.2.4
Inversa
A funo inv(<matriz>) calcula a inversa de <matriz> de ordem n, tal que <matriz> * ca inv(<matriz>) = eye(n,n). Para a matriz M acima,
-->E = inv(B) // inversa de B E = - 0.2403101 - 0.2170543 0.2015504 - 0.2170543 0.0620155 0.0852713 0.2015504 0.0852713 - 0.0077519 -->round( B * E - eye(3,3) ) // verificando que B * E = I ans = 0. 0. 0. 0. 0. 0. 0. 0. 0.
7.2.5
Autovalores e autovetores
Os autovalores so os zeros do polinmio caracter a o stico da matriz. A funo poly constri ca o o polinmio caracter o stico de uma matriz. Por exemplo,
-->A = [4 -1 3; -1 5 2; 3 2 8] // define a matriz A A = 4. - 1. 3. - 1. 5. 2. 3. 2. 8. -->p = poly(A,x) // constroi o polinomio caracteristico de A p = 2 3 - 79 + 78x - 17x + x -->raizes = roots(p) // zeros do polinomio caracteristico raizes = 1.410402 5.6161546 9.9734434
A funo spec permite o clculo do autosistema (autovalores e autovetores) de uma maca a triz de ordem n por um mtodo mais eciente do que construindo o polinmio carace o ter stico. O uso de [<AutoVetor>,<AutoValor>]=spec(<matriz>) produz uma matriz diagonal <AutoValor> contendo os autovalores e uma matriz <AutoVetor> com os correspondentes autovetores. Se a matriz for simtrica ento os autovetores so mutuamente e a a ortogonais (<AutoVetor> * <AutoVetor> = eye(n,n)). Para a matriz A acima,
-->[Vetor,Valor] = spec(A) Valor = 1.410402 0. 0. 5.6161546 0. 0. Vetor = 0.7387367 0.5462817 0.4732062 - 0.8374647 // calcula os autovalores e autovetores 0. 0. 9.9734434 0.3947713 0.2733656
108
- 0.4799416 0.0151370 0.8771698 -->round( Vetor * Vetor - eye(3,3) ) // autovetores ortogonais de uma matriz simetrica ans = 0. 0. 0. 0. 0. 0. 0. 0. 0.
Para obter apenas os autovalores em <vetor> basta <vetor> = spec(<matriz>). Para a matriz simtrica A denida acima, e
-->lambda = spec(A) lambda = 1.410402 5.6161546 9.9734434 // calcula apenas os autovalores de A
A funo spec possui diversas formas de ser utilizada; para maiores informaes use help ca co spec.
7.3
Interpolao ca
O SCILAB possui funes para clculo das diferenas nitas ascendentes e interpolao co a c ca unidimensional.
7.3.1
A funo diff(<varivel>,<ordem>,<dimens~o>) calcula a diferena nita ascendente de ca a a c ordem dada por <ordem> entre dois elementos de <varivel> ao longo de <dimens~o>, que a a pode assumir os valores r para linha, c para coluna ou * para as colunas da matriz <varivel> colocadas em um vetor. Os argumentos <ordem> e <dimens~o> so opcionais e a a a seus valores pr-denidos so 1 e *, respectivamente. Para um vetor, e a
-->x = [1 2 4 4 7] // define o vetor x x = 1. 2. 4. 4. 7. -->d1 = diff(x) // diferenca de ordem 1 de x d1 = 1. 2. 0. 3. -->d2 = diff(d1) // diferenca de ordem 1 de d1 d2 = 1. - 2. 3. -->xd2 = diff(x,2) // diferenca de ordem 2 de x xd2 = 1. - 2. 3.
No caso de matriz,
-->A = [1:5;(1:5)^2;(1:5)^3] A = // define a matriz A
7.3. Interpolao ca
109
1. 2. 3. 4. 5. 1. 4. 9. 16. 25. 1. 8. 27. 64. 125. -->L1 = diff(A,1,r) // diferenca de ordem 1 ao longo das linhas L1 = 0. 2. 6. 12. 20. 0. 4. 18. 48. 100. -->C1 = diff(A,1,c) // diferenca de ordem 1 ao longo das colunas C1 = 1. 1. 1. 1. 3. 5. 7. 9. 7. 19. 37. 61. -->A(:) // colunas da matriz A em um vetor (transposto) ans = column 1 to 11 1. 1. 1. 2. 4. 8. 3. 9. 27. 4. 16. column 12 to 15 64. 5. 25. 125. -->V1 = diff(A,1,*) // diferenca de ordem 1 assumindo A em um vetor (transposto) V1 = column 1 to 11 0. 0. 1. 2. 4. - 5. 6. 18. - 23. 12. 48. column 12 to 14 - 59. 20. 100.
7.3.2
Interpolao unidimensional ca
Dada uma tabela com pares (xi , yi) especicados nos vetores <abscissas> e <ordenadas>, respectivamente, ento os valores de z contidos no vetor <interpolar> podem ser interpoa lados usando a funo interp1, cuja sintaxe ca e <resultado> = interp1(<abscissas>,<ordenadas>,<interpolar>,<mtodo>) e onde a cadeia de caracteres <mtodo> especica o mtodo a ser utilizado na interpolao, e e ca sendo parmetro a linear spline nearest mtodo e interpolao linear. ca interpolao por splines c bicos. ca u interpolao usando o vizinho mais prximo. ca o
Quando o mtodo no for especicado ser assumida uma interpolao linear. Por exemplo, e a a ca 4 sejam cinco pontos da funo y = x , para 1 x 1 denidos por, ca
-->x = linspace(-1,1,5); // abscissas dos pontos -->y = x.^4; // ordenadas
110
-->interp1(x,y,[-0.6 0.7],linear) // interpolacao linear ans = 0.25 0.4375 -->interp1(x,y,[-0.6 0.7],spline) // interpolacao com splines cubicos ans = 0.144 0.2695 -->interp1(x,y,[-0.6 0.7],nearest) // interpolacao com vizinho mais proximo ans = 0.0625 0.0625
Considerando que os valores exatos so (0,6)4 0,1296 e 0,74 0,2401, o mtodo de a e interpolao com splines c bicos produziu os melhores resultados para este caso. ca u As aproximaes da funo y = x4 por trs funes interpoladoras de interp1 podem ser co ca e co visualizadas pelos comandos,
-->x1 = linspace(-1,1,50); // abscissas para a interpolacao -->y1 = x1.^4; // ordenadas da curva real -->nea = interp1(x,y,x1,nearest); // interpolacao vizinho mais proximo -->spl = interp1(x,y,x1,spline); // interpolacao por splines -->plot(x,y,o,x,y,-.,x1,y1,-,x1,nea,--,x1,spl,:); xgrid(1) -->xtitle(M+ascii(233)+todos de interp1,x,y); // gera graficos e grade -->legend([pontos,linear,y=x^4,nearest,splines],3) // coloca legenda
A partir dos 50 pontos em x1 foram criados os vetores nea e spl que contm as ordenadas e obtidas por interpolao usando os argumentos nearest e splines, respectivamente. ca A Figura 7.1 mostra gracamente os resultados da funo interp1. Os cinco pontos iniciais ca esto representados por o. Uma interpolao linear feita implicitamente desde que o a ca e comando plot interliga os pontos por retas. O grco da funo y = x4 est representado a ca a por uma linha slida, a aproximao por polinmios com nearest por uma linha tracejada o ca o e os splines por uma linha pontilhada. Usualmente os splines produzem uma aproximao ca mais suave da funo como pode ser observado neste caso. ca
7.4
Integrao numrica ca e
A funo integrate calcula numericamente uma integral e sua sintaxe ca e integrate(<fun~o>,<varivel>,<lim inf>,<lim sup>,<erro abs>,<erro rel>) ca a onde <fun~o> uma cadeia de caracteres que dene a funo a ser integrada, <varivel> ca e ca a uma cadeia de caracteres que especica a varivel de integrao, <lim inf> e <lim sup> e a ca so os limites inferior e superior de integrao. Os argumentos <erro abs> e <erro rel> so a ca a os erros absoluto e relativo e so opcionais. No caso de no serem fornecidos, so assumidos a a a 8 os valores 0 e 10 , respectivamente. Por exemplo, seja a funo f (x) = cos(3x+1)x2 +x1,5 , cujo esboo mostrado na Figura 7.2. ca c e
111
0.8
0.6
0.4
0.2 pontos linear y=x^4 nearest splines 0.2 1.0 0.8 0.6 0.4 0.2 0.0 x 0.2 0.4 0.6 0.8 1.0
0.0
Para calcular
9
faz-se
-->Integral = integrate(cos(3*x+1)*x^2+x^1.5,x,1,9) Integral = 102.51064 // calcula a integral
80
60
40
20
20
40
60 1 2 3 4 5 x 6 7 8 9
112
A funo a ser integrada pode tambm estar denida em uma function. Seja o arquivo ca e func.sci com o conte do, u
function y = g(x) y = cos(3*x+1).*x.^2+x.^1.5; endfunction
Assim, para calcular a integral acima usando a function g denida no arquivo func.sci,
-->exec(func.sci,-1) // carrega a function g do arquivo func.sci -->Integral = integrate(g,x,1,9) // calcula a integral Integral = 102.51064