Baixe o app para aproveitar ainda mais
Prévia do material em texto
LABORATO´RIO DE MATEMA´TICA COMPUTACIONAL – SCILAB Luiza Amalia Pinto Canta˜o luiza@sorocaba.unesp.br Suma´rio 1 Introduc¸a˜o ao Ambiente Scilab 2 1.1 O Ambiente Scilab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2 Varia´veis Especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3 Arquivos *.sce de Comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2 A´lgebra Linear Nume´rica 7 2.1 Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2 Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2.1 Matrizes Padra˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.3 Acesso aos elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.4 Matema´tica Matricial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.5 Uso de Scilab na Soluc¸a˜o de Sistemas Lineares: Me´todos Diretos . . . . . . . . . . . . . . . . . 14 2.6 Exercı´cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3 Projeto de Programac¸a˜o 17 3.1 Operadores Relacionais e Lo´gicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.1.1 Operadores Relacionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.1.2 Operadores Lo´gicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.2 O Loop for e while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.3 Estrutura if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.4 Definic¸a˜o de Func¸o˜es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.5 Exercı´cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4 Gra´ficos no Scilab 27 4.1 A Janela Gra´fica do Scilab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.2 Gra´ficos Bi-dimensionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.2.1 Outros Comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.3 Exercı´cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5 Ajuste de Curvas em Ambiente Scilab 35 5.1 Definindo a Func¸a˜o de Ajuste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.2 Spline Cu´bicas em Ambiente Scilab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 5.3 Exercı´cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 6 Gra´ficos Tri-Dimensionais 43 6.1 Gra´ficos Tri-dimensionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 6.1.1 Gra´ficos 3-D Especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 6.2 Detalhes da Func¸a˜o plot3d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 6.2.1 Func¸a˜o eval3d e eval3dp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 6.2.2 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 6.2.3 Outro Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 6.3 Exercı´cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 7 Exercı´cios Adicionais 49 Refereˆncias Bibliogra´ficas 52 1 CAPI´TULO 1 Introduc¸a˜o ao Ambiente Scilab 1.1 O Ambiente Scilab O Scilab e´ um ambiente utilizado no desenvolvimento de programas para a resoluc¸a˜o de problemas nume´ricos. Vamos conhecer um pouco mais sobre o seu ambiente de trabalho. Tendo iniciado o programa (isto depende do sistema operacional), voceˆ vera´ mensagens do fabricante e um pequeno “prompt” de comando aguardando alguma ac¸a˜o sua: ----------------------------------------------- scilab-5.3.0 Consortium Scilab (DIGITEO) Copyright (c) 1989-2010 (INRIA) Copyright (c) 1989-2007 (ENPC) ------------------------------------------------ Startup execution: loading initial environment --> A flecha --> indica que o Scilab esta´ pronto para receber comandos e o cursor e´ o prompt inicial. Na janela do Scilab ha´ um menu horizontal com seis opc¸o˜es: File, Edit, Preferences, Control, Applications e ?. Utilizando o mouse escolha uma das opc¸o˜es. • File – possui oito sub-opc¸o˜es (apresentaremos as quatro mais importantes): – Execute: executa o conteu´do de arquivos (roda o programa implementado). – Open a file: Abre o arquivo do seu programa no editor de texto do Scilab. – Change current directory: Muda o direto´rio em que o Scilab foi aberto para o direto´rio do arquivo (programa). – Quit: permite sair do ambiente Scilab de forma natural. Varia´veis Especiais CAPI´TULO 1. INTRODUC¸A˜O AO AMBIENTE SCILAB • Edit – comandos semelhantes ao editor de texto do Microsoft Office ou Open Office (cut, copy, paste, select all); • Preferences – o comando mais importante desta opc¸a˜o e´ o Clear Console que limpa a janela de execuc¸a˜o do ambiente Scilab. • Control – possui treˆs sub-opc¸o˜es cuja utilidade dos dois primeiros itens pode ser observada na sequ¨eˆncia de comandos abaixo: --> // pressione Ctrl-c e <enter> -1-> // leva ao prompt de 1o. nivel -1-> // pressione Ctrl-c e <enter> -2-> // leva ao prompt de 2o. nivel -2->resume // retorna ao prompt de 1o. nivel -1->resume // retorna ao prompt inicial --> // Ctrl-c e <enter> -1-> // Ctrl-c e <enter> -2->abort // retorna ao prompt inicial --> – Interrupt – interrompe a execuc¸a˜o de um programa. • Applications – aplicativos do ambiente Scilab: – SciNotes – abre um editor de texto pro´prio para programac¸a˜o em ambiente Scilab. • ? – informac¸o˜es e ajuda sobre o ambiente Scilab. Esta possui quatro sub-opc¸o˜es: – Scilab Help: informac¸o˜es sobre os comandos do ambiente Scilab. – Scilab Demonstration: Demonstrac¸a˜o de alguns comandos deste ambiente de trabalho. – Web Links: sites relacionados ao Scilab. – About Scilab: mostra a licenc¸a de uso do programa. Ainda na janela do Scilab ha´ alguns icones abaixo do menu descrito acima. Estes icones sa˜o atalhos para as func¸o˜es mais usadas no menu acima. 1.2 Varia´veis Especiais Algumas varia´veis assumem valores pre´-definidos no Scilab e podem ser vistas usando o comando who. --> who Your variables are: home modules_managerlib helptoolslib scinoteslib xcoslib matiolib atomsguilib atomslib parameterslib simulated_annealinglib genetic_algorithmslib umfpacklib fft scicos_autolib scicos_utilslib spreadsheetlib demo_toolslib development_toolslib soundlib texmacslib tclscilib m2scilib maple2scilablib compatibility_functilib statisticslib timelib stringlib special_functionslib 3 Varia´veis Especiais CAPI´TULO 1. INTRODUC¸A˜O AO AMBIENTE SCILAB sparselib signal_processinglib %z %s polynomialslib overloadinglib optimsimplexlib optimbaselib neldermeadlib optimizationlib linear_algebralib jvmlib output_streamlib iolib interpolationlib integerlib dynamic_linklib uitreelib guilib data_structureslib cacsdlib graphic_exportlib datatipslib graphicslib fileiolib functionslib elementary_functionslib differential_equationlib corelib PWD %tk %pvm MSDOS %F %T %nan %inf SCI SCIHOME TMPDIR %gui %fftw $ %t %f %eps %io %i %e %pi using 7845 elements out of 5000000. and 78 variables out of 9231. Your global variablesare: %modalWarning demolist %driverName %exportFileName %toolboxes %toolboxes_dir using 623 elements out of 180001. and 6 variables out of 767. --> Vejamos o significado das varia´vies mais recorrentes: Varia´vel O que significa Varia´vel O que significa %i Valor de p (−1) %pi pi = 3, 1415926... %e Constante de Euler e = 2, 7182818... %eps precisa˜o da ma´quina no qual o Scilab esta´ instalado. %inf Infinito %nan Not a number Para saber em qual direto´rio o Scilab foi instalado, use a varia´vel SCI e para saber em qual direto´rio o Scilab foi aberto, use PWD. O resultado depende do sistema operacional em que o Scilab foi instalado. -->SCI // Diretorio onde o Scilab foi instalado SCI = /home/luiza/scilab-5.0.3/share/scilab -->PWD // Diretorio onde o Scilab foi lancado PWD = /home/luiza -->home // Mesmo valor da variavel PWD home = 4 Arquivos *.sce de Comandos CAPI´TULO 1. INTRODUC¸A˜O AO AMBIENTE SCILAB /home/luiza --> 1.3 Arquivos *.sce de Comandos Para problemas simples, e´ mais ra´pido e eficiente introduzir seus comandos no prompt do Scilab. Mas, se o nu´mero de comandos e´ grande, ou se voceˆ deseja mudar o valor de uma ou mais varia´veis e re-executar alguns comandos, pode ser trabalhoso e/ou tedioso introduzir os comandos no prompt. O Scilab apresenta uma soluc¸a˜o simples para esse problema: voceˆ pode colocar os comandos do Scilab em um arquivo de texto simples (pode-se fazer uso do Editor do Scilab) e depois abrir este arquivo e executa´-lo no Scilab. Atenc¸a˜o: no Scilab, ponto-e-vı´rgula no final de um comando inibe a apresentac¸a˜o de seu resultado e, qualquer caracter apo´s o uso de // e´ ignorado pelo Scilab pois este e´ interpretado como comenta´rio. Tambe´m e´ importante salientar que os comenta´rios (e os nomes das varia´veis e func¸o˜es utilizados no Scilab) NA˜O devem ter qualquer tipo de acentuac¸a˜o. Abra o Editor de texto SciPad atrave´s do menu do Scilab e digite os comandos abaixo. // Erro e Estabilidade // LMC -- 1o. programa x = input(’Entre com o valor de x’); // Entrada do valor de x via teclado! S = 0; // Variavel que recebera o valor somatorio. format(’v’, 25); S // no. de elementos na representacao de ’S’ // ’v’: formato padrao de uma variaval numerica for (i = 1:30000) // somatorio de 1 ate 30000 S = S + x; end // Final do ’for’ S Salve este arquivo no direto´rio LMC que foi criado. Para isso, clique com o mouse no menu File e selecione Save as. Atribua o nome soma ex4.sce e volte ao ambiente Scilab executando os passos abaixo: -->pwd // verifique se esta no diretorio onde gravou o 1oTeste.sce -->exec(’soma.sce’) // executa o programa ’1oTeste.sce’ O comando exec(’nome-do-arquivo.sce’) executa o programa gerado. Execute o programa acima para x = 0.5 e x = 0.11 ! Tarefa: Desenvolva um programa em Scilab para calcular ( √ 3 · √3) usando o comando format com 100 dı´gitos. Um outro programinha para se testar com uma estrutura diferente da apresentada abaixo, e´ para calcular o nu´mero de faltas possı´veis no semestre (faltas.sce)! // Primeiro teste de LMC -- Controle de presenca // Uso de uma ’Regra de Tres Simples’ para este calculo 5 Arquivos *.sce de Comandos CAPI´TULO 1. INTRODUC¸A˜O AO AMBIENTE SCILAB a = 2; // a = aulas por semana b = 15; // b = semanas de aulas no semestre c = a*b; // c = horas-aulas do semestre x = (30*c)/100 // 30 --- porcentagem de faltas permitidas // 100 -- porcentagem total de aulas // x ---- no. de aulas que o aluno pode faltar y = int(x/2) // y ---- no. de dias que o aluno pode faltar // int(.) no. inteiro de dias (em cada dia de aula sao dadas duas aulas) Teste o programa acima para diferentes valores de a (outras disciplinas) !!!! Por exemplo, para a disciplina de Ca´lculo Nume´rico e Computacional. 6 CAPI´TULO 2 A´lgebra Linear Nume´rica Vamos comec¸ar com as estruturas sobre as quais toda a filosofia Scilab (e linguagens nume´ricas) esta´ baseada. 2.1 Vetores Para criar um vetor no Scilab e´ muito simples. Apenas deve ser tomado cuidado com a diferenciac¸a˜o entre vetores linha e vetores coluna. Experimente: --->v = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] v 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Voceˆ acaba de criar um vetor linha! Neste caso, as vı´rgulas sa˜o desnecessa´rias; poderı´amos simplesmente usar --->v = [1 2 3 4 5 6 7 8 9 10] v 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. que o resultado seria o mesmo. Para os vetores coluna temos treˆs opc¸o˜es: cria´-los diretamente, usar o operador de transposic¸a˜o, ’ (apo´strofo) ou simplesmente pular uma linha para cada elemento. Acompanhe: --->v = [1; 2; 3] v 1. 2. 3. ou ainda -->v = [1 2 3]’ v 1. 2. 3. Vetores CAPI´TULO 2. A´LGEBRA LINEAR NUME´RICA e finalmente -->v = [1 -->2 -->3] v 1. 2. 3. Note que neste u´ltimo caso, o Scilab ficou esperando que se completasse o vetor com “ ] ”. Um jeito pra´tico de criar vetores igualmente espac¸ados e´ usando o operador “ : ”. Observe: -->u =1:10 u 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ou ainda -->u = 0:0.1:1 u column 1 to 10 0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 column 11 1. onde podemos especificar um incremento (no caso, 0.1). Observe que, neste caso temos: u = inicio:incremento:final ou u = inicio:decremento:final (teste u = 1:-0.1:0). Uma outra maneira de construir um vetor linha e´ usando a func¸a˜o linspace cujos elementos desta func¸a˜o sa˜o: linspace( primeiro_valor, ultimo_valor, numero_de_elementos ) Se o nu´mero de elementos e´ omitido, a func¸a˜o gera automanticamente 100 elementos. --> x = linspace( 0, %pi) --> x = linspace( 0, %pi, 11) Veja que, a notac¸a˜o “ : ” permite especificar o intervalo entre os pontos, mas na˜o o nu´mero de pontos. Por outro lado, a func¸a˜o linspace permite especificar o nu´mero de elementos mas na˜o o intervalo entre os pontos. Comandos Descric¸a˜o x = inicio:fim Cria um vetor linha comec¸ando em inicio, incrementa em um e pa´ra em fim (ou antes). x = inicio:incremento:fim Cria um vetor linha comec¸ando em inicio, incrementa em incremento e pa´ra em fim (ou antes). x = linspace(inicio,fim,n) Cria um vetor linha, com espac¸amento linear, comec¸ando em inicio e terminando em fim com n elementos. x = linspace(inicio,fim) Cria um vetor linha, com espac¸amento linear, comec¸ando em inicio e terminando em fim com cem (100) elementos. Tabela 2.1: Comandos ba´sicos para a construc¸a˜o de vetores. 8 Matrizes CAPI´TULO 2. A´LGEBRA LINEAR NUME´RICA 2.2 Matrizes O caso matricial e´ igualmente simples. Siga o exemplo: -->A = [1 2 3 4 -->5 6 7 8 -->9 10 11 12] A 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. -->size(A) ans 3. 4. --> onde acabamos de criar uma matriz 3× 4. A func¸a˜o size(.) mostra o tamanho da sua matriz ou vetor. Note que podemos utilizar o operador “ : ” em combinac¸a˜o com o que foi visto ate´ agora. Tente o comando --> A = [1:5, 9:-1:5; 0:0.25:1, 1:-0.25:0] Interprete o que aconteceu! 2.2.1 Matrizes Padra˜o Dada a utilidade deste tipo de matrizes, o Scilab conte´m func¸o˜es para a criac¸a˜o de matrizes padra˜o. Esse tipo de matriz inclui aqueles cujos elementos sa˜o todos iguais a zero ou a um, matriz identidade, matrizes de nu´meros aleato´rios, matrizes diagonais e cujos elementos sa˜o uma constante dada. -->A = ones(3,2) // ones(.) gera uma matriz com todos os elementos iguais a 1 A 1. 1. 1. 1. 1. 1. -->B = zeros(2,6) // zeros (.) gera matrizes com todos os elementos iguais a 0 B 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. -->C = eye(3,3) // eye(.) gera uma matriz identidade C 1. 0. 0. 0. 1. 0. 0. 0. 1. -->D = eye(2,4) D 1. 0. 0. 0. 9 Matrizes CAPI´TULO 2. A´LGEBRA LINEAR NUME´RICA 0. 1. 0. 0. -->E = eye(4,2) E 1. 0.0. 1. 0. 0. 0. 0. -->A = rand(5,5) A 0.2113249 0.6283918 0.5608486 0.2320748 0.3076091 0.7560439 0.8497452 0.6623569 0.2312237 0.9329616 0.0002211 0.6857310 0.7263507 0.2164633 0.2146008 0.3303271 0.8782165 0.1985144 0.8833888 0.312642 0.6653811 0.0683740 0.5442573 0.6525135 0.3616361 O comando rand(m, n) cria uma matriz m × n com entradas aleato´rias no intervalo [0, 1). -->a = 1:4 // Comece com um vetor simples a 1. 2. 3. 4. -->diag(a) // diag(.) coloca os elementos na diagonal principal ans 1. 0. 0. 0. 0. 2. 0. 0. 0. 0. 3. 0. 0. 0. 0. 4. -->diag(a,1) // Coloca os elementos uma posicao acima da diagonal ans 0. 1. 0. 0. 0. 0. 0. 2. 0. 0. 0. 0. 0. 3. 0. 0. 0. 0. 0. 4. 0. 0. 0. 0. 0. -->diag(a,-2) // Coloca os elementos duas posicoes abaixo da diagonal ans 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 2. 0. 0. 0. 0. 0. 0. 3. 0. 0. 0. 0. 0. 0. 4. 0. 0. 10 Acesso aos elementos CAPI´TULO 2. A´LGEBRA LINEAR NUME´RICA A func¸a˜o diag(.) cria matrizes diagonais em que um vetor determinado pode ser colocado em qualquer posic¸a˜o paralela a` diagonal principal ou na pro´pria diagonal principal. Com essas matrizes padra˜o, ha´ va´rias formas de se criar uma matriz em que todos os elementos apresentam o mesmo valor. Execute os pro´ximos comandos e verifique o que acontece! --> d = %e; // Escolha do numero ’e’ para este exemplo --> d*ones(3,4) // Metodo mais lento (multiplicacao de vetor por escalar) --> d+zeros(3,4) // Metodo mais lento (adicao de escalar a vetor) --> d(ones(3,4)) // Metodo mais rapido (enderecamento vetorial) Func¸a˜o Propo´sito zeros(n) Gera uma matriz n× n com elementos iguais a zero. zeros(n,m) Gera uma matriz n×m com elementos iguais a zero. one(n) Gera uma matriz n× n com elementos iguais a um. one(n,m) Gera uma matriz n×m com elementos iguais a um. eye(n) Gera uma matriz identidade n× n. eye(n,m) Gera uma matriz identidade n×m. diag(v) Gera uma matriz cujos elementos do vetor v ficam na diagonal principal. rand(n,m) Gera uma matriz n×m com valores aleato´rios em (0, 1); size(.) Retorna dois valores, especificando o nu´mero de linhas e o de colunas de uma matriz ou vetor em (.). Tabela 2.2: Func¸o˜es Scilab para gerar matrizes padra˜o. 2.3 Acesso aos elementos O Scilab da´ ao usua´rio va´rios modos de acesso aos vetores e matrizes. O mais simples deles e´ sim- plesmente digitando o nome do vetor/matriz criado. Caso voceˆ na˜o se lembre do que criou, use o comando whos. Ha´ duas formas de usar o comando whos: • whos(): Lista todas as func¸o˜es do Scilab, apresentando o nome da func¸a˜o, o tipo (constante, varia´vel, booleana, e assim por diante), o tamanho e os bytes usado para a func¸a˜o apresentada. • whos: Neste caso e´ preciso especificar o tipo de func¸a˜o que voceˆ deseja verificar (veremos um exemplo no final desta sec¸a˜o). --> A A 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Para acessar a matriz um elemento por vez, use pareˆnteses: --> v = [7; 19; 21]; -->v(2) ans 19. -->A(2,3) ans 7. -->A(3,2) 11 Matema´tica Matricial CAPI´TULO 2. A´LGEBRA LINEAR NUME´RICA ans 10. -->A(5,7) !--error 21 invalid index --> whos -type constant Name Type Size Bytes ans constant 1 by 1 24 v constant 3 by 1 40 A constant 3 by 4 112 %scicos_display_mode constant 1 by 1 24 %scicos_contrib constant 0 by 0 16 %nan constant 1 by 1 24 %inf constant 1 by 1 24 %eps constant 1 by 1 24 %io constant 1 by 2 32 %i constant 1 by 1 32 --> Note que se voceˆ tenta acessar elementos que na˜o existem, o programa reclama. Pore´m, a forma mais poderosa de acesso (e mais ra´pida) e´ usando o conceito de sub-matrizes. Para usarmos partes de matrizes em operac¸o˜es, usamos novamente o operador “ : ”. Suponha que criamos uma matriz do tipo: -->A = rand(6,6) A 0.0437334 0.7783129 0.8415518 0.5618661 0.3873779 0.2615761 0.4818509 0.2119030 0.4062025 0.5896177 0.9222899 0.4993494 0.2639556 0.1121355 0.4094825 0.6853980 0.9488184 0.2638578 0.4148104 0.6856896 0.8784126 0.8906225 0.3435337 0.5253563 0.2806498 0.1531217 0.1138360 0.5042213 0.3760119 0.5376230 0.1280058 0.6970851 0.1998338 0.3493615 0.7340941 0.1199926 Podemos trabalhar em partes isoladas da matriz. Experimente: -->A(2:4, 3:5) Descreva o que ocorreu. Naturalmente este processo pode ser usado para atribuic¸a˜o de matrizes (ou vetores). Pore´m, antes de executar, tente prever o resultado. -->A(3, 3:5) = [1 2 3] 2.4 Matema´tica Matricial Para executar operac¸o˜es alge´bricas matriciais, seguiremos os seguintes exemplos: 12 Matema´tica Matricial CAPI´TULO 2. A´LGEBRA LINEAR NUME´RICA Comandos Descric¸a˜o A (r,c) Fornece a sub-matriz A cujas linhas sa˜o definidas pelo vetor de ı´ndice r e cujas colunas sa˜o definidas pelo vetor c. A (r,:) Fornece a sub-matriz A cujas linhas sa˜o definidas pelo vetor de ı´ndice r e inclui todas as colunas. A (:,c) Fornece a sub-matriz A cujas colunas sa˜o definidas pelo vetor de ı´ndice c e inclui todas as linhas. A (:) Fornece todos os elementos de A em um vetor coluna, coluna a coluna. Tabela 2.3: Refereˆncia a sub-matrizes de uma matriz. --> A = rand(5, 3); //Exemplos de operacoes vetoriais/matriciais --> B = rand(3, 5); --> v1 = rand(5, 1); --> v2 = rand(1, 5); // soma, subtracao, multiplicacao e transposicao --> C = A*A’+B’*B --> D = A’*A*v1(1:3) --> E = v1 * v2 // operacoes elemento a elemento --> v3 = v1 + v2’ --> v4 = v1 .* v2’ --> v5 = v2 .^ 2 --> F = A .* B’ // sub-matrizes! --> G = C(2:4, 2:4) * v2(2:4)’ --> C(1:3, 2) = G Analise os resultados e certifique-se que entendeu o enderec¸amento das matrizes e vetores! Isto e´ muito importante!!! Observe a tabela 2.4. Operac¸o˜es com elementos Dados representativos de vetores e matrizes A = [a1 a2 . . . an] dados B = [b1 b2 . . . bn], c ∈ R Adic¸a˜o a escalar A+ c = [a1 + c a2 + c . . . an + c] Subtrac¸a˜o por escalar A− c = [a1 − c a2 − c . . . an − c] Multiplicac¸a˜o por escalar A ∗ c = [a1 ∗ c a2 ∗ c . . . an ∗ c] Divisc¸a˜o por escalar A/c = [a1/c a2/c . . . an/c] Soma de vetores A+B = [a1 + b1 a2 + b2 . . . an + bn] Multiplicac¸a˜o de vetores A. ∗B = [a1. ∗ b1 a2. ∗ b2 . . . an. ∗ bn] Divisa˜o de vetores pela direita A./B = [a1./b1 a2./b2 . . . an./bn] Divisa˜o de vetores pela esquerda B.\A = [a1./b1 a2./b2 . . . an./bn] Potenciac¸a˜o de vetores A.ˆc = [a1ˆc a2ˆc . . . anˆc] c.ˆA = [cˆa1 cˆa2 . . . cˆan] A.ˆB = [a1ˆb1 a2ˆb2 . . . anˆbn] Tabela 2.4: Operac¸o˜es ba´sicas aplicadas a elementos de vetores e matrizes. Tomando A = [ 1 2 3 3 2 1 ] , B = [ 4 5 6 6 5 4 ] , e c = 2 13 Uso de Scilab na Soluc¸a˜o de Sistemas Lineares: Me´todos DiretosCAPI´TULO 2. A´LGEBRA LINEAR NUME´RICA execute as operac¸o˜es apresentadas na Tabela 2.4. 2.5 Uso de Scilab na Soluc¸a˜o de Sistemas Lineares: Me´todos Diretos Considere o sistema Ax = b, associado a` matriz A e ao vetor b, definidos como segue: --> A = [ 3 -2 2; 1 1 1; 2 1 -1 ]; --> b = [ -3 -4 -3 ]’ Apresentamos a seguir algumas func¸o˜es definidas no Scilab relacionados a` Soluc¸a˜o de Sistemas Lineares – Me´todos Diretos. Mais informac¸o˜es podem ser obtidas pelo recurso help seguido da func¸a˜o de interesse (por exemplo, help lu mostra detalhes sobre o ca´lculo da decomposic¸a˜o LU de uma matriz quadrada). Para resolver o sistema acima, temos algumas maneiras: 1. Usando o operador \ : Este operador e´ interno ao Scilab e funciona de forma muito simples: --> x = A \ b // Calcula a solucao do sistema Ax = b (se existir!). 2. Outra forma e´ usando a Decomposic¸a˜o LU . Para obter a decomposic¸a˜o A = LU , e resolver o sistema a partir dela use: -->[ L, U ] = lu(A) --> y = L \ b --> x = U \ y Note que o Scilab na˜o confundiuU com u, o que indica que o programa e´ sensı´vel ao caso (maiu´sculas e minu´sculas). Repare tambe´m na forma como o Scilab retornou dois argumentos (L e U ) da func¸a˜o, o que e´ uma caracterı´stica incomum em linguagens de programac¸a˜o, pore´m corriqueira em linguagem nume´rica, como o Scilab. Tambe´m poderı´amos ter feito a operac¸a˜o de forma direta: --> x = U \ ( L \ b ) Ou ainda: --> [ L, U, P ] = lu(A) // Calcula a decomposicao LU de A Neste caso P e´ a matriz de permutac¸a˜o do pivoteamento usado no ca´lculo dos fatores L e U . A matriz P multiplicada por A tem o efeito das trocas de linhas efetuadas quando o pivoteamento e´ realizado. 3. Ca´lculo da func¸a˜o inversa da matriz A: Um Sistema Linear tem soluc¸a˜o u´nica se a matriz A for inversı´vel. Uma maneira de testar esta condic¸a˜o e´ usando a func¸a˜o inv(.) do Scilab: --> IA = inv(A) --> IA * A --> x = IA * b 4. Uma outra func¸a˜o do Scilab interessante e´ a que calcula o valor do determinante de uma matriz (det(.)): -->d = det(A) Pergunta: Qual a relac¸a˜o existente entre det(A) e det(U) ? 14 Exercı´cios CAPI´TULO 2. A´LGEBRA LINEAR NUME´RICA 2.6 Exerc´ıcios 1. Digite as seguintes matrizes no ambiente Scilab: A = 4 −32 1 0 6 , B = 1 2 42 4 1 0 1 5 , C = 58 7 (a) Mostre somente a segunda coluna de A; (b) Mostre o elemento (3, 2) de A; (c) Mostre somente a terceira coluna de B; (d) Mostre as duas primeiras colunas de B; (e) Mostre as duas u´ltimas linhas de A; 2. Considere as matrizes A, B e o vetor C do exercı´cio anterior. Defina uma nova matriz D com o mesmo conteu´do de A. Fac¸a a mudanc¸a ou execute a operac¸a˜o - solicitada: (a) Atribua ao elemento (1, 1) de D o valor 12; (b) Atribua ao elemento (3, 2) de D o valor −8; (c) Execute o comando E = [D C]. Descreva o conteu´do de E em termos de D e C; (d) Execute o comando F = [D B]. Descreva o conteu´do de F em termos de D e B; (e) Execute o comando G = [E; B]. Descreva o conteu´do de G em termos de E e B; 3. Para criar um vetor coluna no Scilab digita-se da seguinte maneira: [1; 2; 3]. Execute os co- mandos abaixo no Scilab: (a) Construa um vetor coluna c1 com elemen- tos: 0,−1, 3, 5; (b) Construa um vetor coluna c2 com elemen- tos: 4,−2, 0, 7; (c) Construa uma matriz H cujas colunas sa˜o c1 e c2 sem repetir a entrada dos elemen- tos; (d) Construa uma matriz K onde as duas pri- meiras colunas sa˜o compostas pelos ele- mentos de c1 e a terceira coluna com ele- mentos de c2. Novamente, execute o solici- tado sem repetir a entrada de dados. 4. Para criar um vetor linha fazemos: [1 2 3]. Exe- cute no Scilab os comandos abaixo: (a) Construa um vetor linha r1 com elementos 2,−1, 5. (b) Construa um vetor linha r2 com elementos 7, 9,−3 . (c) Construa uma matriz M cujas linhas sa˜o r1 e r2 sem repetir a entrada de dados feita anteiormente. (d) Descreva o resultado de: 3 · r1. (e) Descreva o resultado de: r1+ r2. (f) Descreva o resultado de: [r1; r1− r2; r2]. 5. Responda a`s questo˜es seguintes considerando a matriz abaixo. c = 1.1 −3.2 3.4 0.60.6 1.1 −0.6 3.1 1.3 0.6 5.5 0.0 (a) Qual o tamanho de c ? (b) Qual o valor de (2, 3) ? (c) Apresente todos os ı´ndices cujo valor seja 0.6. 6. Determine o tamanho das seguintes matrizes. Verifique suas respostas criando as matrizes no Scilab. (a) u = [10 20*(%i) 10+20]; (b) v = [-1; 20; 3]; (c) w = [1 0 -9; 2 -2 1; 1 2 3]; (d) x = [u’ v]; (e) y(3,3) = -7; (f) z = [zeros(4,1) ones(4,1) zeros(1,4)’]; (g) v(4) = x(2,1); 7. Qual o valor de w(2,1) ? 8. Qual o valor de x(2,1) ? 9. Qual o valor de y(2,1) ? 10. Qual o valor de v(3) apo´s a execuc¸a˜o da ex- pressa˜o (g)? 11. Considere a matriz do exercı´cio (1). Determine o conteu´do das seguintes submatrizes: (a) c(2,:) (b) c(6) (c) c(1:2, 2:4) (d) c([1,3],2) (e) c([2 2], [3 3]) 15 Exercı´cios CAPI´TULO 2. A´LGEBRA LINEAR NUME´RICA (f) c([2 2 2], [3 3 3]) (g) c([1 2 2], [3 3]) 12. Determine o conteu´do da matriz a apo´s a exe- cuc¸a˜o das seguintes declarac¸o˜es: (a) a = [1 2 3; 4 5 6; 7 8 9]; a([3 1], :) = a([1 3],:); (b) a = [1 2 3; 4 5 6; 7 8 9]; a([1 3], :) = a([2 2],:); (c) a = [1 2 3; 4 5 6; 7 8 9]; a([2 2],:); 13. Determine o conteu´do da matriz a apo´s a execuc¸a˜o das seguintes declarac¸o˜es: (a) a = eye(3,3); b = [1 2 3]; a(2,:) = b; (b) a = eye(3,3); b = [4 5 6]; a(:,3) = b’; (c) a = eye(3,3); b = [7 8 9]; a(3,:) = b([3 1 2]); 14. Resolva o seguinte sistema linear Ax = b, onde: aij = 1 i+ j − 1 , bi = 1 i , i, j = 1 : n use n = 5, 10 e 15. Voceˆ pode explicar os resultados? Observe que a soluc¸a˜o exata e´ (1, 0, 0, . . . , 0)t 15. Duas quantias de dinheiro x1 e x2 somam $600, 00. A quantia x1 e´ o dobro de x2. Resolva o sistema usando a func¸a˜o LU do Scilab. 16. Sa˜o investidos $8000, 00. Parte a 6% de taxa de juros e parte a 11% de taxa de juros. Quanto de- veria ser investido em cada modalidade se um to- tal de 9% e´ desejado ? Resolva o sistema usando a func¸a˜o LU do Scilab. Resposta: x1 = $3200, 00 para 6% e x2 = $4800, 00 para 9%. 17. Encontre a, b e c tais que o gra´fico do cı´rculo com equac¸a˜o x2 + y2 + ax + bx + c = 0 passe pelos pontos (1, 5), (4, 4) e (3.1). Resolva o sistema usando a func¸a˜o LU do Scilab. Resposta: a = −4, b = −6 e c = 5. 18. A quantia de $16500, 00 foi investida em treˆs con- tas, resultando um lucro anual de 5%, 8% e 10%, respectivamente. A quantia investida a 5% era igual a´ quantia investida a 8% mais o dobro da quantia investida a 10%. Quanto foi investido em cada conta se o total dos juros sobre o in- vestimento foi de $1085, 00 ? Resolva o sistema usando a func¸a˜o LU do Scilab. Resposta: $9500, 00 a 5%, $4500, 00 a 8% e $2500, 00 a 10%. 19. Encontre a, b e c tais que a equac¸a˜o da para´bola y = ax2+bx+c passe pelos pontos (1, 4), (−1, 6) e (2, 12). Resolva o sistema usando a func¸a˜o LU do Scilab. Resposta: a = 3, b = −1 e c = 2. 16 CAPI´TULO 3 Projeto de Programac¸a˜o Programar e´ fa´cil. Saber o que programar e´ difı´cil.a aCitac¸a˜o de [3]. Uma das caracterı´sticas da linguagem nume´rica e´ a facilidade com que o usua´rio cria seus pro´prios progra- mas. Apesar de simples, a linguagem nume´rica disponibiliza a maioria das estruturas das linguagens de programac¸a˜o convencionais. A diferenc¸a principal e´ que, na programac¸a˜o Scilab, na˜o ha´ necessidade da declarac¸a˜o pre´via dos tipos das varia´veis que sera˜o utilizadas ao longo do programa. As linguagens nume´ricas, como e´ o caso do Scilab, e´ um interpretador de comandos. Os programas escritos em linguagem nume´rica sa˜o executados em um tempo maior que os programas semelhantes escri- tos em linguagens compila´veis. Por outro lado, a vantagem de linguagens nume´ricas adve´m da facilidade de prototipac¸a˜o de programas e da disponibilidade de uma poderosa biblioteca de func¸o˜es gra´ficas. Neste propo´sito, abordaremos aqui a estrutura de programac¸a˜o em ambiente nume´rico, em especial, no ambiente Scilab. Na sec¸a˜o 3.1 sera˜o abordados os operadores relacionais e lo´gicos, na sec¸a˜o 3.2 a estrutura de Loop, na sec¸a˜o 3.3 a estrutura if (condicional) e na sec¸a˜o 3.4 a definic¸a˜o de manipulac¸a˜o de func¸o˜es em ambiente Scilab. 3.1 Operadores Relacionais e Lo´gicos Ale´m das operac¸o˜es matema´ticas convencionais, o Scilab tambe´m inclui operac¸o˜es relacionais e lo´gicas, cuja finalidade e´ o de fornecer respostas do tipo verdadeiro ou falso a perguntas, usadas em estruturas de Loops e condicionais. No ambiente Scilab, a resposta para expresso˜es lo´gicas produzem T se a resposta e´ verdadeira (true) e F se a resposta for falsa (false)1. 3.1.1 Operadores Relacionais Os operadores relacionais do Scilab incluem todas as comparac¸o˜es habituais esa˜o listados na Tabela 3.1. Atenc¸a˜o: Os sı´mbolo = e == teˆm significados diferentes! O sı´mbolo == compara duas varia´vies e retorna T se forem iguais e F se forem diferentes; o sı´mbolo = e´ usado para atribuir o resultado de uma operac¸a˜o a uma varia´vel. Os operadores relacionais do Scilab podem ser usados para comparar dois vetores de mesmo tamanho ou para comparar vetores com escalar (ou ainda, escalar com escalar). Interprete os comandos abaixo: 1Em outros ambientes de programac¸a˜o a reposta para uma sentenc¸a verdadeira e´ 1 e 0 para uma resposta falsa. Operadores Relacionais e Lo´gicos CAPI´TULO 3. PROJETO DE PROGRAMAC¸A˜O Operador Descric¸a˜o < Menor que <= Menor ou igual a > Maior que >= Maior ou igual a == Igual a <> ou ~= Diferente de Tabela 3.1: Operadores relacionais. --> A = 1:9 --> B = 10 - A --> vf = (A==B) --> vf = (A~=B) --> vf = A >= 4 --> vf = A < 4 Observe tambe´m que o teste de igualdade a`s vezes produz resultados confusos para operac¸o˜es em ponto flutuante. Execute as operac¸o˜es abaixo. -->vf = (-0.08 + 0.5 - 0.42) == (0.5 - 0.42 -0.08) -->vf = (-0.08 + 0.5 - 0.42) ~= (0.5 - 0.42 -0.08) -->vf = (-0.08 + 0.5 - 0.42) - (0.5 - 0.42 -0.08) E´ possı´vel combinar expresso˜es relacionais com expresso˜es matema´ticas: --> B = 9 - A; --> B = B + (B==0)*(%eps) e´ uma maneira de substituir os elementos iguais a zero em um vetor pelo nu´mero %eps2. Essa expressa˜o em particular e´, algumas vezes, u´til para evitar a divisa˜o por zero, como segue no exemplo abaixo. --> x = (-3:3)/3 --> y = ones( x ) --> vf = x ~= 0 // encontra posicoes com valores nao-nulos --> y(vf) = sin( x(vf) )./x( vf ) // trabalha apenas com valores nao-nulos 3.1.2 Operadores Lo´gicos Os operadores lo´gicos permitem que se combinem ou se neguem expresso˜es relacionais. Os operadores lo´gicos do Scilab sa˜o dados na Tabela 3.2. Operador Descric¸a˜o & E | OU ~ NA˜O Tabela 3.2: Operadores lo´gicos. --> A = 1:9; --> vf = A > 4 // Encontra o que e maior que 4 --> vf = ~(A>4) // Nega o resultado anterior --> vf = (A > 2) & (A < 6) // Retorna T para valores maior que 2 e menor que 6 --> vf = (A < 3) | (A > 5) // Retorna T para valores menor que 3 ou para valores maior que 5 2O nu´mero %eps, em Scilab, e´ a menor diferenc¸a entre dois nu´meros que e´ possı´vel representar. 18 O Loop for e while CAPI´TULO 3. PROJETO DE PROGRAMAC¸A˜O 3.2 O Loop for e while O loop for possibilita que uma se´rie de comandos seja repetida por um nu´mero de vezes fixo e pre´- determinados. A forma geral do loop for e´: for x = vetor comandos ... end Os comandos entre as instruc¸o˜es for e end sa˜o executados uma vez para cada coluna de vetor. A cada iterac¸a˜o, atribui-se a x a pro´xima coluna de vetor, isto e´, durante o n-e´simo ciclo do loop temos que x = vetor(:,n). --> for n = 1:10 --> x(n) = cos( n*(%pi)/10 ); --> end --> x Traduzindo, a primeira instruc¸a˜o diz: “para n igual a 1 ate´ 10, calcule todas as instruc¸o˜es ata´ a pro´xima instruc¸a˜o de end”. No primeiro ciclo de for, n = 1, no segundo, n = 2, e assim por diante, ate´ n = 10. Depois do ciclo para n = 10, o loop for termina e os comandos apo´s a instruc¸a˜o end sa˜o executados e as componentes de x sa˜o apresentados, conforme o exemplo acima. Naturalmente, pode-se inserir um loop for dentro do outro, sucessivamente, tantos quantos desejados: --> for n = 1:5 --> for m = 5:-1:1 --> A(n,m) = n^2 + m^2; --> end --> disp(n) --> end --> A Uma maneira de tornar um programa mais eficiente e´ atrave´s da pre´-alocac¸a˜o de memo´ria. Ou seja, os vetores devem ser pre´-alocados antes de um loop for (ou while) seja executado. Por exemplo: --> x = zeros(1,10); // memoria pre-alocacao para x --> for n = 1:10 --> x(n) = cos( n*(%pi)/10 ); --> end --> x No primeiro caso, todas as vezes que os comandos dentro do loop for sa˜o executados, o tamanho da varia´vel x e´ incrementada de 1. Isso forc¸a o Scilab a gastar tempo para alocar mais memo´ria para x todas as vezes que o loop e´ percorrido. Ao contra´rio do loop for, que executa um grupo de comandos um nu´mero fixo de vezes, o loop while executa um grupo de comandos um nu´mero indefinido de vezes, ate´ que uma certa condic¸a˜o seja satisfeita. A forma geral do loop while e´: while CONDICAO comandos ... end Os comandos ... entre as instruc¸o˜es while e end sa˜o executados enquanto TODOS os elementos de CONDICAO forem verdadeiros. 19 Estrutura if CAPI´TULO 3. PROJETO DE PROGRAMAC¸A˜O --> num = 0; EPS = 1; --> while (1+EPS) > 1 --> EPS = EPS/2; --> num = num + 1; --> end --> num --> EPS = EPS*2 Nesse exemplo, EPS comec¸a em 1. Enquanto (1+EPS) > 1 for verdadeiro, os comandos dentro do loop while sa˜o executados. Uma vez que EPS e´ continuamente divivido em dois, em algum momento ele se tornara´ ta˜o pequeno que, somando-se EPS a 1, esse resultado sera´ menor (ou igual) que 1. Nesse momento, (1+EPS) > 1 torna-se falso e o loop while termina. Finalmente, multiplica-se EPS por 2 porque a u´ltima divisa˜o por 2 o tornou pequeno demais. 3.3 Estrutura if Em diversas situac¸o˜es, as sequ¨eˆncias de comandos teˆm de ser executadas condicionalmente, com base em um teste relacional. Nas linguagens de programac¸a˜o, essa lo´gica e´ implementada por meio de uma das diversas formas de estrutura if-else-end, cuja estrutura mais simples e´: if expressao comandos ... end Os comandos ... entre as func¸o˜es if e end sa˜o executados se todos os elementos na expressao forem verdadeiros. Nos casos em que expressao envolve muitas subexpresso˜es lo´gicas, apenas as subexpresso˜es necessa´rias para determinar o valor lo´gico da expressao sa˜o executadas. Por exemplo, se expressao e´ (expressao1 | expressao2), enta˜o expressao2 e´ executada somente se expressao1 for falsa. Da mesma maneira, se expressao e´ (expressao1 & expressao2), enta˜o expressao2 so´ e´ executada se expressao1 for verdadeira. Considere o seguinte exemplo: --> peras = 10; // numero de peras --> custo = peras*25 // custo de peras --> if peras > 5 // fonece 20% de desconto em compras maiores --> custo = (1 - 20/100)*custo; --> end --> custo Nos casos em que ha´ duas alternativas, a estrutura if-else-end passa a ser: if expressao comandos executados se verdadeira else comandos executados se falsa end Aqui, o primeiro grupo de comandos e´ executado se expressao for verdadeira; o segundo grupo e´ executado se expressao for falsa. Quando houver treˆs ou mais alternativas, a estrutura if-else-end toma a forma: 20 Definic¸a˜o de Func¸o˜es CAPI´TULO 3. PROJETO DE PROGRAMAC¸A˜O if expressao1 comandos executados se expressao1 for verdadeira elseif expressao2 comandos executados se expressao2 for verdadeira elseif expressao3 comandos executados se expressao3 for verdadeira ... else comandos executados se nenhuma outra expressao for verdadeira end Nessa u´ltima forma, somente os comandos associados a` primeira expressa˜o verdadeira encontradas sa˜o exe- cutados; as expresso˜es relacionais seguintes na˜o sa˜o testadas e o resto da extrutura if-else-end e´ ignorada. Ale´m disso, n~ao e´ necessa´rio que o comando final else esteja presente. Por fim, vamos ver uma maneira possı´vel de interromper ou sair de loops for e while. --> num = 0; EPS = 1; --> for num = 1:1000 --> EPS = EPS/2; --> if (1+EPS) <= 1 --> EPS = EPS*2 --> break --> end // if --> end // for --> num Note que, o loop for executaria um grande nu´mero de vezes. A estrutura if-else-end testa; quando EPS fica suficiente pequeno, o comando break forc¸a o loop for a terminar prematuramente. Desenvolva um programa em Scilab para encontrar as raı´zes de uma equac¸a˜o do tipo ax2 +bx+c = 0. 3.4 Definic¸a˜o de Func¸o˜esUma func¸a˜o obedece a uma estrutura da forma: function [y1, y2, ..., yn] = foo(x1, x2, ..., xm) instrucao_1 instrucao_2 ... instrucao_p endfunction onde foo e´ o nome da func¸a˜o, xi, para i = 1, 2, ..., m, sa˜o os seus argumentos de entrada, yj, para j = 1, 2, ..., n sa˜o argumentos de saı´da e instrucao i, para i = 1, 2, ..., p, representa a sequ¨eˆncia de instruc¸o˜es que devem ser executados pela func¸a˜o. Toda func¸a˜o no Scilab e´ executada chamando seu nome seguido de seus argumentos. No exemplo, a func¸a˜o foo e´ executada atrave´s do comando: --> foo(x1, x2, ..., xm) Como pode ser observado, uma func¸a˜o possui uma estrutura pre´-determinada. As principais caracterı´sticas de uma func¸a˜o sa˜o: 21 Definic¸a˜o de Func¸o˜es CAPI´TULO 3. PROJETO DE PROGRAMAC¸A˜O • As varia´veis definidas na func¸a˜o, chamadas de varia´veis locais, na˜o permanecem no ambiente Scilab apo´s a execuc¸a˜o da func¸a˜o; • As entradas e saı´das do programa sa˜o claramente definidas, e • Uma func¸a˜o, apo´s ser definida, pode ser chamada a qualquer tempo. Uma func¸a˜o pode ser criada usando um dos seguintes procedimentos: 1. Digitando no pro´prio ambiente, --> Digitando uma funcao no ambiente Scilab --> function[y1, y2] = exemplo(x1, x2) --> // Entrada: x1, x2 --> // Saida: y1, y2 --> y1 = x1 + x2 --> y2 = x1 * x2 --> endfunction --> [a, b] = exemplo(2, 3) 2. Usando o comando deff, --> Usando deff --> deff(’[y1, y2] = exemplo(x1, x2)’, ’y1 = x1 + x2, y2 = x1 * x2’) --> [a, b] = exemplo(3, 4) 3. Digitando o texto da func¸a˜o em um arquivo e, em seguida, carregando esse arquivo no ambiente Scilab. Por convenc¸a˜o, as func¸o˜es definidas pelo usua´rio possuem extensa˜o sci e sa˜o carregadas no ambiente Scilab atrave´s do comando: --> exec(’nome_do_arquivo_de_comandos.sce’) 22 Exercı´cios CAPI´TULO 3. PROJETO DE PROGRAMAC¸A˜O 3.5 Exerc´ıcios 1. Assuma que a, b, c e d sejam conforme dado, e avalie as seguintes expresso˜es a seguir. a = 20; b = -2; c = 0; d = 1; (a) a > b; (b) b > d; (c) a > b & c > d; (d) a == b; (e) a & b > c; (f) ~~b. 2. Assuma que a, b, c e d sejam conforme dado, e avalie as seguintes expresso˜es a seguir. a = 2; b = [1 -2; 0 10]; c = [0 1; 2 0]; d = [-2 1 2; 0 1 0]; (a) ~(a > b); (b) a > c & b > c; (c) c <= d. 3. Assuma que a, b, c e d sejam conforme dado. Explique a ordem de avaliac¸a˜o de cada uma das seguintes expresso˜es, e especifique os resultados em cada caso. a = 2; b = 3; c = 10; d = 0; (a) a*b^2 > a*c; (b) d | b > a. 4. O custo de enviar um pacote por Sedex e´ de $10,00 para o primeiro quilo e $3,75 para cada quilo acima. Se o pacote pesar mais de 35 quilos, uma taxa de peso adicional de $10,00 e´ adicionada ao custo. Nenhum pacote com mais de 50 quilos e´ aceito. Escreva um programa que aceite o peso do pacote em quilos e calcule o custo de enviar o pacote. Inclua o caso dos pacotes acima do peso. 5. Escreva um programa para calcular a func¸a˜o f(x, y) para quaisquer dois valores reais, dado pelo usua´rio para x e y, como segue: f(x, y) = x+ y x ≥ 0 e y ≥ 0 x+ y2 x ≥ 0 e y < 0 x2 + y x < 0 e y ≥ 0 x2 + y2 x < 0 e y < 0 6. Examine os lac¸os for a seguir e determine quantas vezes cada lac¸o sera´ executado. (a) for index = 7:10 (b) for jj = 7:-1:10 (c) for index = -10:3:-7 (d) for kk = [0 5; 3 3] 7. Examine os lac¸os a seguir e determine o valor em ires no final de cada um. (a) ires = 0; for index = 1:10 ires = ires + 1; end (b) ires = 0; for index = 1:10 ires = ires + index; end (c) ires = 0; for index1 = 1:10 for index2 = index1:10 if index2 == 6 break; end 23 Exercı´cios CAPI´TULO 3. PROJETO DE PROGRAMAC¸A˜O ires = ires + 1; end end (d) Calcule os valores da func¸a˜o: f(t) = { sen(t) ∀t tal que sen(t) > 0 0 caso contra´rio para −6pi < t < pi com intervalos de pi/10. 8. O n-e´simo nu´mero de Fibonacci e´ definido pelas equac¸o˜es recursivas abaixo: f(1) = 1 f(2) = 2 f(n) = f(n− 1) + f(n− 2) Portanto, f(3) = f(2)+f(1) = 2+1 = 3 e assim por diante, para nu´meros maiores. Escreva um programa fib.sci para calcular e imprimir o n-e´simo nu´mero de Fibonacci para n > 2, onde n e´ fornecido pelo usua´rio. 9. Uma matriz An×n e´ dita diagonalmente dominante se |aii| > n∑ j 6=i |aij |, i = 1 : n Escreva uma func¸a˜o que, dada uma matriz qualquer n× n, retorne T se a matriz for diagonalmente domi- nante e F caso contra´rio. P.S.: O comando read, como mostra o exemplo que segue, AB = read(’nome do arquivo.txt’, no de linhas, no de colunas)), leˆ um arquivo de dados para execuc¸a˜o no ambiente Scilab, onde AB e´ a varia´vel que conte´m a matriz. 10. A localizac¸a˜o de um ponto em um plano cartesiano pode ser expressa por coordenadas retangulares (x, y) ou coordenadas polares (r, θ). A relac¸a˜o entre esses dois conjuntos de coordenadas e´ dada por estas equac¸o˜es: x = r cos θ y = r sin θ r = √ x2 + y2 θ = tg−1 ( y x ) Escreva duas func¸o˜es, rect2polar e polar2rect, que convertam coordenadas de retangular para po- lar e vice-versa, com o aˆngulo θ expresso em graus. x y r x y θ 11. O me´todo da bissecc¸a˜o serve para o ca´lculo apropriado de raı´zes de equac¸o˜es do tipo f(x) = 0, com f : R→ R. O me´todo e´ bastante simples: dado um intervalo inicial [a, b] contendo uma raiz, divide-se este intervalo ao meio. Por exemplo, m = (a + b)/2. Temos agora dois intervalos: [a,m] e [m, b]. Daı´ basta continuar o processo ate´ a precisa˜o desejada. Assim: (a) Encontre as raı´zes de f(x) = x3 − 2x− 5 = 0. 24 Exercı´cios CAPI´TULO 3. PROJETO DE PROGRAMAC¸A˜O (b) Calcule as raı´zes negativas de P (x) = x3 − 3x2 − 6x+ 8 = 0, com � ≥ 0.05 (erro absoluto) que esta´ no intervalo [−3.83,−0.62]. 12. Um sistema linear pode ser dado por: a11x1 + a12x2 + . . . + a1nxn = b1 a21x1 + a22x2 + . . . + a2nxn = b2 ... ... . . . ... ... an1x1 + an2x2 + . . . + annxn = bn na forma matricial como Ax = b, ou ainda: x1 = b1 − n∑ j=2 a1jxj /a11 ... xi = bi − n∑ j 6=i aijxj /aii ... xn = bn − n−1∑ j=1 anjxj /ann (3.1) O me´todo de Gauss-Seidel e´ um processo que usa a forma (3.1), a partir de uma soluc¸a˜o inicial e atualiza os valores de x ate´ obter uma precisa˜o requerida. Esta atualizac¸a˜o usa as componentes que esta´ sendo calculada. Assim, o valor rece´m calculado para x(k+1)1 sera´ usado no ca´lculo de x (k+1) 2 . O Algoritmo 1 mostra os passos deste me´todo. Dado n, An×n, bn×1 e x (0) n×1, max, � 1: Para k = 0 ate´ k = max fac¸a 2: Para i = 1 ate´ i = n fac¸a 3: x(k+1)i = 1 aii bi − i−1X j=1 aijx (k+1) j − nX j=i+1 aijx (k) j ! 4: Se max 1≤i≤n ˛˛˛ x (k+1) i − x(k)i ˛˛˛ < � ou ˛˛˛ x (k+1) i − x(k)i ˛˛˛ ˛˛˛ x (k+1) i ˛˛˛ < � enta˜o 5: x = x(k+1) 6: else 7: Se k = max enta˜o 8: PARE: na˜o houve convergeˆncia. 9: Fim do condicional 10: Fim do condicional 11: Fim do lac¸o 12: Fim do lac¸o Algoritmo 1: Me´todo de Gauss-Seidel Implemente o me´todo de Gauss-Seidel e resolva o sistema: 5 2 0 −1 1 8 −3 2 0 1 6 1 1 −1 2 9 x1 x2 x3 x4 = 6 10 −5 0 25 Exercı´cios CAPI´TULO 3. PROJETO DE PROGRAMAC¸A˜O com � < 10−3 e max = 50. Antes de iniciar o algoritmo acima, verifique se o sistema e´ diagonalmente dominante, usando a func¸a˜o implementada no exercı´cio 9 (usando o Scilab, e´ claro!). 13. Equilibrar a reac¸a˜o quiı´mica: KMnO2 + H2SO4 + NaNO2 → K2SO4 + MnSO4 + NaNO3 + H2O. Modelagem Matema´tica O balanceamento de uma equac¸a˜o quı´mica e´ baseada na lei de conservac¸a˜o da massa de Lavoisier: Em um sistema quı´mico isolado, a massa permanente conservante, quaisquer que sejam as transformac¸o˜es que nele seprocessem. A lei de Lavoisier tambe´m pode ser expressa na forma: Em uma reac¸a˜o quı´mica, a soma das massas dos reagentes e´ igual a` soma das massas dos produtos resultantes. Conclui-se, enta˜o, que os elementos teˆm de estar nos dois membros da equac¸a˜o em igual quantidade. O me´todo alge´brico de balanceamento consiste em atribuir coeficientes literais xi a`s substaˆcias que apa- recem na equac¸a˜o, os quais constituem as inco´gnitas. Aplicando a lei de Lavoisier e comparando os ele- mentos membro a membro, constro´i-se um sistema de equac¸o˜es alge´bricas lineares, onde as inco´gnitas sa˜o os coeficientes estequiome´tricos xi da reac¸a˜o quiı´mica. Se houver mais inco´gnitas do que equac¸o˜es, atribui-se um valor arbitra´rio a uma delas: x1 KMnO2 + x2 H2SO4 + x3 NaNO2 → x4 K2SO4 + x5 MnSO4 + x6 NaNO3 + x7 H2O A Tabela 3.3 sistematiza a equac¸a˜o acima. K: x1 = 2x4 Mn: x1 = x5 O: 2x1 + 4x2 + 2x3 = 4x4 + 4x5 + 3x6 + x7 H: 2x2 = 2x7 S: x2 = x4 + x5 Na: x3 = x6 N: x3 = x6 Tabela 3.3: Transformac¸a˜o da equac¸a˜o quı´mica em equac¸o˜es. Como as duas u´ltimas expresso˜es sa˜o iguais, elimina-se uma delas. Deste modo, tem-se um sistema linear com 6 equac¸o˜es e 7 inco´gnitas. Atribuindo um valor arbitra´rio a uma delas, por exemplo, x7 = 1, obte´m-se o seguinte sistema linear de ordem 6: 1 0 0 −2 0 0 1 0 0 0 −1 0 2 4 2 −4 −4 −3 0 2 0 0 0 0 0 1 0 −1 −1 0 0 0 1 0 0 −1 x1 x2 x3 x4 x5 x6 = 0 0 1 2 0 0 (a) Resolva o sistema acima usando a func¸a˜o LU do Scilab e com o me´todo de Gauss-Seidel imple- mentado (fac¸a a troca de linhas necessa´rias para a melhor execuc¸a˜o deste me´todo). (b) Compare as soluc¸o˜es obtidas em relac¸a˜o a precisa˜o de cada me´todo. (c) Fac¸a uma ana´lise do resultado obtido. 26 CAPI´TULO 4 Gra´ficos no Scilab Comec¸amos aqui a explorar alguns dos recursos gra´ficos bi-dimensionais do ambiente Scilab. Informac¸o˜es mais detalhadas sobre todos os comandos disponı´veis na biblioteca gra´fica do Scilab (acessem o help). 4.1 A Janela Gra´fica do Scilab Todas as saı´das gra´ficas de comandos do Scilab sa˜o apresentadas em uma janela gra´fica. Note que, esta janela tem um menu horizontal com quatro opc¸o˜es: 1. File: possui oito sub-opc¸o˜es que permitem manipular arquivos relacionados com gra´ficos gerados: New Figure, Load, Save, Export to, Copy to clipboard, Page Setup, Print e Close. 2. Tools: apresenta quatro sub-opc¸o˜es de mobilidade da figura gerada, que sa˜o: Show/Hide Toolbar, que habilita um menu de atalhos para as demais opc¸o˜es desta pasta, como descrito abaixo. • Zoom: permite a ampliac¸a˜o de uma parte do gra´fico. Escolhendo esta opc¸a˜o e delimitando uma a´rea, a parte do gra´fico dentro da a´rea escolhida sera´ expandida. • UnZoom: desfaz as manipulac¸o˜es realizadas atrave´s da opc¸a˜o Zoom. • 3D Rot.: permite efetuar rotac¸o˜es em gra´ficos bi-dimensionais e tri-dimensionais. 3. Edit: possui nove sub-opc¸o˜es que permite manipular o gra´fico gerado: Select as current figure, Redraw figure, Clear Figure, Figure Properties, Axes Properties, Start Entity Picker, Stop Entity Picker, Start datatip manager e Stop datatip manager. 4. ?: mostra duas opc¸o˜es de ajuda: Scilab Help e About Scilab. No Scilab, gra´ficos sucessivos sa˜o sobrepostos em uma janela gra´fica. Para evitar que isto ocorra, podemos utilizar o comando clf(). Estes comando limpa a janela gra´fica. As janelas gra´ficas podem ser manipuladas atrave´s da func¸a˜o scf(). Por exemplo: --> // Manipulacao de janelas graficas --> scf(0) // Acesso a janela grafica 0 (default) --> scf(1) // Acesso a janela grafica 1 4.2 Gra´ficos Bi-dimensionais Gra´ficos bi-dimensionais podem ser gerados atrave´s da utilizac¸a˜o da func¸a˜o plot2d(). A forma mais simples desta func¸a˜o e´: Gra´ficos Bi-dimensionais CAPI´TULO 4. GRA´FICOS NO SCILAB --> plot2d( [ x ], y ) onde x e y podem ser matrizes ou vetores reais. Os colchetes [ e ], envolvendo x indicam que este paraˆmetro e´ opcional. Vejamos algumas considerac¸o˜es sobre este paraˆmetros: 1. Se x e y sa˜o vetores, a func¸a˜o plot2d() permite trac¸ar o gra´fico de y em func¸a˜o de x. E´ importante observar que os dois vetores devem ter a mesma dimensa˜o, isto e´, os dois vetores devem ter o mesmo nu´mero de elementos. 2. Se x e´ um vetor e y e´ uma matriz, a func¸a˜o plot2d() permite trac¸ar o gra´fico de cada coluna da matriz y em func¸a˜o de x. Neste caso, o nu´mero de elementos das colunas da matriz deve ser igual ao nu´mero de elementos do vetor x. 3. Se x e y sa˜o matrizes, a func¸a˜o plot2d permite trac¸ar o gra´fico de cada coluna da matriz y em func¸a˜o de cada coluna da matriz x. Neste caso, as matizes devem ter as mesmas dimenso˜es. 4. Se y e´ um vetor, a func¸a˜o plot2d() permite trac¸ar o gra´fico do vetor y em func¸a˜o do vetor [1:size(y)]. 5. Se y e´ uma matriz, a func¸a˜o plot2d() permite trac¸ar o gra´fico da matriz y em func¸a˜o do vetor [1:size(y)]. Vamos apresentar exemplos de gra´ficos gerados para cada uma das opc¸o˜es de entrada x, y apresentados anteriormente. Os gra´ficos sera˜o gerados no intervalo [0, 2pi], com incremento 0.1. As atividades abaixo podem ser feitas no Scipad ou diretamente no ambiente Scilab. --> // Item 1: x = vetor, y = vetor --> x = [ 0:0.1:2*%pi ]; // Definindo o vetor das abcissas, x --> y = sin( x ); --> // x e y devem ter a mesma dimensao!!!!!!!! --> size( x ) --> size( y ) --> plot2d( x, y ) --> // Item 2: x = vetor, y = matriz --> clf() // Limpa a tela grafica - evitar sobreposicao --> Y = [ sin( x )’ cos( x )’ ]; // Definindo a matriz Y --> size (Y) // Observar que a matriz Y possui 63 elementos em cada coluna --> plot2d( x, Y ) --> // Item 3: x = y = matrizes --> clf() --> clear --> t = [ 0:0.1:2*%pi ] // Definindo uma variavel auxiliar --> X = [ t’ t’ ] // Criando a matriz X --> size( X ) // A matriz X possui 63 elementos em cada coluna --> Y = [ cos( t’ ) sin( t’ ) ]; --> size( Y ) // A matriz Y possui 63 elementos em cada coluna --> plot2d( X, Y ) --> // Item 4: y = vetor (sem x explicito) --> clf() --> x = [ 0:0.1:2*%pi ]; --> plot2d( sin( x ) ) 28 Gra´ficos Bi-dimensionais CAPI´TULO 4. GRA´FICOS NO SCILAB --> // Item 5: Y = matriz (sem x explicito) --> clf() --> plot2d( Y ) Verifique que, apo´s a execuc¸a˜o de cada gra´fico, limpamos a tela atrave´s do comando clf(), para evitar que o pro´ximo gra´fico se sobreponha ao anterior. Vejamos agora alguns comandos para melhorar a sua janela gra´fica: • xtitle( titulo ): acrescenta o tı´tulo em cada um dos gra´ficos gerados, cujo argumento e´ uma string. • xsetech( [ x, y, largura, altura] ): Sub-divide a janela gra´fica do Scilab. A janela gra´fica e´ definida com largura e altura iguais a 1 e com o seu sistema de refereˆncias com origem (0, 0) no canto superior esquerdo da janela. O eixo x possui valores crescentes para a direita e o eixo y possui valores crescentes para baixo. Ambos os eixos possuem valores ma´ximos iguais a 1. Vamos re-escrever os comandos acima dentro do Scipad (graf 2d.sci) usando os comandos xtitle() e xsetech(). clear // Limpar a memoria do Scilab clf() // Limpar a janela grafica // Item 1: x = vetor, y = vetor x = [ 0:0.1:2*%pi ]; // Definindo o vetor das abcissas, x y = sin( x ); // xsetech( [abcissa, ordenada, largura, altura] ) do grafico xsetech( [0, 0, 0.3, 0.5] ); xtitle(‘‘Item 1’’); plot2d( x, y ) // Item 2: x = vetor, y = matriz Y = [ sin( x )’ cos( x )’ ]; // Definindo a matriz Y xsetech( [0.35, 0, 0.3, 0.5] ); xtitle(‘‘Item 2’’); plot2d( x, Y ) // Item 3: x = y = matrizes clear t = [ 0:0.1:2*%pi ] // Definindo uma variavel auxiliar X = [ t’ t’ ] // Criando a matriz X Y = [ cos( t’ ) sin( t’ ) ]; xsetech( [0.7, 0,0.3, 0.5] ); xtitle(‘‘Item 3’’); 29 Gra´ficos Bi-dimensionais CAPI´TULO 4. GRA´FICOS NO SCILAB plot2d( X, Y ) // Item 4: y = vetor (sem x explicito) x = [ 0:0.1:2*%pi ]; xsetech( [0, 0.5, 0.5, 0.5] ); xtitle(‘‘Item 4’’); plot2d( sin( x ) ) // Item 5: Y = matriz (sem x explicito) xsetech( [0.5, 0.5, 0.5, 0.5] ); xtitle(‘‘Item 5’’); plot2d( Y ) A forma geral da func¸a˜o plot2d() inclui um terceiro argumento: plot2d( [x], y, <opt args> ), onde <opt args> e´ uma sequ¨eˆncia de opc¸o˜es que determinam as caracterı´sticas do gra´fico bi-dimensional: < opt args > := opcao1 = valor1, opcao2 = valor2, . . . , opcaon = valorn As opc¸o˜es podem ser: • style: e´ utilizada para especificar o padra˜o da curva (ou curvas) que esta˜o sendo trac¸adas. O valor associado a` essa opc¸a˜o dever ser um vetor com valores inteiros positivos ou negativos. Se o valor for positivo, a curva e´ contı´nua e defina-se a cor da curva trac¸ada. Se o valor for negativo ou zero, a curva sera´ desenhada usando marcadores. • logflag: define a escala, logarı´tmica ou linear, a ser utilizada nos eixos x e y do gra´fico. Os valores associados a` essa opc¸a˜o sa˜o strings, “nn”, “nl”, “ln” ou “ll”, onde l indica a escala logarı´tmica, n a escala normal, na sequ¨eˆncia xy. O valor padra˜o desta opc¸a˜o e´ “nn”, isto e´, escala normal com graduac¸a˜o normal dos eixos (omite-se esta opc¸a˜o). • rect: e´ utilizada para estabelecer os limites do gra´fico. O valor associado a` essa opc¸a˜o um vetor real com quatro entradas [xmin, ymin, xmax, ymax], onde xmin, xmax, ymin e ymax indicam os valores mı´nimos e ma´ximos para os eixos x e y, respectivamente. • frameflag: e´ utilizada para controlar a escala dos eixos coordenados. O valor associado a` essa opc¸a˜o e´ um nu´mero inteiro entre 0 e 8, inclusive. • axesflag: especifica como os eixos sera˜o trac¸ados. O valor associado a` essa opc¸a˜o e´ um nu´mero inteiro entre 0 e 5, inclusive; • leg: permite definer as legendas das curvas. O valor associado a` esse paraˆmetro e´ uma string de carac- teres para cada gra´fico trac¸ado. Um exemplo com estas opc¸o˜es e´ apresentado a seguir (opt plot.sci). --> x = [ -%pi:0.1:%pi ] --> y = [ sin(x)’ cos(x)’ ] --> plot2d( x, y, style = [2, -1], rect = [-%pi, -1.5, %pi, 1.5], ... --> axesflag = 5, leg = ‘‘sen( x )@cos( x )’’ ) Uma maneira de trac¸ar gra´ficos bidimensionais polares e´ usando a func¸a˜o polarplot(rho, theta, <opt args>), como segue no exemplo a seguir (cardeoide.sce). 30 Gra´ficos Bi-dimensionais CAPI´TULO 4. GRA´FICOS NO SCILAB clear clf() xsetech([0, 0, 0.5, 0.5]) t = linspace(0, 2*%pi); a = 2; r = a*(1 + cos(t)); polarplot(t,r, 5) xtitle(’Cardeoide’) xsetech([0.5, 0, 0.5, 0.5]) a = 0.25; t = linspace(-(%pi)/4, (%pi)/4, 80); r1 = a*sqrt( cos(2*t) ); r2 = -( a* sqrt( cos(2*t) ) ); polarplot([t, t], [r1, r2], 22) xtitle(’Lemniscata de Bernoulli’) xsetech([0, 0.5, 0.325, 0.5]) t = linspace(-2*%pi, 2*%pi); a = 1; x = a*(t - sin(t)); y = a*(1 - cos(t)); plot2d(x, y, 2, frameflag = 3, rect = [-6.2, -0.1, 6.2, 2.1]) xtitle(’Cicloide’) xgrid(3) xsetech([0.325, 0.5, 0.325, 0.5]) t = linspace(0, 2*%pi); a = 2; x = a*( cos(t) + t.*sin(t) ); y = a*( sin(t) - t.*cos(t) ); plot2d(x, y, 5, frameflag = 3, rect = [-10, -15, 4, 10]) xgrid(2) xtitle(’Evolvente da circunferencia’) xsetech([0.65, 0.5, 0.35, 0.5]) 31 Gra´ficos Bi-dimensionais CAPI´TULO 4. GRA´FICOS NO SCILAB a = 2; t = linspace(-4*%pi, 4*%pi); x = (3*a*t)./(1 + t^3); y = (3*a*(t^2))./(1 + t^3); plot2d(x, y, 2) xgrid(3) xtitle(’Folio de Descartes’) O comando plot2d() apresenta algumas variac¸o˜es, como apresentado na Tabela 4.1. Comando Tipo de Gra´fico plot2d2() gra´ficos 2-D linearizados. plot2d3() gra´ficos 2-D com barras verticais. plot2d4() gra´ficos 2-D com setas. Tabela 4.1: Variac¸o˜es do comando plot2d. Uma outra maneira de gerar gra´ficos bi-dimensionais e´ usando o comando fplot2d() (graf fplot.sci). Consulte o help do Scilab para maiores detalhes. --> clear --> clf() --> deff( ’y = f(x)’, ’y = sin(x)’ ) --> x = linspace( -%pi, %pi ) --> fplot2d( x, f ) --> xgrid(2) 4.2.1 Outros Comandos Existem comandos que podem ser utilizados para melhorar a apresentac¸a˜o de um gra´fico (dem subplot.sci). Dentre eles, destacamos: • xgrid(): coloca uma grade em um gra´fico bi-dimensional; • titlepage: coloca um tı´tulo no meio de uma janela gra´fica. • subplot(m,n,p): divide a janela gra´fica do Scilab em uma matriz m × n (m linhas e n colunas). Em cada um dos elementos da matriz, especificado por p, pode ser colocado num gra´fico. // Demonstracao do comando subplot clf() subplot(2,2,1) champ // Chamada do demo da funcao champ subplot(2,2,2) histplot // Chamada do demo da funcao histplot subplot(2,2,3) errbar // Chamada do demo da funcao barr 32 Gra´ficos Bi-dimensionais CAPI´TULO 4. GRA´FICOS NO SCILAB subplot(2,2,4) grayplot // Chamada do demo da funcao grayplot Observem que, no menu horizontal da janela gra´fica temos a opc¸a˜o File e sub-opc¸a˜o Export. Esta sub-opc¸a˜o permite exportar a figura gerada no formato: *.gif, entre outros ! Executem o programa (plot2d opt.sce) que segue abaixo e compare com os comandos listados na Tabela 4.1. clear clf() subplot(2,2,1) x = [-2.9:0.1:2.9]’; y = exp(-x.*x); plot2d(t, x); errbar(t,x, 0.02*ones(x), 0.1*ones(x)) xtitle("Barra de erros: variacao inferior e Superior") subplot(2,2,2) plot2d2(x, y, style = 2) xtitle("Funcao escada: visualizacao discreta dos dados") subplot(2,2,3) plot2d3(x, y, style = 3) xtitle("Barras verticais: analise de frequencia") subplot(2,2,4) x = linspace(1, 1000); y = log(x); plot2d(x, y, logflag = "ln") // l == escala logaritmica // n == escala normal xgrid(3); xtitle("logflag: escala logaritmica") 33 Exercı´cios CAPI´TULO 4. GRA´FICOS NO SCILAB 4.3 Exerc´ıcios 1. Acompanhe o que foi feito, para func¸o˜es po- lares (plot2d opt), e fac¸a um (ou mais) pro- grama(s) para as func¸o˜es que segue. Nem to- das as func¸o˜es listadas abaixo precisam usar polarplot! Atenc¸a˜o ao definir os domı´nios de cada func¸a˜o. (a) Cisso´ide de Diocles: y2 = x3 a− x ou x = at2 1 + t2 y = at3 1 + t2 (b) Estrofo´ide: y2 = x2 a+ x a− x (c) Hipociclo´ide (atro´ide): x 2 3 + y 2 3 = a 2 3 ou{ x = a cos3(t) y = a sen3(t) (d) Espiral de Arquimedes: r = aϕ, r ≥ 0. (e) Espirial hiperbo´lica: r = a ϕ , r ≥ 0. (f) Espiral logaritmica: r = eaϕ. (g) Rosa de treˆs pe´talas: r = a sen(3ϕ), r ≥ 0. (h) Rosa de quatro pe´talas: r = a | sen(2ϕ)| 2. Trace o gra´fico das func¸o˜es abaixo (cuidado com o domı´nio de cada func¸a˜o !!!!). (a) f(x) = x3; (b) f(x) = √ x− 1; (c) f(x) = |x|; (d) f(x) = 1x ; (e) f(x) = √ 4− x2; (f) f(x) = |x− 4|; (g) f(x) = x+ |x|; (h) f(x) = √ x2 − 4; (i) f(x) = 1(x−4)2 ; (j) f(x) = −(4 + x2); (k) f(x) = x|x| ; (l) f(x) = 2−√x; (m) f(x) = ln(x) (mude o tipo de escala); (n) f(x) = e−x (mude o tipo de escala). 3. Atrave´s da estrutura function, escreva cada uma das func¸o˜es abaixo e escreva um programa (para cada uma ou para todas) e que chame as func¸o˜es (usando a func¸a˜o exec()) e fac¸a os seus respectivos gra´ficos: (a) f(x) = { −1 se x < 0 1 se x ≥ 0 (b) f(x) = −5 se x < −5 x se −5 ≤ x ≤ 5 5 se x > 5 (c) f(x) = x2 se x ≤ −1 x3 se |x| < 1 2x se x ≥ 1 (d) f(x) = { 1 se x e´ inteiro 0 se x na˜o e´ inteiro (e) f(x) = −x se x < 0 2 se 0 ≤ x < 1 x2 se x ≥ 1 (f) f(x) = x se x ≤ 1 −x2 se 1 ≤ x < 2 x se x ≥ 2 34 CAPI´TULO 5 Ajuste de Curvas em Ambiente Scilab Manipulac¸a˜o de Arquivos – Comando read Para a leiturade um arquivo no formato de matriz, o Scilab usa o comando read: --> A = read(’nome_do_arquivo.txt’, numero_de_linhas, numero_de_colunas) O arquivo contendo a matriz a ser lida deve conter apenas os elementos da matriz disposto de maneira usual. Manipulac¸a˜o de Arquivos – Comandos save e load As varia´veis, vetores ou matrizes criadas no ambiente Scilab podem ser armazenadas em um arquivo. Considere os vetores: --> x = [0:0.1:2]; --> y = [5.8955 3.5639 ... 0.1704 0.2636]; --> dd = [x; y]; onde y = [ 5.8955 3.5639 2.5173 1.979 1.899 1.3938 1.1359 1.0096 1.0343 0.8435 0.6856 0.61 0.5392 0.3946 0.3903 0.5474 0.3459 0.137 0.2211 0.1704 0.2636 ] Para salvar x e y em um arquivo chamado valores.dat, usamos o comando save com a sintaxe: --> save(’valores.dat’, dd) O comando save cria o arquivo valores.dat no direto´rio de trabalho. O arquivo valores.dat e´ um arquivo bina´rio. Para recuperar os valores x e y, usamos o comando load: --> clear --> x --> y --> load(’valores.dat’, ’dd’) --> dd Definindo a Func¸a˜o de Ajuste CAPI´TULO 5. AJUSTE DE CURVAS EM AMBIENTE SCILAB 5.1 Definindo a Func¸a˜o de Ajuste A func¸a˜o de ajuste desenvolvida para ambiente Scilab basea-se no me´todo dos Quadrados Mı´nimos. Lem- brando que, quando aplicamos este me´todo minimizamos o resı´duo ao quadrado (ou seja, a diferenc¸a entre o valor ajustado e o valor real ao quadrado), que pode ser escrito da seguinte forma: < r, r >= m∑ i=1 (yi − g(xi))2 (5.1) onde yi sa˜o elementos do vetor y que fornecem os valores reais a serem ajustados e g(x) a func¸a˜o a ser aproximada para estes valores. O nosso objetivo e´ o de encontrar os coeficientes da func¸a˜o g(x) de maneira que r seja o menor valor possı´vel (minimizac¸a˜o do resı´duo). Para os dados do exemplo da Sec¸a˜o 5, uma func¸a˜o que pode fornecer um bom ajuste e´ do tipo: g(x) = c1 ec2x +c3 (5.2) A func¸a˜o (5.1), para o ambiente Scilab, retorna dois tipos de informac¸a˜o (como veremos abaixo): um vetor com os coeficientes de (5.2) e o resı´duo. Assim (curvas.sce): // Exemplo de ajuste de dados usando Scilab. clear load(’valores.dat’, ’dd’) // Definindo a funcao residuo. Supondo que a funcao a ser ajustada // tenha parametros c_1, c_2, ... c_n, definimos a funcao residuo como: // // erro = x_n+1 - g( x, c_1, c_2, ..., c_n ) deff( ’erro = g(c,dd)’, ’erro = dd(2) - c(1)*exp( c(2)*dd(1) ) - c(3)’ ) Nesta func¸a˜o r, os elementos dd(1) e dd(2) correspondem a primeira e segunda linha da matriz armaze- nada em valores.dat, ou seja, aos valores de x e y do exemplo da Sec¸a˜o 5. O me´todo de Quadrados Mı´nimos no Scilab sempre segue este padra˜o: a u´ltima componente do vetor sempre corresponde a y. A Func¸a˜o datafit O ambiente Scilab possui a func¸a˜o datafit que ajusta qualquer tipo de func¸a˜o pelo me´todo dos Quadrados Minı´mos. Esta precisa de treˆs informac¸o˜es: a func¸a˜o a ser ajustada g(c,dd) (definida nos padro˜es da sec¸a˜o anterior), os elementos do arquivo valores.dat, que foram armazenados em dd e um chute inicial para o ca´lculo dos coeficientes de (5.2). No nosso caso: c0 = [ 1; -1; 0 ]; // Chute inicial para os parametros. // Calculando o ajuste. A variavel "c" corresponde aos parametros // ajustados e a variavel "e" ao erro quadratico de ajuste. [c,e] = datafit(g, dd, c0); onde c e´ um vetor coluna contendo os coeficientes da func¸a˜o G(x) e e e´ o resı´duo final. Apo´s a execuc¸a˜o deste passo, ja´ e´ possı´vel definir a func¸a˜oG(x) com os coeficientes calculados por datafit (note que o Scilab na˜o confunde g com G): 36 Spline Cu´bicas em Ambiente Scilab CAPI´TULO 5. AJUSTE DE CURVAS EM AMBIENTE SCILAB // Definindo a funcao de ajuste. deff( ’y1 = G(x)’, ’y1 = c(1) * exp( c(2) * x ) + c(3)’ ); // Fazendo os graficos dos dados e da funcao obtida! x = dd(1, :); y = dd(2, :); xsetech([0, 0, 0.48, 0.48]) xtitle("Pontos para ajuste") plot2d(x, y, style = [-1]) xsetech([0.5, 0, 0.48, 0.48]) xtitle("Curva ajustada") fplot2d(x, G, 2) xsetech([0, 0.5, 1, 0.48]) xtitle("Ajuste x pontos") plot2d(x, y, style = [-1]) fplot2d(x, G, 2) 5.2 Spline Cu´bicas em Ambiente Scilab A interpolac¸a˜o utilizando polinoˆmios de ordem elevada muitas vezes produz resultados mal comportados. Existem va´rios me´todos para eleminar esse problema. Dentre eles, as Splines Cu´bicas sa˜o muito populares. No Scilab, a interpolac¸a˜o por splines cu´bicas e´ executada pelas func¸o˜es splin e interp. No help do Scilab, os detalhes para o uso destas func¸o˜es esta˜o disponı´veis. A Func¸a˜o splin A func¸a˜o splin toma os dados x e y e os valores desejados xi (normalmente xi ∈ [x0, xn]), encontra o polinoˆmio da interpolac¸a˜o por spline cu´bica que se adequa a x e y, e enta˜o calcula os polinoˆmios para encontrar os valores de yi correspondente a cada valor xi. • Notac¸a˜o: d = splin( x, y, ’tipo de spline’ ), onde: x : vetor (linha ou coluna) com, no mı´nimo, 2 elementos; y : vetor (linha ou coluna) no mesmo formato de x; tipo de spline : selec¸a˜o do tipo de spline a ser calculada; d : vetor no mesmo formato de x (di e´ a derivada da spline em xi). • Descric¸a˜o: a func¸a˜o splin calcula a spline cu´bica (ou sub-spline) s que interpola os pontos (xi, yi), isto e´, temos s(xi) = yi, ∀i = 0 : n. A spline resultante s e´ completamente definida pelos pontos (x, y, d), onde d e´ um vetor com as derivadas de xi: s′(xi) = di (conhecida como forma de Hermite). O ca´lculo das splines em alguns pontos tem de ser feitos pela func¸a˜o interp. • Tipos de Splines: podemos calcular diferentes tipos de splines cu´bicas, aqui vamos ver as sintaxe das splines cu´bicas natural e restrita: 37 Spline Cu´bicas em Ambiente Scilab CAPI´TULO 5. AJUSTE DE CURVAS EM AMBIENTE SCILAB ’natural’ : a spline cu´bida e´ calculada supondo s′′(x0) = s′′(xn) = 0. Assim, a func¸a˜o pode ser dada por: d = splin( x, y, ’natural’) ’clamped’ : a spline cu´bica e´ ca´lcula usando s′(x0) = f ′(x0) e s′(xn) = f ′(xn). Neste caso, temos de passar um vetor com estes valores, como segue: d = splin( x, y, ’clamped’, [f’(x0) f’(xn)] ) A Func¸a˜o interp A func¸a˜o interp calcula a spline cu´bica. • Notac¸a˜o: yp = interp( xp, x, y, d ), onde: xp : vetor dos nu´meros reais definida em [x0, xn]; x, y, d : vetores de nu´meros reais, definindo uma spline cu´bica; yp : vetor de nu´meros reais de mesmo tamanho de xp, com os valores de s(xi) (yp(i) = s( xp(i) )). • Descric¸a˜o: Dado 3 vetores (x, y, d) definidos pela func¸a˜o splin com f(xi) = s(xi) e di = s′(xi), esta func¸a˜o calcula s em xp(i). Exemplos Veremos aqui, dois exemplos para o uso das func¸o˜es splin e interp. // Exemplo (spline_teste.sce) clear x = [0 1 2]; y = [1 2 -1]; plot2d(x, y, -2) d = splin(x, y, ’natural’) xx = linspace(0, 2); // yy = interp(xx, x, y, d); deff(’yy = f(xx)’, ’yy = interp(xx, x, y, d)’) // plot2d(xx, yy, 2, rect = [-1, -2, 3, 3]) fplot2d(xx, f, 2, rect = [-1, -2, 3, 3]) Tomemos agora o problema abaixo. Exemplo 5.2.1. Construa as splines cu´bicas para os dados abaixo, como e´ solicitados nos itens (1) e (2). 1. Natural (s′′(x0) = s′′(xn)); 38 Spline Cu´bicas em Ambiente Scilab CAPI´TULO 5. AJUSTE DE CURVAS EM AMBIENTE SCILAB xi 0.1 0.2 0.3 0.4 yi -0.62049958 -0.28398668 0.00660095 0.2484244 2. Restrita, com f ′(0.1) = 3.58502082 e f ′(0.4) = 2.16529366. // Spline (spline_aula.sce) clear clf() x = [0.1 0.2 0.3 0.4]; y = [-0.62049958 -0.28398668 0.00660095 0.2484244]; xx = linspace(0.1, 0.4); subplot(1,2,1) xtitle(’Interpolacao Natural’) plot2d(x, y, -5, rect = [0.08, -0.7, 0.45, 0.3]) dnat = splin(x, y, "natural"); ynat = interp(xx, x, y, dnat); plot2d(xx, ynat, 2) subplot(1,2,2) xtitle(’Interpolacao Restrita’) plot2d(x, y, -4, rect = [0.08, -0.7, 0.45, 0.3]) t = [3.58502082 2.16529366];drest = splin(x, y, "clamped", t); deff(’yrest = frest(xx)’, ’yrest = interp(xx, x, y, drest)’); fplot2d(xx, frest, 2) 39 Exercı´cios CAPI´TULO 5. AJUSTE DE CURVAS EM AMBIENTE SCILAB 5.3 Exerc´ıcios 1. Seja a tabela: i 1 2 3 4 5 6 7 8 9 10 xi 5 6 7 8 9 10 11 12 13 14 yi 0.01 0.05 0.08 0.14 0.18 0.26 0.44 0.51 0.79 1.02 (a) Salve os dados da tabela acima usando o comando save e carregue-o no ambiente Scilab usando load. (b) Fac¸a o gra´fico da dispersa˜o dos dados da tabela acima. (c) Use a func¸a˜o datafit para obter os seguintes polinoˆmios: i. p1(x) = a+ bx; ii. p2(x) = a+ bx+ cx2; iii. p3(x) = a+ bx+ cx2 + dx3; iv. y = axb; v. y = abx. (d) Use a func¸a˜o splin - natural para ajustar os dados da tabela acima. (e) Qual dos casos e´ o melhor ? Por queˆ ? 2. Seja a tabela contendo o tempo de germinac¸a˜o de sementes (dias) em func¸a˜o da temperatura me´dia do solo (◦C) para doze locais de plantio: Temperatura (◦C) 14 6 3 6 7 6 7 4 8 7 6 4 Germinac¸a˜o (dias) 10 26 41 29 27 27 19 28 19 31 29 33 (a) Fac¸a o diagrama da dispersa˜o dos dados; (b) Use a func¸a˜o datafit para determinar uma relac¸a˜o entre temperatura e o tempo de germinac¸a˜o das sementes; (c) Fac¸a o gra´fico com a func¸a˜o encontrada e o diagrama de dispersa˜o. 3. Um automo´vel, viajando por uma estrada reta, e´ cronometrado em diversos pontos. Os dados dessas observac¸o˜es sa˜o apresentados na tabela a seguir: Tempo (s) 0 3 5 8 13 Distaˆncia (ft) 0 225 383 623 993 Velocidade (ft/s) 75 77 80 74 72 Use um spline cu´bico restrito para prever a posic¸a˜o do automo´vel e sua velocidade quanto t = 10s. 4. Suspeita-se que o alto conteu´do de tanino existente nas folhas maduras do carvalho inibe o crescimento das larvas da mariposa de inverno, que danificam severamente essas a´rvores em certos anos. A tabela a seguir relaciona o peso me´dio de duas amostras de larvas em va´rios momentos durante o perı´odo de 28 dias apo´s o nascimento. A primeira amostra foi cultivada em folhas de carvalho novas e a segunda, em folhas maduras da mesma a´rvore. (a) Fac¸a o gra´fico de dispersa˜o dos dados; 40 Exercı´cios CAPI´TULO 5. AJUSTE DE CURVAS EM AMBIENTE SCILAB Dia 0 6 10 13 17 20 28 Peso me´dio da amostra 1 (mg) 6.67 17.33 42.67 37.33 30.1 29.31 28.74 Peso me´dio da amostra 2 (mg) 6.67 16.11 18.89 15 10.56 9.44 8.89 (b) Use um spline cu´bico natural para aproximar a curva de peso me´dio de cada amostra; (c) Encontre uma aproximac¸a˜o do peso me´dio ma´ximo para cada amostra determinando o ponto ma´ximo do spline; (d) Fac¸a um gra´fico com as duas curvas, em cores diferentes e com legenda para cada curva, juntamente com a dispersa˜o dos dados. 5. O custo do seguro sau´de nos Estados Unidos para os anos de 1994–2001, em bilho˜es de do´lares, e´ dado pela tabela: Ano 1994 1995 1996 1997 1998 1999 2000 2001 Seguro Sau´de 55.8 58.0 56.6 59.3 63.6 65.7 70.6 75.0 (a) Fac¸a o gra´fico de dispersa˜o dos dados; (b) Use a func¸a˜o datafit para ajustar uma curva que melhor modelo o custo do seguro sau´de ao longo dos anos; (c) Gere um gra´fico com a func¸a˜o encontrada e a dispersa˜o dos dados. 6. O Consumer Price Index (CPI) e´ uma medida da me´dia de prec¸os, num determinado perı´odo, de servic¸os e produtos. Para estabelecer uma base para comparac¸a˜o, a me´dia anual de prec¸os mensais nos anos de 1982–84 e´ usada para gerar os dados que segue na tabela abaixo para produtos derivados do tabaco. A tabela representa a porcentagem de consumo deste produto. Ano 1970 1975 1980 1985 1990 1995 1999 2000 2001 Tabaco (CPI) 43.1 54.7 72.0 116.7 181.5 225.7 355.8 374.9 425.2 (a) Fac¸a o gra´fico da dispersa˜o destes dados; (b) Usando a func¸a˜o datafit ajuste a melhor curva para estes dados; (c) A curva pode ser uma reta ? Por queˆ ? (d) Acrescente no gra´fico do item (a) a curva obtida; (e) Usando a curva obtida, qual sera´ o CPI do tabaco em 2010 ? 7. Anualmente, o governo dos Estados Unidos gasta boa parte do seu dinheiro com a dı´vida interna. A tabela que segue mostra a porcentagem destinada para o pagamento da dı´vida interna para os anos de 1991–2002. Ano 1991 1993 1995 1997 1999 2001 2002 % gasta 21.6 20.8 22.0 22.2 20.7 19.3 16.4 (a) Fac¸a o gra´fico da dispersa˜o destes dados; (b) Usando a func¸a˜o datafit ajuste a melhor curva para estes dados; 41 Exercı´cios CAPI´TULO 5. AJUSTE DE CURVAS EM AMBIENTE SCILAB (c) Acrescente no gra´fico do item (a) a curva obtida; (d) Usando a curva obtida, qual sera´ o gasto com a dı´vida interna em 2010 ? 8. O census nos Estados Unidos e´ realizado a cada 10 anos. A tabela abaixo mostra o census realizado desde 1940 ate´ 2000 (em milha˜o). Ano 1940 1950 1960 1970 1980 1990 2000 Populac¸a˜o U.S. 132 151 179 203 227 249 281 (a) Fac¸a o gra´fico da dispersa˜o destes dados; (b) Usando a func¸a˜o datafit ajuste para uma curva linear; (c) Acrescente no gra´fico do item (a) a curva obtida; (d) Usando a curva obtida, estime a populac¸a˜o em 2010 e 2020; (e) Usando a curva obtida, estime o ano que a populac¸a˜o atingira´ 320 milho˜es. 9. A empresa Delta Airlines publicou uma tabela mostrando a temperatura (em F◦) fora do avia˜o quando este troca de altitude (em 1000 pe´s). x (Altitude em 1000 pe´s) 1 5 10 15 20 30 36.087 y (Temperatura) 56 41 23 5 -15 -47 -69 (a) Fac¸a o gra´fico da dispersa˜o destes dados; (b) Usando a func¸a˜o datafit ajuste para uma curva linear; (c) Acrescente no gra´fico do item (a) a curva obtida; (d) Usando a curva obtida, determine a temperatura a 40000 pe´s. 42 CAPI´TULO 6 Gra´ficos Tri-Dimensionais 6.1 Gra´ficos Tri-dimensionais O comando plot3d() permite trac¸ar gra´ficos de superfı´cies z = f(x, y). Na notac¸a˜o Scilab, as varia´veis independentes x e y sa˜o vetores de dimensa˜o n1 e n2, respectivamente, e a varia´vel z e´ uma matriz de dimenc¸a˜o n1 x n2. Enta˜o, por essa definic¸a˜o, o elemento z(i,j) e´ o valor da superfı´cie no ponto ( x(i), y(j) ). Para exemplificar o uso de plot3d(), vamos considerar a func¸a˜o f(x, y) = cos(x) · sen(y) no intervalo [0, 2pi], com incremento 0.1 (graf tri.sci). x = [0:0.1:2*%pi]’; y = x; z = cos(x)*sin(y’); plot3d(x, y, z) Ale´m da func¸a˜o plot3d(), e de suas variac¸o˜es, o Scilab implementa outras func¸o˜es que permitem trac¸ar gra´ficos tri-dimensionais. Dentre elas, destacamos: • fplot3d: permite trac¸ar gra´ficos de superfı´cies por func¸o˜es, como no exemplo abaixo (graf fplot3d.sci): clear clf() deff( ’z = f(x, y)’, ’z = x.^4 - y.^4’ ) x = linspace(-3,3, 30); y = x; fplot3d( x, y, f, alpha = 5, theta = 31 ) • fplot3d1: permite trac¸ar gra´ficos de superfı´cies definidas por func¸o˜es, como no caso anterior. Neste caso, as superfı´cies sa˜o apresentadas em uma graduac¸a˜o de cores diferente do comando acima. 6.1.1 Gra´ficos 3-D Especiais As seguintes func¸o˜es permitem trac¸ar gra´ficos tri-dimensionais especiais: • param3d: permite trac¸ar curvas parame´tricas. • hist3d: permite trac¸ar histogramas 3-D. Gra´ficos Tri-dimensionais CAPI´TULO 6. GRA´FICOS TRI-DIMENSIONAIS • contour: permite trac¸ar curvas de nı´vel para uma func¸a˜o 3-D. // Exemplos de graficos 3-D especiais (graf_3dEsp.sci) subplot(1,2,1) param3d subplot(1,2,2) hist3d Devo ressaltar que a sintaxe de todos os comandos pode ser verificada usando o help do Scilab. Acompanhe mais este exemplo (param.sci) com algumas func¸o˜es especiais para gra´ficos 3-D. clear clf() subplot(2,2,1) x = linspace(0, 10*%pi); param3d(sin(x), cos(x), x) subplot(2,2,2) clear x = linspace(0,3*%pi)’; z1 = sin(x); z2 = sin(2*x); z3 = sin(3*x); y1 = zeros(x); y3 = ones(x); y2 = y3/2; param3d1([x, x, x], [y1, y2, y3], list([z1, z2, z3], [2 3 4])) // list([z1, z2, ..., zn], [colors]): o segundo elemento serve para // atribuir cores para cada curva.
Compartilhar