




































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Apostila Scilab - Apostila de programação
Tipologia: Notas de estudo
1 / 44
Esta página não é visível na pré-visualização
Não perca as partes importantes!





































Podemos observar o prompt inicial, representado pelo símbolo -->, que faz a marcação da linha de comando e o cursor, ao lado do prompt. Nesse espaço, podem ser realizados cálculos e compilados programas sem serem salvas alterações. É através dele também que pode ser acessado o help do programa, através do comando help digitado no prompt. Será aberta uma janela depois de o comando ser executado (apertando – se a tecla ENTER), contento uma lista de todas as funções presentes. Ainda na tela inicial estão presentes os menus drop down com sete opções: File, Edit, Preferences, Control, Editor, Applications e ?. Cada menu possui os seguintes sub – menus: File: New Scilab, Exec, Open, Load, Save, Change Directory, Get Current Directory, Print Setup, Print e Exit. Edit: Select All, Copy, Paste, Empty Clipboard e History. Preferences: Language, Colors, Toolbar, Files Association, Choose Fonts, Clear History, Clear Command Window e Console. Control: Resume, Abort e Interrupt. Editor Applications: Scicos, Edit Graph, m2sci e Browser Variables. ?: Scilab Help, Configure, Scilab Demos, Web Links e About.
Conhecidos os menus da tela inicial, vamos analisar algumas peculiaridades da linguagem. O primeiro tópico a ser abordado é sobre variáveis especiais presentes no ambiente. Esses são valores pré – definidos que podem ser usados diretamente na programação. A maioria dessas variáveis é prefixada com o símbolo de porcentagem (%). Elas podem ser acessadas através da digitação do comando whos no prompt de comando; é importante lembrar que, se o usuário definir alguma variável antes de digitar whos, ela também aparecerá no workspace. Na tabela a seguir, temos a listagem de algumas delas, tal como aparecem na janela.
VARIÁVEL TIPO %F Booleana %T Booleana %z Polinomial %s Polinomial %nan Constante %inf Constante COMPILER (^) String %gtk Booleana %gui Booleana %pvm Booleana %tk Booleana $ Polinomial %t Booleana %f Booleana %eps Constante %io Constante %i Constante %e Constante %pi Constante Tabela 1 - Variáveis Especiais
Temos mais duas importantes variáveis: as variáveis de localização de diretórios SCI e PWD. Para entendê – las, digite – as no prompt de comandos.
SCI: diretório onde o Scilab foi instalado. PWD: diretório onde o Scilab foi lançado, isto é, de onde seu script está rodando.
Existem ainda funções para manipular arquivos e diretórios. A função pwd mostra qual o diretório está sendo usado e chdir muda o diretório de trabalho. É importante lembrar que, depois de usada chdir, o valor de pwd muda, mas PWD permanece inalterado. Todas as variáveis criadas durante os trabalhos no ambiente podem ser armazenadas em um arquivo. O comando save é usado para tal, com a seguinte sintaxe:
save(‘nome_do_arquivo.dat’,variáveis)
Para recuperar os valores das variáveis, usa – se o comando load e o comando clear é usado para limpar variáveis não – protegidas:
load(‘nome_do_arquivo’,’variáveis’)
O comando help, quando digitado sem caracterização, abre uma listagem com todas as funções presentes no programa. Se caracterizado, abre a mesma janela, porém com a função já aparecendo diretamente. Além de armazenar variáveis, é possível criar uma memória de cálculo, salvando os comandos digitados em um arquivo, através do comando diary: diary(“nome_do_arquivo”); diary(0) // Fecha o comando
correspondente à hierarquia do ambiente, irá surgir. O retorno ao ambiente principal é dado pelo comando abort e ao ambiente anterior, pelos comandos return ou resume. As variáveis definidas num ambiente inferior não são salvas quando se sobe para um ambiente anterior. Caso se queira utilizar algum conteúdo de ambientes inferiores, deve – se usar a linha a=resume(a), onde a é a variável que se deseja salvar. Se tratando de um software dedicado à computação numérica em tecnologia, o Scilab traz carregadas algumas funções utilizadas nessa área, tais como FFT, fatoração LU, determinante de matrizes, funções de Bessel, dentre várias outras. A seguir, temos uma tabela contendo várias funções básicas existentes no Scilab:
abs abs(x) módulo (argumento) de x acos acos(x) arco – cosseno de x, em radianos acosh acosh(x) arco – cosseno hiperbólico de x, em radianos asin asin(x) arco – seno de x, em radianos asinh asinh(x) arco – seno hiperbólico de x, em radianos atan atan(x) arco – tangente de x, em radianos atanh atanh(x) arco – tangente hiperbólico de x, em radianos binomial binomial (p,n) binomial normalizado de p classe n* ceil ceil(x) arredondamento para o maior inteiro posterior cos cos(x) cosseno de x, com x em radianos cosh cosh(x) cosseno hiperbólico de x, com x em radianos cotg cotg(x) cotangente de x, com x em radianos coth coth(x) cotangente hiperbólica de x, com x em radianos cumprod cumprod(v) produto cumulativo do vetor v cumsum cumsum(v) soma cumulativa do vetor v diff diff(v) diferencial discreta do vetor v eval eval(s) valor numérico de uma expressão de strings** exp exp(x) exponencial euleriana de x factor factor(N) fatores primos de N find find(k ‘s’ V) encontra os índices dos elementos de V que tornam a comparação verdadeira (‘s’ ==,<,>,~=,...) fix fix(x) arredondamento para o inteiro mais próximo de zero floor floor(x) arredondamento para o maior inteiro anterior gsort gsort(V,’r/c’,’i/d’) ordenação dos elementos de V imag imag(z) coeficiente da parte imagnária de z int int(N) parte inteira de N linspace linspace(A,B,N) vetor com N pontos entre A e B inclusos log log(x) logarítmo neperiano de x log10 log10(x) logarítmo decimal de x log2 log2(x) logarítmo na base 2 de x logspace logspace (A,B,N) vetor de N pontos com espaço logarítmico entre A e B inclusos max max(v) máximo valor contido no vetor v min min(v) mínimo valor contido no vetor v modulo modulo(m,n) resto da divisão de m por n : i = n - m .* int (n ./ m) ndims ndims(M) número de dimensões de M pmodulo pmodulo(m,n) resto da divisão de m por n : i = n - m .* floor (n ./ m) nextpow2 nextpow2(x) potência de 2 maior e mais próxima de x norm norm(A) norma de A perms perms(v) todas as permutações do vetor v
primes primes(N) todos os números primos até N prod prod(v) produto de todos os elementos de v rand rand(m,n) matriz m x n de números aleatórios entre 0 e 1 real real(z) parte real do número complexo z round round(N) número inteiro mais próximo de N setdiff setdiff(a,b) retorna os elementos de a que não estão em b sign sign(v) retorna os sinais dos elementos de v: 1, se positivo, e - 1. sin sin(x) seno de x, x em radianos sinh sinh(x) seno hiperbólico de x, x em radianos sqrt sqrt(x) raiz quadrada de x ssprint ssprint(expr) modifica a forma de exibição de um sistema linear sum sum(v) soma de todos os elementos de v tan tan(x) tangente de x, x em radianos tanh tanh(x) tangente hiperbólica de x, x em radianos tril tril(M) triangularização inferior de M triu triu(M) triangularização superior de M vectorfind vectorfind(a,b,’s’) encontra o vetor a na matriz b, s=r ou s=c
-->a=1; -->b=2; -->z='2ab-b^2'; -->eval(z) ans =
O comando solve soluciona um sistema linear simbólico, através da definição dos coeficientes das variáveis e dos resultados de cada equação, em formato de string.
-->A=['c1','c2';'c3','c4']; -->b=['b1';'b2']; -->solve(A,b) ans =
!c1(b1-c2*(c4\b2))! !c4\b2!
O comando eval pode ser usado para avaliar o resultado para valores de todas as strings. Dois tipos de função são imprescindíveis para a programação: os comandos de entrada e saída de dados. No Scilab, quando o programador quer que o usuário atribua um valor para uma variável, aquele faz o uso da função input. A variável é atribuída da seguinte forma:
x=input("Expressão");
Uma forma mais elegante de pedir ao usuário que entre com dados necessários à execução do programa é usando caixas de diálogo, através da função x_dialog, na seguinte sintaxe:
-->disp(14)
-->disp(' ')
-->
Pode – se obter dados externos em forma de matriz através da função fscanfMat(nome_do_arquivo), bem como se pode escrever uma variável como uma matriz em um arquivo, com a função fprintfMat(arquivo,Matriz,formato).
CAPÍTULO III
COMANDOS DE FLUXO
Os laços são, de longe, a parte mais importante para se programar com o Scilab. Os laços reconhecidos pelo ambiente são: for, if, e while. O laço for segue a seguinte lógica: para um determinado índice variando de um valor inicial até um valor final com um determinado incremento, execute os comando sob o laço. Como exemplo, considere o seguinte exemplo, que carrega para uma matriz M os números pares de 1 a 100:
clc clear close
N=100; M=[];
for i=1:2:(N-1) M=[M (i+1)]; end
disp(M)
Note que N é o número final do intervalo a ser varrido e que a variável i é, na verdade, entendido como um vetor. O laço if funciona com a seguinte lógica: caso a condição seja verdadeira, execute os comandos. Considere o exemplo, para separar os números pares dos ímpares de 1 a 100:
clc clear close
N=100; P=[]; I=[]; for i=1:N if modulo(i,2)== P=[P i]; end if modulo(i,2)== I=[I i]; end end
disp(P)
É importante observar que a mudança da ordem de checagem das condições influencia o resultado. Por exemplo, em vez de testar primeiro se o número é múltiplo de 7, teste se ele é ímpar. O resultado é, na matriz S, os múltiplos pares de 7. Os operadores lógicos mais comuns ao se usar a estrutura if são “e” (&) e “ou” (| - barra vertical). Estes operadores são postos entre duas condições. O comando while funciona como um misto de for e if, na medida em que são executados comandos até que uma condição não seja mais satisfeita. Funciona como se os laços citados estivessem alinhados, porém sob a condição de haver um único if booleano. Um processo iterativo é um bom exemplo do uso deste recurso:
clc clear close
s=5; N=0;
while s>1e- s=s/10; N=N+1; end
O contador N indica o número de operações realizadas até que o valor s seja menor que 1e-5. A seguir, temos alguns códigos interessantes em que há os laços apresentados:
Código 1
clc clear close
disp(‘ Programa para carregar valores de uma função de duas variáveis para domínios de tamanhos diferentes’) disp(‘ ‘) disp(‘ Danusio Gadelha Filho’) disp(‘ ‘)
x=1:1:5; y=1:2:8;
disp(‘ Tamanho de x (’) disp(‘ ‘) disp(length(x)) disp(‘ ‘) disp(‘ Tamanho de y (’) disp(‘ ‘) disp(length(y)) disp(‘ ‘)
disp(‘ Função de (x,y) (’) disp(‘ ‘) disp(‘ f= (x²+y³)/(x+y)’) disp(‘ ‘)
for i=1:length(x) for j=1:length(y) f(i,j)=(x(i)^2+y(j)^3)/(x(i)+y(j)); end end
disp(‘ Valores de f (’) disp(‘ ‘) disp(f)
surf(f) //veja capítulo sobre gráficos
Código 2
clc clear close
disp(' Programa para simular a transcrição do RNA mensageiro') disp(' ') disp(' Danusio Gadelha Filho') disp(' ')
disp(' DNA a ser transportado -->') disp(' ') disp(DNA) disp(' ')
c=length(DNA);
for i=1:sum(c) if DNA(i)=='A' RNA(i)='T'; elseif DNA(i)=='T' RNA(i)='A'; elseif DNA(i)=='G' RNA(i)='C'; elseif DNA(i)=='C' RNA(i)='G'; else
disp(' Raiz(es) no intervalo -->') disp(' ') disp(raiz)
CAPÍTULO IV
VETORES E MATRIZES
Vetores são um agrupamento de elementos em uma única fila (linha ou coluna). No Scilab, eles são sempre indicados entre colchetes; o ponto – e – vírgula denota mudança de linha, enquanto elementos de ma mesma linha são separados por vírgulas ou espaços. A transformação de um vetor – linha em um vetor – coluna, ou vice – versa, chamada de transposição, é feita através do acréscimo de um apóstrofo ao lado direito do colchete de fechamento ou da variável que identifica o vetor. Dois vetores estão sujeitos às seguintes operações entre si:
SOMA: v1+v2, desde que sejam da mesma dimensão. SUBTRAÇÃO: v1-v2, desde que sejam da mesma dimensão. MULTIPLICAÇÃO ESTRUTURAL: v1.v2, desde que sejam da mesma dimensão. DIVISÃO À DIREITA ESTRUTURAL: v1./v2, desde que sejam da mesma dimensão. DIVISÃO À ESQUERDA ESTRUTURAL: v1.\v2, desde que sejam da mesma dimensão. MULTIPLICAÇÃO: v1v2, desde que o número de colunas de v1 seja igual ao número de linhas de v2. DIVISÃO À DIREITA: v1/v2, desde que sejam da mesma dimensão. DIVISÃO À ESQUERDA: v1\v2, desde que sejam da mesma dimensão.
Matrizes são conjuntos de elementos dispostos em múltiplas filas. Todas as operações definidas para vetores podem ser usadas com matrizes, desde que a compatibilidade entre as dimensões seja observada. Existem algumas funções úteis no tratamento com matrizes, tanto como recurso de programação quanto para debugar a rotina. As funções size e length retornam, respectivamente, a ordem e a maior dimensão de uma matriz. A função rank retorna o rank da matriz (rank é o número de filas linearmente independentes). A função norm retorna a norma de uma matriz. Com o comando trace podemos obter a soma dos elementos da diagonal principal da matriz (ou traço da matriz). A diagonal principal pode ser extraída com o comando diag(M,n), onde n é a localização da matriz principal (de baixo para cima, variando de -L a L, onde L é a maior dimensão de M subtraída de um). Uma aplicação interessante do uso das matrizes é na resolução de sistemas lineares. Dado um sistema linear no formato matricial Ax=b, as variáveis contidas em x podem ser obtidas simplesmente por A\b. A priori, todas as variáveis para o Scilab são matrizes; deste modo, todas as operações acima descritas são válidas para qualquer variável definida no programa. Definida uma matriz M, o elemento da linha i e coluna j é acessado através da digitação de M(i,j). O caractere especial $ faz com q o último elemento seja acessado: M($). Quando se quer varrer toda uma sequência de filas, usam – se os dois pontos
-->[ij,val,size_]=spget(A) size_ =
val =
ij =
Mais funções a respeito podem ser encontradas na biblioteca Sparse. A seguir, um exemplo de uso da fatoração QR para a extração dos autovalores de uma matriz:
clc clear close
// EXTRAI OS AUTOVALORES DA MATRIZ A POR MEIO DA FATORAÇÃO QR // CÓDIGO ESCRITO POR DANUSIO GADELHA FILHO // PERMITIDA REPRODUÇÃO COM OS DEVIDOS CRÉDITOS
format (8) // formato de exibição dos números: um menor número de casas decimais
disp(' ') disp(' Programa de extração de autovalores por fatoração QR') disp(' Danusio Gadelha Filho') disp(' ')
A=[2.5 -1 0; -1 5 -sqrt(2); 0 -sqrt(2) 10];
L=size(A); I=eye(L(1),L(2));
disp('Matriz a ser fatorada -->') disp(' ')
disp(A) disp(' ')
format (16) // um maior número de casas decimais
[Q R]=qr(A);
N=100; // número de iterações Q1=Q; Q2=Q'; for i=1:N [Q R]=qr(A); Q1=QQ1; Q2=Q2Q'; A=R*Q; end
printf(' Para %d iterações, a matriz de autovalores é: \n',N); disp(' ') disp(clean(A)) disp(' ') O código apresentado abaixo retorna os valores de uma matriz M que estão acima ou abaixo de um valor de corte w. Observe que não foram usados comandos condicionais (q.v. capítulo 2):
clc clear close
disp(' Programa Filtro Lógico') disp(' Danusio Gadelha Filho') disp(' ') disp(' Este script permite eliminar os elementos de uma matriz abaixo ou acima de um determinado valor') disp(' ')
M=[1/9 3/4 -1 7/6; 1/4 1/3 1/2 1; 1 1/4 1/9 -1/16];
L=size(M);
w=.3; disp(' Matriz a ser reduzida: ') disp(' ') disp(M) disp(' ') printf(' Valor de corte: %f \n',w); for i=1:L(1) for j=1:L(2)