Docsity
Docsity

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

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


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Scilab - Apostila de programação, Notas de estudo de Engenharia Elétrica

Apostila Scilab - Apostila de programação

Tipologia: Notas de estudo

2020

Compartilhado em 26/09/2020

pablio-henrique-6
pablio-henrique-6 🇧🇷

4

(2)

9 documentos

1 / 44

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
SCILAB 5.
Danusio Gadelha Filho
Universidade Federal do Ceará
SCILAB 5.
X
Danusio Gadelha Filho
Universidade Federal do Ceará
Danusio Gadelha Filho
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c

Pré-visualização parcial do texto

Baixe Scilab - Apostila de programação e outras Notas de estudo em PDF para Engenharia Elétrica, somente na Docsity!

SCILAB 5.

Danusio Gadelha Filho

Universidade Federal do Ceará

SCILAB 5.X

Danusio Gadelha Filho

Universidade Federal do Ceará

Danusio Gadelha Filho

Universidade Federal do Ceará

SUMÁRIO

CAPÍTULO 1: INTERFACE GRÁFICA DO SCILAB

CAPÍTULO 2: OPERAÇÕES PRIMÁRIAS

CAPÍTULO 3: COMANDOS DE FLUXOS

CAPÍTULO 4: VETORES & MATRIZES

CAPÍTULO 5: POLINÔMIOS

CAPÍTULO 6: LISTAS

CAPÍTULO 7: FUNÇÕES

CAPÍTULO 8: GRÁFICOS

APÊNDICE: EQUAÇÕES DIFERENCIAIS

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

  • Os termos estão localizados entre 0 e 1 ** Um exemplo de uso:

-->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(' ')

DNA=['A' 'G' 'C' 'A' 'G' 'T' 'H' 'C' 'C'];

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)