Você está na página 1de 58

Universidade Federal de São Carlos

Centro de Ciências Exatas e de Tecnologia


Departamento de Engenharia Química

INTRODUÇÃO AO USO DO PROGRAMA LIVRE


SCILAB

"Institut National de Recherche en Informatique et en Automatique (INRIA)"

Antonio José Gonçalves da Cruz (Professor DEQ/UFSCar)


Felipe Fernando Furlan (Doutorando PPG-EQ/UFSCar)
Gabriel de Castro Fonseca (Mestrando PPG-EQ/UFSCar)

São Carlos
Agosto de 2007
(Revisado em Setembro de 2012)
2

INTRODUÇÃO AO USO DO PROGRAMA LIVRE


SCILAB

Antonio José Gonçalves da Cruz (Professor DEQ/UFSCar)


Felipe Fernando Furlan (Doutorando PPG-EQ/UFSCar)
Gabriel de Castro Fonseca (Mestrando PPG-EQ/UFSCar)

São Carlos
Agosto de 2007
(Revisado em Setembro de 2012)
3

Copyright© 2007 Antonio José Gonçalves da Cruz.


Permissão para copiar, distribuir e/ou modificar este documento de acordo com os
termos da licença de documentação GNU (GNUFDL), versão 1.2 ou qualquer outra
versão posterior publicada pela Free Software Foundation.
Uma cópia da licença pode ser encontrada em: http://www.gnu.org/licenses/fdl.txt
4

Índice
PREFÁCIO

Capítulo 1
1. INSTALAÇÃO
1.1 Instalando o programa Scilab em ambiente Windows

Capítulo 2
2. INICIANDO O APLICATIVO SCILAB
2.1 O ambiente de trabalho
2.2 Obtendo ajuda
2.3 Primeiros passos
2.3.1 Inserindo comentários
2.3.2 Constantes
2.3.3 Operações básicas
2.3.4 Apagando variáveis
2.3.5 Limpando o ambiente de trabalho
2.4 Funções trigonométricas
2.5 Constantes especiais
2.6 Trabalhando com vetores e matrizes
2.6.1 Vetores
2.6.2 Matrizes
2.7 Trabalhando com polinômios
2.8 Construindo gráficos
2.8.1 Comandos básicos
2.9 Manipulando funções
2.10 Comandos especiais

Capítulo 3
3. MATEMÁTICA COM SCILAB
3.1 Um pouco mais de vetores
3.1.1 Operações com vetores
3.2 Matrizes

Capítulo 4
4. NOÇÕES DE PROGRAMAÇÃO
4.1 Programando com Scilab
4.2 Comandos para Iterações
4.3 Definindo Scripts
4.4 Definindo Funções

Capítulo 5
5. MÉTODOS NUMÉRICOS EMBUTIDOS
5.1 Sistemas lineares
5.2 Sistemas não-lineares
5.3 Mínimos quadrados
5.4 Derivação e Integração
5.5 Sistemas de EDO

Bibliografia

Apêndice
Licença do Scilab
Licença da logomarca
5

PREFÁCIO
O programa Scilab foi criado por pesquisadores pertencentes ao Institut de
Recherche en Informatique et an Automatique, INRIA, através do projeto
MÉTALAU (Méthods, augorithmes et logiciels pour l’automatique) e à École
Nationale des Ponts et Chaussées, ENPC, no ano de 1990. Atualmente vêm
sendo mantido e desenvolvido por um consórcio de empresas e instituições
francesas, denominado Consórcio Scilab (a criação deste consórcio foi em
maio de 2003). É distribuído livremente e encontra-se disponível para
download no seguinte endereço (http://www.scilab.org/).
Scilab vem sendo utilizado ao redor do mundo tanto em ambientes
educacionais quanto industriais. Foi desenvolvido para ser um sistema
aberto, onde o usuário pode definir novos tipos de dados e operações a
partir destes.

O programa disponibiliza um conjunto de toolboxes, a saber:


- gráficos 2D e 3D, animações;
- álgebra linear, matrizes esparsas;
- funções polinomiais e racionais;
- simulação: ODE solver e DAE solver;
- Scicos (http://www.scicos.org/): ambiente gráfico utilizado para simulação
de sistemas dinâmicos;
- Controle clássico e robusto, otimização LMI (Linear Matrix Inequality);
- Otimização Diferenciável e não diferenciável;
- Processamento de sinais;
- Metanet: gráficos e redes;
- PVM (Parallel Virtual Machine System), uso do Scilab em processa-mento
paralelo;
- Estatística;
- Interface com pacote de computação simbólica do Maple, gerando o
código MuPAD 3.0 (http://www.mupad.com/);
- Interface com Tcl/Tk.

Scilab trabalha na maioria dos sistemas operacionais Unix (incluindo


GNU/Linux), Windows (XP/Vista/7) e Mac OS X. O programa é
disponibilizado com o código fonte aberto, ajuda on-line e manuais em
Inglês. As versões binárias também se encontram disponíveis.

De acordo com os desenvolvedores/mantenedores do aplicativo Scilab, o


tipo de licença adotado não é compatível com a licença GPL; consultar o
seguinte endereço:
http://www.fsf.org/licenses/license-list.html#NonFreeSoftwareLicense

Mas, apesar disso, o tipo de licença adotado permite:


- livre uso e distribuição do aplicativo para fins não comerciais;
- uso para fins comerciais desde que o programa não sofra alterações
(modificações na versão original do Scilab) ou como programa composto
(ou seja, incluindo-o em outro programa).

Maiores informações sobre aspectos legais de uso do programa Scilab


encontram-se disponíveis no seguinte endereço:
6

http://www.scilab.org/legal/index_legal.php?page=faq.html

Na internet é possível encontrar vasta literatura a cerca do uso deste


aplicativo. Na própria homepage do Scilab encontra-se um link onde é
disponibilizado acesso a livros (comerciais e não comerciais), relatórios
técnicos e artigos.
(http://www.scilab.org/publications/index_publications.php?page=books.html)

Documentos referentes à documentação do aplicativo estão disponíveis no


seguinte endereço:
http://www.scilab.org/product/index_product.php?page=old_documentation.html

São eles:

• Introduction to Scilab (manual de introdução ao Scilab)

• Signal Processing (documentação sobre o manual de processamento


de sinais)

• Lmitool: Linear Matrix Inequalities Optimization Toolbox


(documentação sobre o tool box de otimização)

• Metanet User's Guide and Tutorial (tutorial sobre a utilização do tool


box de grafos Metanet)

• Scicos (documentação sobre o ambiente de simulação no Scilab)

• Scilab's Internals Documentation (documentação sobre as


características internas do Scilab)

• Scilab demonstrations (programas de demonstração de


funcionalidades do Scilab)

• Intersci (documentação sobre a interconexão do Scilab com


programas escritos nas linguagens C ou FORTRAN)

Estes arquivos encontram-se disponíveis no CD do curso na pasta


<Documentation>.

Esta apostila foi elaborada tendo como principais referências (além da


própria documentação do Scilab):

Pires, P. S. M. Introdução ao Scilab – Versão 3.0, obtida em


http://www.dca.ufrn.br/~pmotta

Caro, A. A. e Sepúlveda, C. V. Fundamentos de Scilab y aplicaciones –


Versão 0.1, obtida em
http://www.scilab.org/contrib/displayContribution.php?fileID=262
7

Capítulo 1

1. INSTALAÇÃO

1.1 Instalando o programa Scilab* em ambiente Windows

O programa Scilab (versão 5.3.3) encontra-se disponível para


download a partir do seguinte endereço: http://www.scilab.org. De
posse do aplicativo, o primeiro passo para iniciar a instalação consiste
em aplicar um duplo clique sob o arquivo scilab-5.3.3.exe. Dessa
forma, a instalação inicia-se com o programa perguntando para o
usuário selecionar a linguagem a ser utilizada durante a instalação do
aplicativo (Figura 1.1).

Figura 1.1: Seleção da linguagem de instalação.

Após a seleção da linguagem, clica-se sobre o botão <OK> para a


instalação prosseguir. Inicia-se o guia de instalação que ajudará
durante todo o processo (Figura 1.2).

Figura 1.2: Guia de instalação que ajudará durante o processo.

____________________________

* A versão 5.4.0 já está disponível para download.


8

Recomenda-se que todos os aplicativos abertos no computador sejam


fechados para prosseguir com o procedimento de instalação.
Clicando-se em <NEXT>, passa-se a tela que apresenta o acordo de
licença, Figura 1.3. Antes de passar a diante com a instalação,
recomenda-se que se faça uma leitura cuidadosa dos termos da
licença.

Figura 1.3: Acordo de licença.

Concordando-se com os termos apresentados, seleciona-se <I


ACCEPT THE AGREEMENT> e clica-se no botão <NEXT> prosseguindo
com a apresentação da próxima tela, Figura 1.4. Nesta tela é
solicitado ao usuário selecionar o local no disco rígido onde o
aplicativo será instalado. A instalação padrão é realizada no seguinte
caminho: C:\Program Files\scilab-5.3.3. Uma vez selecionado o
caminho para instalação, clica-se novamente em <NEXT>.

Figura 1.4: Seleção do local de instalação no disco rígido.


9

A próxima tela solicita que o usuário escolha os componentes a serem


instalados, Figura 1.5. O usuário deverá selecionar os componentes
que deseja instalar e prosseguir, clicando-se em <NEXT>.

Figura 1.5: Seleção dos componentes a serem instalados.

O configurador da instalação também pergunta sobre a criação de um


nome para o programa, Figura 1.6. O usuário pode aceitar a sugestão
ou modificar o nome. Este atalho será salvo no diretório <Start Menu
Folder>. Em seguida, clica-se em <NEXT>.

Figura 1.6: Local onde serão armazenados os atalhos para o


programa.

Também é feita a seleção de tarefas adicionais a serem realizadas


(criar ícone na área de trabalho, criar um atalho no menu de acesso
rápido, associar as extensões de arquivos *.SCE e *.SCI ao programa
Scilab, etc). A Figura 1.7 apresenta esta tela. Após a seleção, o
10

procedimento de instalação prossegue com um clique sobre o botão


<NEXT>.

Figura 1.7: Seleção de tarefas adicionais.

Finalmente é apresentada a tela final do configurador, onde se podem


conferir as escolhas realizadas durante o processo, podendo
retroceder para realizar alterações ou prosseguir com a instalação do
aplicativo, Figura 1.8.

Figura 1.8: Tela final do configurador.

Clicando-se no botão <INSTALL> inicia-se a instalação. O


procedimento levará alguns minutos, a depender da capacidade de
processamento do computador onde se está realizando a instalação.
Ao finalizar o processo, o configurador apresenta a tela ilustrada na
Figura 1.9. É dada a opção ao usuário de iniciar imediatamente o
aplicativo selecionando-se <LAUNCH SCILAB>. Para terminar o
procedimento de instalação deve-se clicar no botão <FINISH>.
11

Figura 1.9: Completando a instalação do Scilab.


12

Capítulo 2

INICIANDO O APLICATIVO SCILAB

2.1 O ambiente de trabalho

Se tudo ocorreu bem durante o procedimento de instalação, pode-se


iniciar o aplicativo Scilab a partir do menu <INICIAR>
<PROGRAMAS> <SCILAB-5.3.3> <scilab-5.3.3>, ou alternativa-
mente, clicando-se no atalho criado na área do ambiente de trabalho
(caso o usuário tenha optado por está opção durante a instalação). A
tela inicial do Scilab é apresentada na Figura 2.1.

Figura 2.1: Tela inicial do Scilab.

Na Figura 2.1, observa-se que o prompt do Scilab é representado por


uma seta, -->, e que o cursor do Scilab permanece piscando.
Na parte superior da janela têm-se os seguintes menus:

File
Edit
Preferences
Control
Editor
Aplications
? (Help)
13

Cada um desses menus pode ser expandido em submenus ao clicar


sobre eles. Um pouco abaixo, têm-se algumas teclas de acesso
rápido, que se localizam na barra de ferramentas, Figura 2.2.

Abre nova janela do aplicativo Scilab


Abre o aplicativo Scipad
Abre arquivo com extensão *.sci
Copia área de texto selecionada
Cola área de texto copiada
Muda o diretório de trabalho
Ativa saída do Scilab
Permite escolher o tipo de fonte
Impressão
Help

Figura 2.2: Teclas de acesso rápido.

2.2 Obtendo ajuda

É possível a qualquer momento solicitar o comando <HELP>, através


da opção na barra de tarefas, da tecla de atalho, ou digitando-se
help() ou simplesmente help; na linha de comando do Scilab. É
aberta a janela ilustrada pela Figura 2.3, onde o usuário pode
navegar pelos tópicos disponíveis.

Figura 2.3: A tela de ajuda do Scilab.


14

2.3 Primeiros passos

A sintaxe de comandos do programa Scilab é muito similar a do


MatLab.

2.3.1 Inserindo comentários

É sempre muito conveniente o uso de comentários para explicar o


que se está programando. No Scilab, para inserir um comentário se
usa o seguinte comando: //.
Exemplo:

--> // Este eh um comentario

2.3.2 Constantes

A declaração de variáveis constantes no Scilab é realizada da


seguinte forma:

--> x = 5
x =
5.

Similarmente ao Matlab, o Scilab também é case sensitive, ou seja,


discrimina maiúsculas de minúsculas. Dessa forma, as variáveis x e X
são diferentes.

--> x = 5
x =
5.
--> X = 10
X =
10.

É possível omitir o eco do comando usando um ponto e vírgula no


final:

--> x = 5;

Para checar o valor de x novamente basta digitar x:

--> x
x =
5.

2.3.3 Operações básicas

Uma vez declarada variáveis, é possível realizar operações básicas


com elas.
15

Soma
-->x+X
ans =
15.

Subtração
-->x-X
ans =
-5.

Produto
--> x*X
ans =
50.

Divisão
--> x/X
ans =
0.5

Se inadvertidamente ocorrer uma divisão por zero, a seguinte


mensagem é apresentada ao usuário:

--error 27
division by zero...

Exponenciação
Os símbolos “^” ou “**” são utilizados para se elevar uma variável a
uma potência determinada.

--> x^3
ans =
125.

ou

--> x ** 3
ans =
125.

Raiz quadrada
A raiz quadrada de um número é obtida através do comando sqrt(),
com a variável inserida dentro do parênteses:

--> srqrt(4)
ans =
2.

Função Exponencial, ex
A função exponencial é obtida através do comando exp(),com a
variável inserida dentro do parênteses:

--> exp(x)
16

ans = 148.41316

Logaritmo
O comando log() é empregado para calcular o logaritmo neperiano de
uma variável. O logaritmo na base 10 é calculado com o comando
log10().

--> log(2.7182818)
ans =
1.0000000

--> log10(100)
ans =
2.

2.3.4 Apagando variáveis

Para apagar uma variável criada anteriormente utiliza-se o comando


clear <nome da variável>.

-->clear x

Pode-se também optar por apagar todo o espaço de memória


utilizado pelo programa. Para tal utiliza-se o comando clear.

-->clear

2.3.5 Limpando o ambiente de trabalho

O comando clc é utilizado para limpar a área de trabalho no programa


scilab.

OBS: Lembre-se que o comando clc apenas limpa a tela, e o comando


clear é que apaga as variáveis da memória.

2.4 Funções trigonométricas

De forma similar a outros pacotes computacionais, o programa Scilab


também possui um conjunto de funções pré-definidas e que podem
ser utilizadas pelo usuário (a exemplo das funções exp() e sqrt()
vistas anteriormente).
17

A Tabela 2.1 apresenta as funções trigonométricas definidas no


programa Scilab. O argumento é utilizado em radianos.

Tabela 2.1: Funções trigonométricas definidas no Scilab.


Função Comando Exemplo
seno sin() sin(%pi/4.)
arcoseno asin() asin(%pi/4.)
coseno cos() cos(%pi/4.)
arcoseno acos() acos(%pi/4.)
tangente tan() tan(%pi/4.)
arcotangente atan() atan(%pi/4.)
cotangente cotg() cotg(%pi/4.)

* a variável %pi refere-se a um tipo de variável especial descrita no


próximo item.

2.5 Constantes especiais

O Scilab possui algumas constantes denominadas especiais e que se


iniciam com o símbolo porcentagem (%).
São elas:

%i : representa o valor de raiz quadrada de -1.

-->% i
ans =
i

%pi : representa o valor da constante matemática π.

-->%pi
ans =
3.1415927

%e : representa a constante exponencial e, equivalente a exp(1).

-->%e
ans =
2.7182818

%eps : representa o menor número que o computador distingue


(1.+%eps = 1.)

-->%eps
%eps =
2.220D-16
18

%inf : representa um número muito grande (1+%inf=%inf.)

-->%inf
%inf =
Inf
A divisão de um número por %inf resulta sempre em zero.

%nan : representa not a number (não é um número)

%t e %f : representam as constantes booleanas verdadeiro e


falso, respectivamente.

2.6 Trabalhando com vetores e matrizes

O programa Scilab trabalha com vetores e matrizes de forma similar


a vários pacotes computacionais disponíveis no mercado.

2.6.1 Vetores

Vetor Linha
Para inserir um vetor linha no programa Scilab a seguinte sintaxe é
utilizada:

--> Vetor1 = [1 2 3]
Vetor1 =

1. 2. 3.

Pode-se utilizar a vírgula como separador de componentes:

--> Vetor2 = [1, %pi, %eps]


Vetor2 =

1. 3.1415927 2.220D-16

Um vetor também pode ser declarado como um intervalo:

--> Vetor3 = 1:10


Vetor3 =

1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

Pode-se fazê-lo saltar de 2 em 2:

--> Vetor4 = 1:2:10


Vetor4 =

1. 3. 5. 7. 9.

Ou vir de trás pra frente:


19

--> Vetor5 = 10:-1:5


Vetor5 =

10. 9. 8. 7. 6. 5.

O mesmo pode ser conseguido com o comando linspace(), mas ele


funciona um pouco diferente. Você informa o primeiro número do
intervalo, o último e quantos números igualmente espaçados você
quer entre eles:

--> Vetor6 = linspace(3,30,4)


Vetor6 =

3. 12. 21. 30.

Vetor Coluna
Um vetor coluna é inserido das seguintes formas:

-->Vetor7 =[1
-->2
-->3
-->4
-->5]

Vetor7 =

1.
2.
3.
4.
5.

Ou, alternativamente:

-->Vetor8 =[1;2;3;4;5]

Vetor8 =

1.
2.
3.
4.
5.

É possível também obter um vetor coluna a partir da transposta do


vetor linha e vice-versa:

-->Vetor_Linha=[1 2 3 4 5]

Vetor_Linha =

1. 2. 3. 4. 5.

Vetor_Coluna = Vetor_Linha’
20

Vetor_Coluna =

1.
2.
3.
4.
5.

2.6.2 Matrizes

A composição de uma matriz no ambiente Scilab é realizada de forma


similar a dos vetores, separando-se cada linha por um ponto e vírgula
(os elementos da mesma linha podem ser separados por espaço ou
por vírgula).

--> A=[2. 3. 1.5; 1.0 6.5 3.7]

A =

2. 3. 1.5
1. 6.5 3.7

É possível também montar uma matriz pela combinação de vetores.

--> vetor1=[1 2 3]

vetor1 =

1. 2. 3.

-->vetor2=[0.4 4.5 6.0]

vetor2 =

0.4 4.5 6.

-->matriz1=[vetor1; vetor2]

matriz1 =

1. 2. 3.
0.4 4.5 6.

2.6.3 Arrays e listas

Vetores e matrizes são objetos matemáticos que consistem de um


conjunto de números ordenados em linhas e colunas. Em informática
elas se encaixam no conjunto mais amplo dos arrays, conjuntos de
dados do mesmo tipo ordenados em linhas e colunas. Todo vetor e
toda matriz é um array, mas nem todo array é um vetor ou uma
matriz. Por exemplo, você pode criar um array de palavras ou
caracteres:
21

-->idolos = [“Ayrton” “Senna” “da Silva”; “Edson” “Arantes” “do


Nascimento”]

idolos =
Ayrton Senna da Silva

Edson Arantes do Nascimento

Uma lista, ao contrário de um array, não precisa ser de dados de um


mesmo tipo. É possível criar uma lista que contem números, vetores,
matrizes, palavras e até outras listas:
-->L = list(2,[1 2; 3 4],"Strogonoff",%pi)
L =

L(1)

2.

L(2)

1. 2.
3. 4.

L(3)

Strogonoff

L(4)

3.1415927

2.7 Trabalhando com polinômios

O Scilab tem capacidade de trabalhar diretamente com polinômios.


Eles podem ser declarados através de seus coeficientes:

-->polinomio1=poly([1 2 4],'x','c')

polinomio1 =

2
1 + 2x + 4x

As raízes desse polinômio podem ser obtidas com a função roots(),


mesmo se forem complexas.

-->roots(polinomio1)
ans =

- 0.25 + 0.4330127i
- 0.25 - 0.4330127i

Os polinômios também podem ser declarados a partir de suas raízes:


-->polinomio2=poly([1 2 4],'x')
22

polinomio2 =

2 3
- 8 + 14x - 7x + x

De uma maneira ou de outra os polinômios podem ser avaliados


usando-se a função horner():

-->horner(polinomio1,10)
ans =

421.

-->horner(polinomio2,10)
ans =

432.

2.8 Construindo gráficos

2.8.1 Comandos básicos


Comando plot
Uma das formas de se construir um gráfico no programa Scilab, é
através do comando plot:

-->x=[1 2 3 4];y=[1 2 3 4];

-->plot(x, y)

A Figura 2.4 apresenta o gráfico gerado pelo Scilab.

Figura 2.4: Gráfico construído a partir dos vetores x e y.


23

Outro exemplo, gráfico da função seno, Figura 2.5.

-->x=[1:0.01:10];

-->plot(x,sin(x))

Figura 2.5: Gráfico da função seno.


Você pode nomear os eixos x e y, dar um título ao gráfico e desenhar
uma grade com os seguintes comandos respectivamente:

-->xlabel("x")

-->ylabel("sen(x)")

-->title("Grafico do seno de x")

-->xgrid();
24

Figura 2.6: Gráfico da função com título, nomes nos eixos e grade.

Para plotar mais de dois gráficos, mantendo-os ativos na tela, usa-se


o comando scf().

Exemplo:

-->x=[0:0.1:2*%pi]';
-->plot(x,sin(x));scf(1);plot(x,[sin(x) sin(2*x)]);

O comando clf() apaga o último gráfico desenhado

Exemplo:

-->x=[0:0.1:2*%pi]';

-->plot(x,sin(x))

-->clf()

Para deslocar o eixo da ordenada de um gráfico para a direita, o


seguinte comando é empregado:

-->// ordenada deslocada para direita

-->plot(x,sin(x))
25

-->a=gca(); // Handle on current axes entity

-->a.y_location ="right";

-->clf()

Para centralizar ambos os eixos do gráfico (abscissa e ordenada), use


o comando:

// axis centered at (0,0)


plot(x-4,sin(x))
a=gca(); // Handle on axes entity
a.x_location = "middle";
a.y_location = "middle";

Exemplo especificando o tipo de linha e algumas propriedades


globais.

-->//LineSpec and GlobalProperty examples:

-->clf();

-->t=0:%pi/20:2*%pi;

-->plot(t,sin(t),'ro-.',t,cos(t),'cya+',t,abs(sin(t)),'--mo')

A Tabela 2.2 apresenta uma lista das propriedades a serem usadas


com o comando plot para especificar um tipo e cor de linha.

Tabela 2.2: Argumentos que especificam o tipo de linha.


Especificador Tipo de linha
- Linha sólida (default)
-- Linha tracejada
: Linha pontilhada
-. Linha tracejada-pontilhada

A Tabela 2.3 apresenta a linha das propriedades para atribuir uma


cor à linha desenhada.

Tabela 2.3: Argumentos que especificam a cor de uma linha.


Especificador Cor
r Vermelho
g Verde
b Azul
c Ciano
m Magenta
y Amarelo
k Preto
w Branco
26

A Tabela 2.4 especifica os tipos de marcadores empregados para os


pontos a serem desenhados.

Tabela 2.4: Argumentos que especificam os tipos de marcadores


para os pontos a serem desenhados nos gráficos
Especificador Tipo de marcador
+ Sinal de +
o Círculo
* Asterisco
. Ponto
x Sinal de multiplicação
‘square’ ou ‘s’ Quadrado
‘diamond’ ou ‘d’ Diamante
^ Triângulo voltado para baixo
∨ Triângulo voltado para cima
> Triangulo voltado para direita
< Triângulo voltado para esquerda
‘pentagram’ Estrela com cinco pontas
‘none’ Nenhum marcador

Especificando dados para serem plotados:

//Data specification
t=-%pi:0.1:%pi;
size(t)
plot(t) // simply plots y versus t vector size
clf(); // clear figure

plot(t,sin(t)); // plots sin(t) versus t


clf();

Desenhando subplots (quatro gráficos em uma janela)

-->subplot(221)

-->plot(t,sin(t)); // plots sin(t) versus t column by column this time

-->xtitle("sin(t) versus t")

-->subplot(222)

-->plot(t,sin(t)')

-->xtitle("sin(t)'' versus t")

-->subplot(223)

-->plot(t',sin(t))

-->a=gca();
27

-->a.data_bounds=[0 -1;7 1]; // to see the vertical line hiddden by


the y axis

-->xtitle("sin(t) versus t''")

-->subplot(224)

-->plot(t',sin(t)')

-->xtitle("sin(t)'' versus t''")

Gráficos mais elaborados podem ser construídos. Este tópico será


abordado em capítulos posteriores.

2.9 Manipulando funções

O Scilab permite que se defina uma função e a partir deste ponto se


calcule o valor desta função, uma vez fornecidos os valores das
incógnitas.
Exemplo:

funcao(x,y) = sin(x)+cos(y)-10

Sintaxe no Scilab:

deff('[R]=funcao(x,y)','R=sin(x)+cos(y)-10')

Calculando o valor da função em [2, 4]:

-->funcao(2,4)
ans =
- 9.7443462

2.10 Comandos especiais

Comando diary
O comando diary (‘nome_do_arquivo) permite que o Scilab grave em
um arquivo todos os dados de entrada e da maioria dos dados de
saída digitados no ambiente de trabalho, ou seja, gera umdiário de
uma sessão de trabalho. Este comando é útil quando se trabalha
diretamente na linha de comando. O comando diary(0) encerra este
comando.

Exemplo:
Na linha de comando digite: diary(‘exemplo.txt’). Digite os comandos
abaixo:
-->//Calculo da área de uma circunferência de raio 2 metros
28

-->r=2
r =

2.

-->area=%pi*r^2
area =

12.566371

-->diary(0)

Será gerado o arquivo exemplo.txt que conterá uma cópia de todos


os comandos digitados.

Comando who
Este comando é utilizado para listar os nomes de todas as variáveis
corrrentes utilizadas pelo Scilab.

Exemplo:
-->who
your variables are...

help scicos_pal %helps with_pvm WSCI home


SCIHOME PWD TMPDIR MSDOS SCI sparselib
xdesslib percentlib polylib intlib elemlib utillib
statslib alglib siglib optlib autolib roblib soundlib
metalib armalib tkscilib tdcslib s2flib mtlblib %F
%T %z %s %nan %inf COMPILER %gtk
%pvm %tk $ %t %f %eps %io
%i %e
using 6646 elements out of 5000000.
and 49 variables out of 9231

your global variables are...

LANGUAGE %helps demolist %browsehelp LCC


%scipad_language INDEX
using 1123 elements out of 11000.
and 7 variables out of 767

Comando whos
Este comando é utilizado para listar todos os nomes, tipos e memória
utilizada pelas variáveis.

-->whos
Name Type Size Bytes

whos function 7688


help function 2408
scicos_pal string 12 by 2 2048
%helps string 27 by 2 16
with_pvm function 352
WSCI string 1 by 1 176
home string 1 by 1 144
SCIHOME string 1 by 1 224
29

PWD string 1 by 1 144


TMPDIR string 1 by 1 184
MSDOS boolean 1 by 1 16
SCI string 1 by 1 112
sparselib library 256
xdesslib library 2816
percentlib library 12760
polylib library 928
intlib library 1368
elemlib library 1808
utillib library 4544
statslib library 1280
alglib library 1336
siglib library 1816
optlib library 584
autolib library 2168
roblib library 1264
soundlib library 464
metalib library 3880
armalib library 488
tkscilib library 824
tdcslib library 752
s2flib library 1936
mtlblib library 5504
%F boolean 1 by 1 24
%T boolean 1 by 1 24
%z polynomial 1 by 1 56
%s polynomial 1 by 1 56
%nan constant 1 by 1 24
%inf constant 1 by 1 24
COMPILER string 1 by 1 40
%gtk boolean 1 by 1 24
%pvm boolean 1 by 1 24
%tk boolean 1 by 1 24
$ polynomial 1 by 1 56
%t boolean 1 by 1 24
%f boolean 1 by 1 24
%eps constant 1 by 1 24
%io constant 1 by 2 32
%i constant 1 by 1 32
%e constant 1 by 1 24
%pi constant 1 by 1 24

Definindo variáveis como variáveis locais ou variáveis globais


No Scilab uma variável pode ser definida como variável local ou
variável global.
Ordinariamente, cada função no Scilab, tem suas próprias variáveis
locais e podem “ler” todas as variáveis criadas no espaço de trabalho
ou pela chamada no argumento da função. Definindo uma variável
como global, esta passa a poder ser “lida” ou “escrita” através de
funções.
Resumindo, as variáveis globais são válidas no ambiente do Scilab
enquanto as variáveis locais são válidas apenas no escopo de uma
função.

OBS: Se ao definir uma variável como global ela ainda não possuir
um valor, esta será iniciada como uma matriz vazia.
30

Comando clear e clearglobal


O comando clear apaga todas as variáveis que não são pré-definidas
pelo Scilab ou não estão protegidas. Normalmente, as variáveis
protegidas são aquelas da biblioteca padrão e variáveis com o prefixo
% (porcentagem).

Exemplo:

-->a=10
a =

10.

-->clear a

-->a
--error 4
undefined variable : a

O comando clearglobal apaga todas as variáveis globais do espaço de


trabalho do programa Scilab. A sintaxe é clearglobal nome_variável.

2.11 Manipulação de arquivos e diretórios

Comando pwd
O programa Scilab possui comandos que podem ser utilizadas para
manipular arquivos e diretórios. O comando pwd mostra o diretório
no qual se está trabalhando.

-->pwd
ans =

C:\Documents and Settings\user\Meus documentos\Usuarios\Ajgcruz\Projet


os\EQ_Scilab

Comando dir
O comando dir exibe o conteúdo do diretório corrente.

-->dir
ans =

Apostila_Curso Material_diverso SCILAB_dialogs.pdf


Apostila_Web MoreOnScilabGraphics.pdf intro.pdf
Arquivos_diversos ODE_Scilab.pdf scilab12.pdf
CD_Curso Pagina Web Curso Scilab.rtf
Divulgacao Projeto_Extensao

Comando ls
O comando ls também exibe o conteúdo do diretório corrente (na
forma de um vetor coluna).
31

-->ls
ans =

Apostila_Curso

CD_Curso

teste.txt

Material_diverso

Arquivos_diversos

Divulgacao

Pagina Web Curso Scilab.rtf

Projeto_Extensao

Apostila_Web

ODE_Scilab.pdf

SCILAB_dialogs.pdf

intro.pdf

MoreOnScilabGraphics.pdf

scilab12.pdf

Comando chdir
Utilizando o comando chdir é possível mudar o diretório de trabalho.

-->chdir CD_Curso
ans =

0.

-->dir
ans =

Capa_CD.doc Documentation Programa puffin_logo_small.gif

Comando mkdir
Este comando permite a criação de um diretório diretamente da linha
de comando do Scilab. No exemplo cria-se o diretório <teste> e na
seqüência emprega-se o comando dir para confirmação.

-->mkdir('teste')
ans =

1.

-->dir
ans =
32

Capa_CD.doc Documentation Programa puffin_logo_small.gif teste

Comando format
O comando format define o formato de impressão de um número.
Exemplo:
-->x=[100 %eps];

-->format('e',10);x
x =

1.000D+02 2.220D-16

-->format('v',10);x
x =

100. 2.220D-16
33

Capítulo 3

3. MATEMÁTICA COM SCILAB

3.1 Um pouco mais de vetores

Como já foi apresentado no capítulo anterior, é muito simples criar


um vetor no Scilab. Um vetor pode ser composto de: números
escalares, polinômios, números complexos, etc.

-->x=poly(0,'x');
-->a=[1 6];
-->b=[1/x, a*x, x**2]
b =

2
1 x 6x x
- - --- -
x 1 1 1

Para criar um vetor com zeros basta utilizar o seguinte comando:

-->zeros(1,5)
ans =

0. 0. 0. 0. 0.

De maneira similar, existe um comando para criar um vetor com


números um:

-->ones(0:5)
ans =

1. 1. 1. 1. 1. 1.

3.1.1 Operações com vetores

Soma de dois vetores


No Scilab dois vetores podem ser somados se tiverem a mesma
dimensão:

-->x=[1 3 5];
-->y=[2 3 7];

-->x+y
ans =

3. 6. 12.

Um vetor também pode ser somado a um escalar:


-->x + 1
34

ans =

2. 4. 6.

Multiplicação de vetor por escalar


A multiplicação de um vetor por um escalar é realizada da seguinte
forma:

-->5*x
ans =

5. 15. 25.

Multiplicação de vetor por vetor


Vetores de mesmo tamanho podem ser multiplicados entre si
elemento a elemento (com o operador .*). Também é possível fazer
uma multiplicação matricial entre vetores (com o operador *), desde
que o número de colunas do primeiro seja igual ao número de linhas
do segundo.

-->vetor1 = [1 2 3]
vetor1 =

1. 2. 3.

-->vetor2
vetor2 =

0.4 4.5 6.

-->vetor1*vetor2
--error10
Multiplicação incoerente

-->vetor1.*vetor2
ans =

0.4 9. 18.

Um vetor também pode ser elevado ao quadrado ou mesmo a outro


vetor elemento a elemento:

-->vetor1^2
ans =

1. 4. 9.

-->vetor1 .^ vetor2

ans =

1. 22.627417 729.
35

Norma de um Vetor
No Scilab é possível calcular a norma de um vetor empregando os
comandos:

norm(x)=norm(x,2) : dada pela distância entre as extremidades


do vetor

1
 n  2
x 2 =  ∑ xi2 
 i =1 

norm(x,1) : soma dos módulos dos elementos do vetor

n
x 1 = ∑ xi
i =1

norm(x,’inf’) : máximo valor (em módulo) entre os


elementos do vetor

x ∞
= max1≤i≤n xi

Dimensão de um vetor
A dimensão de um vetor é obtida empregando-se o comando size.
Exemplo:

-->x=[1 2 3.5 6.3]


x =

1. 2. 3.5 6.3

-->size(x)
ans =

1. 4.

Você pode obter especificamente o número de linhas ou


especificamente o número de colunas de um vetor adicionando
respectivamente as opções ‘r’ (do inglês rows) ou ‘c’ (do inglês
columns) à função size:

-->size(x,’r’)
ans =

1.

-->size(x,’c’)
ans =

4.
36

Transpondo um vetor
Um vetor pode ser transposto da seguinte forma:

-->x
x =

1. 2. 3.5 6.3
-->x'
ans =

1.
2.
3.5
6.3

Acessando um elemento de um vetor


Pode-se acessar um elemento de um vetor através do seguinte
comando:

-->x
x =

1. 2. 3.5 6.3

-->x(3)
ans =

3.5

Também é possível trocar um elemento de um vetor:

-->x(3)=0.5
x =

1. 2. 0.5 6.3

Para vetores maiores, pode ser útil acessar múltiplos elementos de


uma vez, como no exemplo abaixo.

‐‐>y = 1:10
y =

1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

‐‐>y([2:5,8])=0
y =

1. 0. 0. 0. 0. 6. 7. 0. 9. 10.

Repare como o vetor y está recebendo outro vetor como argumento


para acessar seus elementos 2 a 5 e mais o elemento 8. Seria
igualmente possível fazer o seguinte:
-->y = 1:10
y =
37

1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

-->vetor=[2:5,8]
vetor =

2. 3. 4. 5. 8.

-->y(vetor)=0
y =

1. 0. 0. 0. 0. 6. 7. 0. 9. 10.

O último elemento do vetor é acessado pelo caractere $:


-->y($)
ans =

10.

-->y($-3:$)=2
y =

1. 0. 0. 0. 0. 6. 2. 2. 2. 2.

3.2 Matrizes

Operações básicas com matrizes

A Tabela 3.1 apresenta uma lista de operações estruturais e


matriciais.

Tabela 3.1: Operações estruturais e matriciais comuns.


Operação Comando Comentário
Scilab
Soma estrutural A+B Soma de matrizes estrutural é
idêntica à matricial
Subtração estrutural A-B Subtração de matrizes estrutural é
idêntica à matricial
Multiplicação estrutural A.*B Multiplicação elemento a elemento
de A e B. As duas matrizes
precisam ter a mesma forma, ou
uma delas ser um escalar.
Multiplicação matricial A*B Multiplicação das matrizes A e B. O
número de colunas em A precisa
ser igual ao número de linhas em
B.
Divisão à direita A./B Divisão elemento a elemento de A
estrutural e B: a(i,j)/b(i,j). As duas matrizes
precisam ter a mesma forma, ou
uma delas ser um escalar.
Divisão à esquerda A.\B Divisão elemento a elemento deA
estrutural e B: b(i,j)/a(i,j) . As duas matrizes
precisam ter a mesma forma, ou
uma delas ser um escalar.
Divisão matricial à A/B Divisão matricial definida por A *
38

direita inv(B), onde inv(B) é a inversa da


matriz B.
Divisão matricial à A\B Divisão matricial definida por
esquerda inv(A)*B, onde inv(A) é a inversa
da matriz A.
Expoente estrutural a.^b Expoente elemento a elemento de
A e B: a(i,j)^b(i,j). As duas
matrizes precisam ter a mesma
forma, ou uma delas ser um
escalar

* Operações estruturais: são operações entre matrizes executadas


elemento a elemento; a operação é executada sobre os elementos
correspondentes nas matrizes.

Transposta de uma matriz


A transposta de uma matriz é obtida da mesma forma que para um
vetor:

-->A=[1 3 3.5;0.5 1 2;2.5 7 4]


A =

1. 3. 3.5
0.5 1. 2.
2.5 7. 4.

-->A'
ans =

1. 0.5 2.5
3. 1. 7.
3.5 2. 4.

Determinante de uma matriz


O comando det() é empregado para calcular-se o determinante de
uma matriz.

-->A
A =

1. 3. 3.5
0.5 1. 2.
2.5 7. 4.

-->det(A)
ans =

2.5

Inversa de uma matriz


Emprega-se o comando inv() para calcular-se a inversa de uma
matriz. Para

-->inv(A)
39

ans =

- 4. 5. 1.
1.2 - 1.9 - 0.1
0.4 0.2 - 0.2

Para ser possível invertê-la, a matriz deve ser quadrada e ter


determinante não nulo. Você também pode obter a inversa de uma
matriz fazendo A^-1. Para inverter cada elemento da matriz um a
um, você deve usar o comando A.^-1.

Matriz identidade
No Scilab é possível gerar uma matriz identidade utilizando-se o
comando eye().

-->identidade=eye(5,5)
identidade =

1. 0. 0. 0. 0.
0. 1. 0. 0. 0.
0. 0. 1. 0. 0.
0. 0. 0. 1. 0.
0. 0. 0. 0. 1.

Dimensão de uma matriz


Emprega-se o mesmo comando utilizado para verificar a dimensão de
um vetor.

-->size(identidade)
ans =

5. 5.

Assim como para vetores, a opção ‘r’ dá apenas o número de linhas


da matriz e a opção ‘c’ dá o número de colunas. A opção ‘*’ dá o
número total de elementos da matriz:

-->size(identidade,'c')
ans =

5.

-->size(identidade,'*')
ans =

25.

Acessando elementos de uma matriz


É possível acessar um elemento de uma matriz fornecendo sua
posição após o nome da mesma, por exemplo:
40

-->M = [1 2 3; 4 5 6; 7 8 9]
M =

1. 2. 3.
4. 5. 6.
7. 8. 9.

-->M(3,2)
ans =

8.

Da mesma forma, pode-se trocar um elemento de uma matriz


através do seguinte comando:

-->M(3,2)=0
ans =

1. 2. 3.
4. 5. 6.
7. 0. 9.

As mesmas observações feitas sobre o acesso de elementos de


vetores valem para matrizes. Por exemplo, pode-se acessar, e se
desejável mudar, múltiplos elementos de uma matriz ou de um vetor.
Por exemplo, se queremos saber quais são os elementos da primeira
e da terceira linha da coluna 1:

-->M([1 2],1)
ans =

1.
4.

O último elemento de uma linha também pode ser acessado com o


caractere $:

-->M(3,$)
ans =

9.

É possível acessar todos os elementos de uma linha ou de uma


coluna usando dois pontos:
-->M(:,2)
ans =

2.
5.
0.

-->M(2,:)
ans =

4. 5. 6.
41

Rank (Posto) de uma matriz


Ordem do menor determinante não nulo que se extrai de uma matriz.

-->C=[1 2 0 -1; 2 6 -3 -3; 3 10 -6 -5]


C =

1. 2. 0. - 1.
2. 6. - 3. - 3.
3. 10. - 6. - 5.

-->rank(C)
ans =

2.

Matriz singular
Pode-se determinar se uma matriz é ou não singular avaliando seu
número de condição. Se a resposta for um número muito grande, a
matriz é dita singular. Caso contrário, não.

-->D=[ 1 6 2; -2 3 5; 7 12 -4]
D =

1. 6. 2.
- 2. 3. 5.
7. 12. - 4.

-->det(D)
ans =

6.899D-15

-->cond(D)
ans =

1.345D+16
42

Capítulo 4

4. NOÇÕES DE PROGRAMAÇÃO

4.1 Programando com Scilab

O programa Scilab permite que o usuário possa criar seus próprios


programas. Apesar de simples, a linguagem do Scilab disponibiliza a
maioria das estruturas das linguagens de programação
convencionais. Um fato a ser observado é que o Scilab é um
interpretador de comandos, e que, portanto são executados em um
tempo maior que programas semelhantes escritos em linguagens
compiláveis como Fortran, Pascal, C, por exemplo.
O ambiente do Scilab permite que o usuário escreva códigos em
linguagem C ou Fortran e rode este código dentro do ambiente Scilab
(programação avançada).

4.2 Comandos para Iterações

Existem dois comandos que permitem a realização de iterações no


programa Scilab. São eles: o comando For e o comando While.

Comando For
O comando for tem a forma geral:

for variável = vetor_linha


instrução_1
instrução_2
................
instrução_n
end

-->// Exemplo do comando for em linha de comando

-->for i=1:3
-->a=i+1
-->end
a =

2.
a =

3.
a =

4.
43

Comando While
O comando while tem a seguinte forma:

while condição
instrucao_1
instrução_2
...............
instrução_n
end

O comando while realiza uma seqüência de instruções enquanto uma


determinada condição estiver sendo satisfeita. A condição geralmente
inclui comparações entre objetos. Na Tabela x.x, apresenta-se os
operadores que permitem realizar comparações entre valores de
objetos no Scilab.

Tabela 4.1: Operadores que podem ser utilizados para


realizar comparações entre valores de objetos.
== ou = igual a
< menor do que
> maior do que
<= menor ou igual a
>= maior ou igual a
<> ou ~= diferente

Comandos condicionais
O Scilab implementa dois tipos de comandos condicionais: if-the-else
e select case.

If-Then-Else
O comando if-then-else tem duas formas. Na forma mais simples, a
sintaxe é:

If condição_1 then
Seqüência_de_instruções_1
Else
Sequencia_de_instruções_2
End

Na forma mais geral, a sintaxe é:

If condição_1 then
Sequencia_de_instruções_1
Elseif condição_2
Sequencia_de_instruções_2
.........................
Elseif condição_n
Sequencia_de_instruções_n
44

End

Exemplo:
-->x=1
x =

1.

-->if x > 0 then, y=-x, else, y=x, end


y =

- 1.

-->x=-1
x =

- 1.

-->if x > 0 then, y=-x, else, y=x, end


y =

- 1.

Select case
O comando condicional select case tem a seguinte sintaxe:

Select variável_de_teste
Case expressão_1
Sequencia_de_instrucoes_1
Case expressão_2
Sequencia_de_instrucoes_2
........................
Case expressão_n
Sequencia_de_instrucoes_n
Else
Sequencia_de_instrucoes_n+1
End

Exemplo:
-->x=-1
x =

- 1.
-->select x, case 1, y = x+5, case -1, y=sqrt(x), end
y =

4.3 Definindo Scripts


Empregando os comandos save e load é possível armazenar e
recuperar valores de variáveis utilizadas no ambiente Scilab. Também
45

já foi apresentado o comando diary(), com o qual se cria um diário da


sessão realizada no Scilab.
Além desses dois tipos de arquivos, pode-se criar arquivos contendo
comandos do Scilab que serão executados posteriormente dentro do
seu ambiente. Um desses arquivos recebe o nome de scripts. Esses
arquivos possuem, por convenção, a extensão sce, sendo executados
através do comando:

--> exec (`nome_do_arquivo_script.sce`)

Todas as variáveis utilizadas no script permanecem ativas após a sua


execução.

Exemplo:

// Script: Raiz de equacao de segundo grau


//
// ax^2+bx+c=0
//
a=1;
b=-4;
c=4;
delta=b^2-4*a*c;
if delta > 0 then
x1=(b-sqrt(delta))/2/a;
x2=(b+sqrt(delta))/2/a;
mprintf('valor da raiz x1=%f\nvalor da raiz x2=%f',x1,x2);
elseif delta==0;
x1=b/2/a;
x2=x1;
mprintf('valor da raix x1=x2=%f',x1);
else delta < 0
mprintf('Nao tem raiz real');
end

4.4 Definindo Funções


Pode-se definir rapidamente uma função através do comando deff(),
com a forma dada pelos exemplos abaixo:

-->deff('y=umafuncao(x)', 'y=x^2')

-->z=umafuncao(5)
z =

25.

-->deff('[y1, y2]=outrafuncao(x1, x2)', 'y1=x1+x2, y2=x1*x2')

-->[a, b]=outrafuncao(3,4)
b =

12.
a =
46

7.

Geralmente o comando deff é usado para funções simples, com


poucas linhas de código. Para funções mais complicadas pode ser
conveniente declarar uma função em um arquivo separado. Nesse
caso a função obedece a uma estrutura da forma:

function [y1, ..., yn] = nome_da_funcao(x1,..., xm]


Instrução_1
Instrução_2
.................
Instrução_p
endfunction

Onde nome_da_funcao é o nome da função, xi (i=1,2,...,m) são seus


argumentos de entrada e Yi (i=1,2,...,n) são seus argumento de
saída.

As principais características de uma função, independente de como é


declarada, são:

a) variáveis definidas dentro da função (variáveis locais) não são


vistas pelo ambiente Scilab “fora da função”.
b) na chamada da função, os nomes das variáveis de entrada e de
saída não precisam ser iguais aos seus nomes na declaração da
função;
c) uma função, após ser definida, pode ser chamada várias vezes
e a qualquer tempo.

Uma função também pode ser digitada em um arquivo, e este


arquivo, após carregado no ambiente Scilab, é executado. Por
convenção, as funções têm a extensão sci. Os seguintes comandos
são empregados para carregar a função no Scilab:

--> exec nome_da_funcao.sci


ou
--> exec(‘nome_da_funcao.sci’)

Exemplo:

No arquivo:
function [y1,y2]=minhafuncao(x1,x2)
y1=x1-x2
y2=x1+x2
endfunction

No ambiente Scilab
-->exec minhafuncao.sci
47

-->[m1, m2]=minhafuncao(1,3)
m2 =

- 2.
m1 =

4.

A mesma função também pode ser definida através de vetores, em


vez dos pares de variáveis x1,x2 e y1,y2:

No arquivo:
function y = minhafuncao(x)
y(1) = x(1)-x(2)
y(2) = x(1)+x(2)
endfunction
ou:
function y = minhafuncao(x)
y = [x(1)-x(2) ; x(1)+x(2)]
endfunction

No ambiente Scilab
-->exec minhafuncao.sci

--> m = minhafuncao([1 3])


m =

- 2.
4.
48

Capítulo 5

5. MÉTODOS NUMÉRICOS EMBUTIDOS

5.1 Sistemas Lineares


O Scilab dispõe de uma função que permite resolver sistemas de
equações lineares. A forma mais simples desta função é:

x=linsolve(A,b)

Por exemplo, dado o seguinte sistema de equações lineares:

2 x + y − 2 z = 10
3x + 2 y + 2 z = 1
5 x + 4 y + 3z = 4

Colocado na forma matricial, tem-se:

 2 1 − 2  x 10 
     
A=  3 2 2  x=  y  b=  1 
5 4 3  z 4
     

No Scilab, tem-se:

-->A
A =

2. 1. - 2.
3. 2. 2.
5. 4. 3.

-->b
b =

10.
1.
4.

-->linsolve(A,-b)
ans =

1.
2.
- 3.

A solução também pode ser obtida multiplicando a matriz inversa de


A por b. O sistema de equações pode ser escrito como o produto
matricial A*x=b; multiplicando-se a matrix inversa dos dois lados
temos inv(A)*A*x=x=inv(A)*b
49

-->inv(A)*b
ans =

1.
2.
- 3.

5.2 Sistemas Não-Lineares


Para resolver sistemas não-lineares existe no Scilab a função fsolve,
dada na sua forma mais básica por:

x = fsolve(x0,funcao)

Onde x é a raiz da equação chamada pela função de nome funcao e


x0 é o chute inicial para a solução.

Exemplo:

--> deff(‘y=f(x)’,’y=x^3-exp(x)’)
ou num arquivo:
function y = f(x)
y = x^3-exp(x)
endfunction

--> x0 = 1.5;
--> x = fsolve(x0,f)
x =

1.8571839

Também é possível usar fsolve para resolver sistemas de equações


não lineares.

Exemplo:
function y = g(x)
y = [x(1)-x(2)^2 ; x(1)*x(2)+1]
endfunction

--> x0 = [-0.1 ; -0.1];


-->x=fsolve(x0,g)
x =

1. -1

Quando uma função tem parâmetros extras, é possível passá-los


junto com a função na forma de uma lista:

--> deff('y=h(x,a,b)','y=exp(x)-a*sqrt(x)+b')
--> x = fsolve(1.5,list(h,2,-3)) // a = 2 e b = -3
x =

1.7279352
50

5.3 Mínimos quadrados


É possível ajustar uma função por método dos mínimos quadrados
usando a função leastsq(), cuja forma mais simples é:

[fopt,aopt]=leastsq(desvio2,a0)

Vamos explicar o que significa cada uma dessas variáveis por meio de
um exemplo, mas antes disso vamos simular a coleta de pontos
experimentais usando a função rand(). Se não receber nenhum
argumento, rand() gera um número pseudoaleatório entre 0 e 1, se
receber dois argumentos rand(m,n) gera uma matriz de dimensão m
por n.

Suponha que uma certa grandeza y medida em relação a outra x


obedece a uma lei do tipo y = a1x²+a2. Os valores medidos
experimentalmente não são precisos, têm um erro associado à
medida. Se o valor verdadeiro dos parâmetros a1 e a2, ainda
desconhecidos pelo experimentador forem 3 e -1 respectivamente,
esse erro pode ser simulado da seguinte forma:

--> x = 1:5;
--> erro = 0.4*(rand(1,10)-0.5)
erro =

0.1533555 0.0610054 - 0.0769564 0.1731846 - 0.1141597

--> y_exp = 3*x^2-1 + erro


y_exp =

2 2.1533555 11.061005 25.923044 47.173185 73.88584

Subtraímos 0.5 de rand para podermos ter valores tanto positivos


quanto negativos para o erro e o multiplicamos por 0.4 para poder
influenciar na amplitude do erro.

Agora que já temos os valores “experimentais”, vamos tentar


encontrar os parâmetros “desconhecidos” a1 e a2 usando o método
dos mínimos quadrados. Para isso precisamos declarar duas funções:

function y = func(x,a)
y = a(1)*x^2+a(2)
endfunction

function y = desvio(a,x,y_exp)
y = func(x,a)-y_exp
endfunction

--> a0 = [1 1]; // chute inicial


-->[soma2,a]=leastsq(list(desvio,x',y_exp'),a0)
a =

2.9932112 - 0.8860378
51

soma2 =

0.0512337

Os mínimos quadrados retornam a1 = 2.99 e a2 = -0.886, bem


próximos do valor de 3 e -1 que escolhemos antes de acrescentar o
erro “experimental”. A variável soma2 é a soma dos desvios ao
quadrado.

Repare também que na chamada da função leastsq, x e y_exp são


passados transpostos. Isso porque geralmente as funções com
métodos numéricos do Scilab são pré-programadas para trabalhar
com vetores coluna, e não vetores linha, que podem causar uma
mensagem de erro.

5.4 Derivação e integração


Derivar e integrar numericamente no Scilab é muito simples. A
função diff() aproxima a derivação por diferenças centrais, por
exemplo:

-->deff('y=f(x)','y=x^3/3');
-->x = 0:2:10
x =

0. 2. 4. 6. 8. 10.

-->f(x)
ans =

0. 2.6666667 21.333333 72. 170.66667 333.33333

-->diff(f(x))./diff(x)
ans =

1.3333333 9.3333333 25.333333 49.333333 81.333333

Sabemos que a derivada de x³/3 é x². No exemplo anterior


fornecemos os pontos x = 0, 2, 4, 6, 8 e 10. Note como o quociente
diff(f(x)./diff(x) dá valores aproximadamente iguais aos quadrados
dos pontos centrais x = 1, 3, 5, 7 e 9. Há um erro numérico de
0.3333333 em todos eles, o que é uma limitação da aproximação.

A função derivative() usa métodos mais sofisticados para a


diferenciação e dá os valores das derivadas exatamente nos pontos x,
e não nos pontos centrais.

-->deff('y=f(x)','y=x^3/3');
-->x = 0:2:10
x =

0. 2. 4. 6. 8. 10.

-->f(x)
52

ans =

0. 2.6666667 21.333333 72. 170.66667 333.33333

-->derivative(f,x')
ans =

1.222D-11 0. 0. 0. 0. 0.
0. 4. 0. 0. 0. 0.
0. 0. 16. 0. 0. 0.
0. 0. 0. 36. 0. 0.
0. 0. 0. 0. 64. 0.
0. 0. 0. 0. 0. 100.

Note como a função derivative() retorna uma matriz em vez de um


vetor. Isso porque, como veremos a seguir, essa função também
serve para aproximar matrizes jacobianas e hessianas de funções de
mais de uma variável:
function y = sisfun(x)
y = [2*x(1) + 3*x(2) – x(3);
x(1)^2 + x(3);
x(1) – 2*x(2) – x(3)^2];
endfunction

Este é um sistema de 3 equações e 3 variáveis, por isso para calcular


a matriz jacobiana em um ponto do espaço devemos fornecer um
vetor x com 3 coordenadas, por exemplo:

-->x=[2,2,3]
-->J=derivative(sisfun,x')
J =

2. 3. - 1.
4. 0. 1.
1. - 2. - 6.

Para integrar uma função usamos as funções integrate() ou intg().


A função integrate() lida com funções definidas dentro da própria
chamada da função e calcula a integral ao longo de todo um vetor,
por exemplo:

-->a = 2
a =

2.

-->b = 3
b =

3.

-->x = a:.25:b
x =

2. 2.25 2.5 2.75 3.


53

-->I = integrate('3*x^2','x',a,x)
I =

0. 3.390625 7.625 12.796875 19.

O primeiro argumento de integrate é a definição da função que você


quer integrar, escrita entre aspas; o segundo argumento é a variável
de integração, também escrita entre aspas; o terceiro é o limite
inferior de integração; e o quarto é o vetor ao longo do qual você
deseja que a integral seja computada (não é necessário que o vetor
tenha o mesmo nome que a variável de integração).

A função intg() é mais simples e permite que você passe uma função
definida anteriormente:

-->deff('y=f(x)','y=3*x^2')

-->a = 2, b = 3
a =

2.
b =

3.

-->intg(a,b,f)
ans =

19.

5.5 Sistemas de EDO


A função ode() soluciona equações diferenciais ordinárias e sistemas
de equações diferenciais ordinárias. A chamada mais simples da
função tem a forma:

y=ode(y0,x0,x,f)

Um exemplo de aplicação é dado pela resolução da EDO y’ = -y

function dy!dx = f(x,y)


dy!dx = -y
endfunction

Repare como apesar de a função não depender explicitamente da


variável independente x, a função é declarada dependendo de x e de
y. Isso é importante porque ode() exige que a função a ser integrada
tenha ambos os argumentos e nessa ordem.

-->y0 = 1;

-->x0 = 0;

-->dx = .1;
54

-->xf = 1;

-->x = x0:dx:xf;

-->y = ode(y0,x0,x,f)
y =

column 1 to 6

1. 0.9048375 0.8187308 0.7408183 0.6703200


0.6065306

column 7 to 11

0.5488117 0.4965853 0.4493290 0.4065697 0.3678795

A solução analítica para a equação diferencial anterior é y = exp(-x).


Vamos comparar o resultado encontrado com a resposta analítica:

-->plot(x,y,'o'), plot(x,exp(-x));

-->xlabel('x'),ylabel('y');

-->xtitle("Solução da equação diferencial dy/dx=-y");

-->xgrid();

-->legend("Solução da EDO","Solução analítica");

Figura 5.1: Resolução de EDO.


55

Observe como a legenda pode ser habilitada pelo comando


legend(“legenda da primeira coisa a ser plotada”, “legenda da
segunda coisa a ser plotada”, ... , “legenda da última coisa ser
plotada”).

Se sua função depender de outros parâmetros, eles podem ser


passados na forma de lista, por exemplo, se modificarmos a função
do exemplo anterior:

function dy!dx = f(x,y,a,b)


dy!dx = a*y+b
endfunction

-->a = -2; b = 1;

-->y = ode(y0,x0,x,list(f,a,b));

É possível igualmente resolver um sistema de equações diferenciais:

function dy!dx = g(x,y,a)


dy!dx(1) = a(1,1)*y(1) + a(1,2)*y(2) + a(1,3)*y(3) - x
dy!dx(2) = a(2,1)*y(1) + a(2,2)*y(2) + a(2,3)*y(3) + x
dy!dx(3) = a(3,1)*y(1) + a(3,2)*y(2) + a(3,3)*y(3) + exp(-x)
endfunction

-->a
a =

- 1. 0. 1.
1. 3. 1.
2. 0. 0.

-->a = [-1 0 1; 1 3 1; 2 0 0];

-->x0 = 0;

-->x = x0:.1:1;

-->y0 = [1 0 -1];

Especial cuidado com os vetores é necessário quando você resolve


um sistema de EDO. Como há 3 variáveis no sistema de equações,
y(1), y(2) e y(3), e 11 tempos entre 0 e 1 são computados, espera-
se que a solução seja uma matriz 3x11 ou 11x3. Se sua resposta vier
como algo diferente ela não está errada, mas apenas embaralhada.
Por exemplo, a resposta abaixo não é desejável:

-->y = ode(y0,x0,x,list(g,a))
y =

column 1 to 7

1. 0. - 1. 0.8185720 0.0108997 - 0.7235762 0.6691076


56

column 8 to 12

0.0477968 - 0.4891743 0.5448947 0.1186064 - 0.2902332

column 13 to 17

0.4404197 0.2339895 - 0.1214920 0.3511405 0.4083017

column 18 to 22

0.0212336 0.2733010 0.6608731 0.1412338 0.2037784

column 23 to 27

1.0177365 0.2410526 0.1399580 1.5139583 0.3226071

column 28 to 32

0.0796300 2.1967848 0.3872836 0.0209045 3.1298888

column 33

0.4360149

Mas ela pode ser consertada transpondo o vetor das condições iniciais
ou declarando-o diretamente como vetor coluna em vez de vetor
linha:

-->y = ode(y0',x0,x,list(g,a))
y =

column 1 to 6

1. 0.8185720 0.6691076 0.5448947 0.4404197 0.3511405


0. 0.0108997 0.0477968 0.1186064 0.2339895 0.4083017
- 1. - 0.7235762 - 0.4891743 - 0.2902332 - 0.1214920 0.0212336

column 7 to 11

0.2733010 0.2037784 0.1399580 0.0796300 0.0209045


0.6608731 1.0177365 1.5139583 2.1967848 3.1298888
0.1412338 0.2410526 0.3226071 0.3872836 0.4360149

Ao trabalhar com tantas variáveis, pode ser interessante plotar os 3


gráficos de uma única vez usando um laço for, isso pode ser feito
num script:

colors = ['r','g','b']
for i = 1:3
plot(x,y(i,:),colors(i))
end

xlabel('abscissa x'), ylabel('ordenada y')


xtitle('Resolução de um sistema de EDO')
legend('y(1)','y(2)','y(3)');
57

Figura 5.1: Resolução de sistema de EDO.


58

Bibliografia

Pires, P. S. M. Introdução ao Scilab – Versão 3.0, obtida em


http://www.dca.ufrn.br/~pmotta

Caro, A. A. e Sepúlveda, C. V. Fundamentos de Scilab y aplicaciones


– Versão 0.1, obtida em
http://www.scilab.org/contrib/displayContribution.php?fileID=262

------------------------------------------------------------------------------

Licença do Scilab
(Disponível no seguinte endereço:
http://www.scilab.org/legal/license.html)

Licença da logomarca
(Disponível no seguinte endereço:
http://www.scilab.org/legal/licensetrademarkscilab.html)

Você também pode gostar