Capítulo 4 - INTRODUÇÃO AO USO DO MATLAB

Propaganda
Introdução aos Processos Químicos
Capítulo 4 - INTRODUÇÃO AO USO DO MATLAB
4. 1 - Objetivo
O objetivo deste Capítulo é permitir ao aluno dominar o conceito, a lógica e os
comandos básicos presentes no Matlab. Pretende-se também familiarizar o aluno que
nunca teve contato com programação com conceitos elementares presentes em
diversas linguagens de computação científica.
É importante que a leitura seja acompanhada da realização de exercícios no
próprio Matlab, permitindo assim uma melhor compreensão dos tópicos apresentados.
Para orientar este estudo, há uma seqüência de exemplos ao longo do texto com
tarefas computacionais com dificuldade crescente e compatíveis com o assunto recém
abordado.
4.2 - Introdução
Com o desenvolvimento da indústria de informática, máquinas cada vez mais
poderosas passaram a estar disponíveis a um custo cada vez menor. Este fenômeno
alterou de forma marcante os rumos das ciências da engenharia, permitindo precisão e
velocidade no processamento de informações. Em virtude deste cenário, o domínio
das principais ferramentas computacionais passou a ser um requisito básico para o
engenheiro moderno.
Apesar da existência no mercado de um grande número de programas para a
resolução dos mais diversos problemas de engenharia, um profissional deve conhecer
os fundamentos de, pelo menos, uma linguagem de programação, uma vez que o
desenvolvimento de ferramentas computacionais é uma atividade de grande
importância nas áreas acadêmica, de pesquisa, de desenvolvimento e de engenharia
básica. É comum a crença, principalmente entre iniciantes, de que os simuladores de
processos comerciais são capazes de resolver todo e qualquer tipo de problema. Isto
não é verdade, nenhum programa disponível tem utilização universal. É muito comum
a necessidade de que o usuário, na solução de um problema específico de seu
interesse, seja obrigado a programar módulos para serem acoplados aos programas
comerciais, tornando-os assim passíveis de serem utilizados.
109
Introdução aos Processos Químicos
O Matlab (Matrix laboratory) é um ambiente, que permite o desenvolvimento
de programas (rotinas) computacionais, semelhante a uma linguagem de programação
(FORTRAN, PASCAL, BASIC, etc.). Ele dispõe ainda de poderosos recursos para a
apresentação de resultados gráficos e processamento de matrizes.
Apesar do Matlab ser bastante versátil, o desenvolvimento de programas no
ambiente Matlab é uma tarefa mais simples do que as análogas utilizando as
linguagens de programação tradicionais.
4.3 – Ambiente de Trabalho
Quando o Matlab é acionado, surge na tela do computador uma janela (janela
de comando/command window) com um pequeno texto introdutório na parte superior.
Logo abaixo, a esquerda, aparece o símbolo ( » ), com o cursor piscando ao lado. Essa
linha é chamada linha de comando (command line).
É através da janela de comando que o usuário se comunica com o software,
introduzindo as instruções através da linha de comando, com o acionamento da tecla
ENTER. O símbolo ( » ) indica que o software está pronto para receber as instruções
do usuário.
•
Exemplo 4.3.1:
Digite:
» 238*436
Nota: Não esqueça de pressionar, após a digitação, a tecla ENTER. Lembre-se que
esta observação vale para todos os exemplos apresentados.
Observe que o resultado da operação de multiplicação digitada na linha de
comando aparece logo abaixo dessa linha, precedida por: ans = .
•
Exemplo 4.3.2:
Digite:
•
» clc (este comando apaga a tela)
Exemplo 4.3.3:
Digite:
» 258/652 , 56*48
A vírgula permite que mais de um comando seja introduzido de uma só vez. O Matlab
executa os comandos da esquerda para a direita e apresenta os resultados, um acima
do outro, na ordem de execução.
110
Introdução aos Processos Químicos
4.4 - Acesso ao “Help”
A existência de um comando de ajuda (“help”) no Matlab permite ao
estudante, uma vez dominando os comandos básicos do software, explorar ao longo
do tempo uma quantidade cada vez maior de recursos, em um processo de autoaprendizado contínuo.
O comando “help” pode ser acessado através da barra de menu (como qualquer
“software for Windows” convencional) ou diretamente da linha de comando, como
indica o exemplo:
•
Exemplo 4.4.1:
» help quad
4.5 - Operações Aritméticas
A linha de comando pode ser utilizada como uma calculadora científica, como
nos Exemplos 4.3.1 e 4.3.3. No quadro a seguir são apresentados os símbolos que
representam cada operação aritmética:
Operação
Soma
Subtração
Multiplicação
Símbolo
+
*
Operação
Divisão
Potenciação
Símbolo
/
^
4.5.1 - Funções
O Matlab disponibiliza um grande número de funções matemáticas. Exemplos
destas funções podem ser encontrados na tabela a seguir:
Função
Módulo de x
Raiz quadrada de x
Exponencial (base natural)
Logaritmo natural de x
Logaritmo decimal de x
Resto de x/y
Comando
abs(x)
sqrt(x)
exp(x)
log(x)
log10(x)
rem(x,y)
Função
seno de x
cosseno de x
tangente de x
arco-seno de x
arco-cosseno de x
arco-tangente de x
Comando
sin(x)
cos(x)
tan(x)
asin(x)
acos(x)
atan(x)
As funções indicadas são representadas por expressões com letras minúsculas,
seguidas dos argumentos entre parênteses. Como será visto adiante, o Matlab vê
diferença entre letras minúsculas e letras maiúsculas. Todos os comando Matlab são
em letras minúsculas.
111
Introdução aos Processos Químicos
Outro ponto importante é que os argumentos das funções trigonométricas e os
resultados de suas inversas são expressos em radianos.
Deve-se tomar cuidado para não fazer confusão ao utilizar as funções
logarítmicas. Em textos, a notação usual para o logaritmo na base natural é ln(x) – a
função correspondente no Matlab é log(x) - enquanto o logaritmo na base 10 é
normalmente representado por log(x) – no Matlab log10(x).
4.5.2 - Ordem dos Cálculos
Os cálculos aritméticos são realizados sempre segundo a seguinte ordem:
1) Operações dentro dos parênteses (interno → externo);
2) Funções;
3) Potenciação;
4) Multiplicação e divisão;
5) Soma e subtração.
Operadores de mesma hierarquia são efetuados da esquerda para a direita.
•
Exemplo 4.5.2.1:
Utilizando o Matlab, determine o valor da expressão:
 (9,8 − 0,8) 
 (4 − ln(10)) 


(
245
)
124
=
?
Esta expressão matemática é escrita na forma adequada para o Matlab da
seguinte forma:
» ((9.8-0.8)/(4-log(10)))^(245/124)
e o seu resultado é igual a 27.0011 .
Observe que as vírgulas nas expressões para o Matlab são representadas por
pontos, pois ele utiliza a forma inglesa de representar os números decimais.
•
Exemplo 4.5.2.2:
Determine o resultado das seguintes operações:
a)
433 − 256
23,45 × 47
 (483 − 234) 
b) 3,21 + 133 
 sen(ln(2))
3


Os resultados são: a) 0.1606 ; b) 7.0567e+003 .
112
Introdução aos Processos Químicos
Lembre-se que o resultado 0.1606 na realidade representa 0,1606. Observe também
que a notação científica utilizada pelo Matlab não usa o símbolo x 10exp comum em
textos. Assim:
1,2 x 106
≡ 1.2e+006 = 1.2e6
9,9 x 10-12 ≡
9.9e-012 = 9.9e-12
no Matlab e
no Matlab.
4.6 - Variáveis
4.6.1 Conceito de Variável
Uma variável pode ser considerada como um objeto armazenado na memória
do computador. Uma variável é composta por um nome (cadeia de letras e/ou
números necessariamente iniciada por uma letra) e o seu conteúdo (objeto armazenado
naquela variável). Neste primeiro contato com o Matlab, será considerado que o
objeto armazenado tem natureza numérica, podendo ser um escalar ou uma matricial.
As variáveis ficam armazenadas no chamado espaço de trabalho do Matlab.
Na criação do nome de uma variável pode-se utilizar letras maiúsculas ou
minúsculas, entretanto não se pode esquecer que o Matlab faz distinção entre elas, ou
seja, a e A são variáveis diferentes no Matlab.
Uma vez que a variável armazena um valor numérico, ela pode participar
plenamente de operações aritméticas, nas quais ela substitui o valor numérico nela
armazenado. Por exemplo, se as variáveis A e B correspondem, respectivamente, aos
valores numéricos 10 e 20, então:
» A+B
é equivalente a:
» 10 + 20
4.6.2 - Comando de Atribuição
Para armazenar um valor numérico em uma variável, utiliza-se o comando de
atribuição. Este comando apresenta a seguinte estrutura:
Nome da variável = Valor numérico
O valor numérico armazenado na variável pode estar representado por uma
expressão aritmética ou até mesmo pela combinação de uma ou mais variáveis.
Observe o exemplo a seguir:
113
Introdução aos Processos Químicos
•
Exemplo 4.6.2.1:
Qual é o valor da variável Casa ?
» A=3 , B=45+234
» Casa = sqrt(A+B)
» Casa=Casa*3
O resultado é igual a 50,3786.
Ao fazer o exemplo anterior, você observou que após inserir cada comando de
atribuição o Matlab informa na janela de controle o resultado da operação realizada.
Você pode evitar isto, adicionando após cada comando de atribuição o símbolo (;).
Veja a diferença na janela de controle quando você entra as operações do exemplo
4.6.2.1 da seguinte forma:
» A=3 ; B=45+234 ;
» Casa = sqrt(A+B) ;
» Casa=Casa*3 ;
Note que após você inserir a última atribuição o Matlab não apresenta a solução. Isto
ocorre em função do ponto e vírgula após o último comando de atribuição. Entretanto,
ao final destas operações o valor numérico 50,3786 encontra-se armazenado na
variável Casa. Você pode confirmar isto inserindo:
» Casa
No exemplo, a não colocação do ponto e vírgula no final da última linha de comando
faz com que o valor final armazenado na variável Casa seja apresentado na janela de
comando.
4.6.3 - Comandos de Entrada e de Saída
Os comandos de entrada e saída são responsáveis pela comunicação de dados
entre o usuário e o espaço de trabalho do Matlab.
Ao trabalhar na janela de controle, a definição de um valor para uma variável e
a sua inserção no espaço de trabalho é feita pelo usuário, utilizando o comando de
atribuição (Seção 4.6.2).
Na elaboração de programas, o programador define a utilização de uma
determinada variável, e pode conferir valores para ela através de comando de
atribuição ou através do comando de entrada input. Ao rodar um programa, quando
encontra este comando, o computador interrompe temporariamente a execução e
114
Introdução aos Processos Químicos
apresenta uma mensagem na janela de comando solicitando que o usuário entre com o
valor da variável. Após a inserção do valor, o programa volta a rodar
automaticamente.
A sintaxe do comando input é a seguinte:
Nome da variável = input('mensagem')
•
Exemplo 4.6.3.1:
» w = input('Entre com o valor da variável')
O resultado da inserção deste comando é o aparecimento na janela de comando do
texto entre ‘ ‘. Você deve então inserir o valor desejado.
Caso, em algum momento ao longo de um programa, seja necessário
apresentar uma mensagem na tela, utilize o comando disp('mensagem'). Note que, de
forma distinta do que ocorre com o comando input, o comando disp não para a
execução do programa.
•
Exemplo 4.6.3.2:
» disp('Valores das variáveis Casa e w') , Casa , w
•
Exemplo 4.6.3.3:
Verifique a diferença entre os comandos:
» C=40
» D=50;
» C,D
4.6.4 - Gerenciamento de Variáveis
Quando, em algum momento, é necessário determinar quais variáveis estão
definidas no espaço de trabalho, é utilizado o comando who.
•
Exemplo 4.5:
» who
Uma vez que uma variável foi definida através do Matlab, ela ganha um
espaço no espaço de trabalho e fica armazenada até o momento em que a janela de
comando é fechada (término de uma seção de utilização do Matlab). Assim, quando
uma tarefa no Matlab é finalizada e outra é logo iniciada na mesma sessão de trabalho,
115
Introdução aos Processos Químicos
é indesejável que os valores das variáveis do trabalho anterior interfiram no novo
trabalho. Utiliza-se então dos comandos clear ou clear all. A sintaxe destes comandos
é:
•
» clear nome da variável
(Apaga a variável identificada)
» clear all
(Apaga todas as variáveis armazenadas)
Exemplo 4.6.4.1:
Execute a seguinte seqüência de comandos:
» A=30;
» A
(existência de A confirmada pela indicação de seu valor)
» clear A
» A
(a variável A não existe mais no espaço
de trabalho)
5 - Arquivos de Comandos
A entrada de informações através da linha de comando pode se tornar
inconveniente, principalmente em grandes problemas, pois requer a introdução dos
comandos um a um, seqüencialmente. Além disso, caso seja necessário repetir um
procedimento, todos os comandos devem ser novamente digitados.
Para permitir a realização de tarefas mais complexas, o Matlab possibilita a
criação de arquivos de comandos (“script files”).
Arquivos de comandos são arquivos texto onde é armazenada uma seqüência
qualquer de comandos, que pode vir a ser executada a qualquer momento, quando
necessário. Estes arquivos desempenham tarefa equivalente aos programas fonte
utilizados nas linguagens de programação convencionais. Através de um arquivo de
comandos é possível acionar outros arquivos de comandos.
Os arquivos de comandos devem ser escritos no bloco de notas (notepad editor de texto disponível no Windows) e sempre gravados com a extensão “.m”.
Versões mais recentes do Matlab já trazem um editor incorporado.
Para executar um arquivo de comandos, deve-se apenas digitar o nome do
arquivo na linha de comando. No entanto, é necessário antes da execução do arquivo,
116
Introdução aos Processos Químicos
indicar ao Matlab em que local da máquina (subdiretório) se encontra o arquivo. Para
esta tarefa, é possível utilizar o comando path, ou, alternativamente, o comando cd.
As respectivas sintaxes são:
» path(path,'endereço do subdiretório')
» cd endereço do subdiretório
A seguir é apresentado, passo a passo, o procedimento básico para a criação de
um programa (arquivo de comandos):
- Passo 1
Inicialmente, deve-se identificar um subdiretório existente ou criar um novo
subdiretório, onde serão colocados seus arquivos de trabalho, por exemplo
subdiretório “prog”.
- Passo 2
Informe ao Matlab onde seus arquivos de comandos estarão localizados, por exemplo,
» path(path,'a:\prog')
ou então,
» cd a:\prog
- Passo 3
Abra um arquivo novo no bloco de notas ou no editor do Matlab, quando este estiver
disponível.
- Passo 4
Escreva neste arquivo os comandos do programa, como se estivesse na janela de
comando. Os comandos são colocados linha por linha ou, quando escritos na mesma
linha, devem estar separados por vírgula.
- Passo 5
Grave o arquivo de comandos com um nome apropriado, por exemplo, “trab.m”
(nunca esquecer da extensão “.m”). Usando o editor do Matlab, a extensão .m é
adicionada automaticamente.
- Passo 6
Passe para a linha de comando do Matlab e digite o nome do arquivo de comandos,
sem a extensão. No exemplo em questão seria digitado: » trab .
# Observação:
Após qualquer alteração realizada no programa, o arquivo deve ser novamente
117
Introdução aos Processos Químicos
salvo. Deve-se sempre ter em mente que o Matlab não lê o arquivo da tela e sim o que
encontra-se gravado no disco.
# Algumas dicas:
i) Introduza comentários nas listagens dos programas. Os comentários são linhas entre
os comandos destinadas apenas a descrever a função de certos trechos do programa.
Os comentários auxiliam no momento de corrigir possíveis erros (“bugs”), facilitando
também que uma outra pessoa possa entender o programa. Para colocar um
comentário utilize o símbolo “%” antes da linha. O Matlab não executa o que é escrito
a direita do símbolo %.
ii) Para evitar que na execução dos programas, variáveis anteriormente definidas
perturbem a seqüência de comandos, sugere-se que no início do arquivo seja
adicionado o comando clear all. Este comando nunca deve ser colocado no meio do
programa, pois caso isto aconteça, haverá a eliminação de todas as informações
geradas até aquele momento.
iii) Quando se desenvolve um programa formado por vários arquivos de comandos,
sugere-se criar um subdiretório só para o conjunto desses arquivos. Desta forma, cada
tarefa executada no Matlab deve possuir um subdiretório próprio. Esta medida facilita
o acesso aos arquivos, evitando confusões desnecessárias.
No exemplo a seguir é apresentado um arquivo de comandos (listagem de um
programa) com uma estrutura típica.
•
Exemplo 4.5.1:
Escreva um arquivo de comandos que realize a conversão de temperaturas em
°F, adicionadas via janela de comando, para °C e K. Este arquivo deve ser chamado
de convtemp.
% Programa para a conversão de temperaturas
% Inicialização
clc , clear all
% Entrada de dados
Tf = input('Digite a temperatura em graus Fahrenheit');
118
Introdução aos Processos Químicos
% Cálculos
Tc=(Tf-32)/9*5;
Tk=Tc+273.15;
% Apresentação dos Resultados
disp('Temperatura em graus Celsius');
Tc
disp('Temperatura em Kelvin');
Tk
Ao final da digitação o arquivo de ser salvo com o nome: convtemp.m.
•
Exemplo 4.5.2: (tente fazer e rode verificando se está certo)
Criar um programa para o projeto de tanques cilíndricos. O usuário deve
introduzir o diâmetro e a altura do tanque e o programa deve calcular o volume e a
área superficial total do tanque.
6 - Matrizes e Vetores
6.1 - Definição e Entrada de Matrizes e Vetores
Matrizes são arranjos bidimensionais de números. Nas matrizes, os valores
numéricos são organizados em n linhas e m colunas (dimensão n x m). Vetores são
matrizes formadas por apenas uma linha ou uma coluna (dimensão n x 1 ou 1 x m).
A introdução de um matriz no ambiente de trabalho pode ser feita diretamente
pela definição de seus elementos individuais:
» A(i,j) = valor numérico
onde (i,j) é a posição do elemento na matriz A , i representando a linha e j a coluna.
No entanto, é mais prático introduzir as matrizes de uma outra forma, como
está representado abaixo:
» A = [ A11 A12 ; A21 A22 ]
ou
» A = [ A11 , A12 ; A21 , A22 ]
onde A i , j representa o elemento na posição (i,j). Neste caso, todos os elementos são
envolvidos por colchetes. O ponto e vírgula indica a mudança de linha e em uma
determinada linha os elementos são separados por um espaço ou uma vírgula.
119
Introdução aos Processos Químicos
•
Exemplo 6.1.1:
Entre com a seguinte matriz:
34 −1
B= 

4 2
6.2 - Operações Matriciais
O Matlab possui a capacidade de realizar operações matriciais do mesmo
modo que as operações aritméticas envolvendo escalares. Os símbolos das operações
matriciais são apresentados na tabela a seguir:
Símbolo
+
*
Operação
Soma
Subtração
Multiplicação
•
Operação
Transposição
Matriz Inversa
Símbolo
'
inv(A)
Exemplo 6.2.1:
Calcule as seguintes operações matriciais no Matlab:
a)
A⋅B
d)
A
T
b)
A−C
e)
d ⋅A ⋅ d
c)
(A ) ⋅ (A)
−1
T
onde,
1 2
A=

5 3
 3 5 5
B= 

2 4 4 
 2 6
C=

 4 5
2 
d= 
3
Resultados:
 7 13 13 
a) 

21 37 37
 − 1 − 4
; b) 

 1 − 2
1 0
; c) 

0 1 
1 5
; d) 

2 3
; e) 73.
120
Introdução aos Processos Químicos
6.3 - Operações Elemento a Elemento
Além das operações tradicionais entre matrizes, o Matlab dispõe do recurso
das operações elemento a elemento. Quando aplicamos uma operação elemento a
elemento a uma matriz, a operação é aplicada separadamente a cada elemento da
matriz. Veja abaixo o exemplo da potenciação elemento a elemento:
1 2
A=

3 4
1 4 
A .^ 2 = 

9 16
,
As principais operações elemento a elemento são:
Símbolo
·*
·/
·^
Operação
Multiplicação
Divisão
Potenciação
# Observações:
i) Para realizarmos uma multiplicação ou divisão elemento a elemento entre duas
matrizes, estas devem ter a mesma dimensão (deve existir correspondência entre os
elementos).
ii) As operações de soma e subtração convencionais já são naturalmente operações
elemento a elemento, não necessitando assim de um caracter especial.
As funções matemáticas embutidas no Matlab (seno, exponencial, etc.) quando
aplicadas a matrizes geram resultados do tipo elemento a elemento.
•
Exemplo 6.3.1:
Indicar o resultado das seguinte operações matriciais elemento a elemento:
a) A .* C
b) sen(g)
onde A e C são as mesmas matrizes do Exemplo 6.2.1,
1 2
A=

5 3
 2 6
C=

 4 5
e

g = 0

π
2
π
3π
2

2π 

.
Resultados:
1 5
a) 

2 3
;
b) [0 1 0 − 1 0]
121
Introdução aos Processos Químicos
Observe que A * C ≠ A . * C . Outro ponto importante é que o Matlab possui
o valor de algumas variáveis muito utilizadas, como o número π . A variável que
armazeno o seu valor é pi.
6.4 - Manipulações de Matrizes e Vetores
O Matlab permite a manipulação de matrizes e vetores de maneira bastante
flexível. Você pode alterar e compor matrizes e vetores através de elementos
individuais, linhas, colunas ou até mesmo submatrizes.
Os principais recursos para esta manipulação são apresentados a seguir, através
de alguns.
6.4.1 - Vetores
•
Exemplo 6.4.1.1:
Digitando,
» x = 1:4
% Análogo a: x = [1:4]
obtém-se,
x=
1
2
3
4
ou seja, um vetor linha de 1 até 4, com os elementos separados por um incremento
unitário.
•
Exemplo 6.4.1.2:
Digitando,
» x = 1:0.5:4
obtém-se,
x=
1.0000
1.5000
2.0000
2.5000
3.0000
3.5000
4.0000 .
O vetor continua tendo os seus elementos variando de 1 a 4, mas o incremento entre
estes elementos passa a ser 0,5.
•
Exemplo 6.4.1.3:
Digitando,
» x = 0:2:10
122
Introdução aos Processos Químicos
gera-se o vetor,
x=
0
2
4
6
8
10
Pode-se também criar novos vetores através da seleção de “partes” de um vetor
existente:
» y = x(1:4)
gera o seguinte vetor originado de x :
y=
0
2
4
6
O vetor y contém do primeiro ao quarto elementos do vetor original x . Note que:
» y = x(2:5)
gera o seguinte vetor originado de x :
y=
2
4
6
8
6.4.2 - Matrizes
•
Exemplo 6.4.2.1:
Digitando,
» A=[ 2 3 ; 4 5 ] , B=[ 1 2 ; 4 6 ]
obtém-se,
A=
2
3
4
5
B=
1
2
4
6
A partir destas duas matrizes é possível criar uma terceira,
» C=[A,B]
gera no espaço de trabalho:
C=
2
3
1
2
4
5
4
6
123
Introdução aos Processos Químicos
Utilizando este conceito é possível compor matrizes complexas a partir de
submatrizes mais simples. Observa a matriz formada pelo comando:
» F=[A;B]
Note que ela é diferente da matriz C criada no Exemplo 6.4.2.1.
•
Exemplo 6.4.2.2:
O caracter (:) também pode ser utilizado em matrizes de maneira equivalente
àquela utilizada para vetores. Digitando,
» A=[ 1:4 ; 5:8 ]
cria-se no espaço de trabalho:
A=
1
2
3
4
5
6
7
8
Parte dessa matriz pode ser utilizada na formação de uma nova matriz:
» B = A(:,1:3)
% Igual a B = A(1:2 , 1:3)
B=
1
2
3
5
6
7
Note que a nova matriz contém todas as linhas da matriz original e apenas as
três primeiras colunas.
6.5 - Resolução de Sistemas Lineares
Através da representação matricial de um sistema linear, como o Matlab tem
todos os recursos do cálculo matricial, é possível facilmente determinar a sua solução.
Considere um sistema linear genérico, com duas variáveis (x1 e x2) e duas
equações:
A1,1x1 + A1, 2 x 2 = b1
A 2,1x1 + A 2, 2 x 2 = b 2
Este sistema pode ser representado matricialmente da seguinte forma,
 A1,1
A
 2,1
A1, 2   x1   b1 
=
A 2, 2   x 2   b 2 
ou seja,
A. x = b
124
Introdução aos Processos Químicos
A solução utilizando cálculo matricial é facilmente obtida através da pré−1
multiplicação dos dois lados da equação pela matriz inversa ( A ) da matriz dos
coeficientes ( A ). Assim:
A .A. x = A .b
-1
-1
⇒
x = A .b
-1
No Matlab esta operação é realizada pelo comando:
» x = inv(A) * b .
Uma forma alternativa de efetuar esta operação no Matlab é através do
seguinte comando:
» x = A\b
•
% ≡ b÷A
Exemplo 6.5.1:
Resolva o sistema de equações:
x+ y+z= 6
x − y + 4z = 11
x + 2 y + 3z = 14
A solução é: x = 1 ; y = 2 ; z = 3 .
6.6 - Exemplos de Aplicações de Operações Matriciais
• Exemplo 6.6.1:
Para facilitar o trabalho dos operadores de uma planta industrial, deseja-se
montar uma tabela que relacione a altura de líquido em um determinado tanque com o
seu volume. O tanque possui 2 m de diâmetro e altura máxima de 2 m. Preparar esta
tabela considerando um intervalo de 10 cm entre seus elementos.
# Sugestões: Utilize vetores coluna, operações elemento a elemento e composição de
vetores para formar matrizes.
125
Introdução aos Processos Químicos
• Exemplo 6.6.2:
Em uma unidade industrial três tanques cilíndricos (A, B e C) são
periodicamente alimentados com nitrogênio. Os diâmetros e as alturas dos tanques são
respetivamente: tanque A, 2 m e 3 m; tanque B, 1,5 m e 2 m e tanque C, 1,8 m e 2 m.
Em um determinado momento, a temperatura nos três tanques é igual a 25°C. A
instrumentação dos tanques indica as seguintes pressões: 1 atm, 2 atm e 3 atm,
respectivamente.
Calcular a massa de gás em cada tanque. Utilize a equação dos gases ideais
para descrever o comportamento do nitrogênio no interior dos tanques.
7 - Gráficos
7.1 - Gráficos Bidimensionais
A maneira mais prática para traçar gráficos bidimensionais é através da
utilização do comando plot. Este comando, em sua forma mais simples, apresenta a
seguinte sintaxe:
>> plot(x,y)
onde x é um vetor contendo as abcissas e y é um vetor contendo as ordenadas dos
pontos. Assim, as coordenadas dos pontos utilizados na construção do gráfico são (xi ,
yi ).
•
Exemplo 7.1:
Traçar o gráfico da função f(x) = x3 entre os valores de x = -2 e x = 2.
# Sugestão: Lembre-se das operações elemento a elemento.
Solução:
>> x = linspace(-2,2,50);
>> y = x .^3;
>> plot(x,y)
Observações:
i) O gráfico é formado em uma janela especial que recebe o nome de Figure
No.1. Esta janela pode ser manipulada como uma janela qualquer do Windows;
ii) Repita o exemplo criando o vetor x com somente cinco pontos. Ou seja, use:
>> x = linspace(-2,2,5);
O que ocorre com o resultado obtido? Curvas formadas a partir de um número de
126
Introdução aos Processos Químicos
pontos diferente têm formas diferentes, pois o Matlab une, automaticamente, os
pontos utilizados para a construção da curva da função desejada por retas.
Através do comando plot também é possível definir a cor e/ou a forma de
apresentar nos gráficos:
>> plot(x,y,'ct')
onde c e t indicam, respectivamente, o código da cor e o código do símbolo a ser
utilizado para marcar os pontos utilizados na construção do gráfico. Os códigos são
apresentados na Tabela 7.1.1. Teste as diversas formas de representação (símbolos)
para saber as possibilidades disponíveis.
Tabela 7.1.1 – Códigos para Cores e Símbolos em gráficos Matlab
Código
Cor
Código
Símbolo
y
amarelo
·
pontos
m
magenta
o
círculos
c
azul claro
x
xis
r
vermelho
+
cruzes
g
verde
*
asteriscos
b
azul
-
linha contínua
w
branco
:
tracejado
k
preto
-·
traço-ponto
--
linha interrompida
É possível traçar duas ou mais curvas em um mesmo gráfico, com apenas um
comando plot. A sintaxe para duas curvas é:
>> plot(x1,y1,'ct',x2,y2,'ct')
onde as indicações dos códigos de cores e símbolos ('ct') é opcional. Quando os
códigos não são informados é utilizado o procedimento padrão, ou seja, a linha
contínua é utilizada. A cor utilizada é definida aleatoriamente. É possível também
indicar somente um dos códigos.
Uma outra alternativa de sintaxe, quando todas as curvas apresentam a mesma
variável independente (abscissa), é:
>> plot(x,[ y1 y2])
127
Introdução aos Processos Químicos
Quando várias curvas são traçadas em um mesmo gráfico sem a indicação do
código de cores, o Matlab vai colorindo cada curva de acordo com a ordem da tabela
de cores (ver Tabela 7.1.1).
•
Exemplo 7.2:
Traçar os gráficos das curvas y = x2, w = x3, no intervalo entre -2 e 2.
7.2 - Gráficos Tridimensionais
7.2.1 Curvas
O procedimento para traçar curvas no espaço tridimensional é semelhante
aqueles empregados para as curvas 2-D, bastando apenas utilizar o comando plot3,
>> plot3(x,y,z)
>> plot3(x,y,z,'ct')
>> plot3(x1,y1,z1,'ct',x2,y2,z2,'ct')
•
Exemplo 7.3:
Traçar a curva parametrizada:
x = t . sen(t) ;
y = t . cos(t) ;
z=t;
no intervalo [0,20π].
7.2.2 Superfícies
A criação de gráficos de superfícies é realizada através de um conjunto de
etapas. Primeiro, deve-se definir os vetores das variáveis independentes, com a
seguinte sintaxe:
>> x= (limite inferior das variáveis x:incremento:limite superior das variáveis x);
>> y= (limite inferior das variáveis y:incremento:limite superior das variáveis y);
Note que os parênteses pode ser omitidos neste comando.
O próximo passo consiste em, a partir destes dois vetores, criar duas matrizes
especiais através do comando meshgrid:
>> [X,Y]=meshgrid(x,y)
128
Introdução aos Processos Químicos
A matriz X consiste no vetor x repetido através das linhas e a matriz Y consiste
no vetor y repetido em colunas. Estas matrizes servirão para a determinação do gráfico
da superfície.
O próximo passo é calcular o valor da variável dependente, por exemplo:
>> Z=X.^2+Y.^2;
Para traçar o gráfico da superfície utilize o comando surf, que a seguinte
sintaxe:
>> surf(X,Y,Z)
Além do comando surf, o Matlab dispõe de uma série de comandos
equivalentes que permitem visualizar a superfície de diferentes maneiras. Estes
comandos são: surfc, mesh, meshc, meshz, waterfall e contour3. Verifique a utilização
destes comandos utilizando o help do Matlab e fazendo alguns exemplos.
•
Exemplo 7.4:
Traçar o gráfico da superfície do exemplo apresentado no texto, entre os
intervalos x ∈[ −2,2] e y ∈[ −2,2] .
Para traçar curvas de nível das superfícies, utiliza-se o comando contour,
>> contour(X,Y,Z) .
7.3 - Identificação dos Gráficos
Para complementar a representação gráfica de uma curva ou de uma superfície,
existem uma série de comandos que permitem adicionar títulos e identificações dos
eixos.
7.3.1 - Títulos
Adiciona-se um título ao gráfico através do comando title,
>> title('Título Desejado')
7.3.2 - Identificações dos Eixos
A identificação dos eixos x, y e z do gráfico é realizada respectivamente
através do comandos xlabel, ylabel e zlabel,
>> xlabel('Eixo x') , ylabel(‘Eixo y’) , zlabel(‘Eixo z’)
•
Exemplo 7.5:
Refazer o Exemplo 7.1, colocando um título no gráfico e identificando os seus
eixos.
129
Introdução aos Processos Químicos
7.4 Organização para Apresentação de Gráficos
Quando um gráfico é traçado e, logo após, um segundo gráfico é construído, o
último gráfico substitui o primeiro na janela de apresentação criada.
Caso seja necessário, a apresentação dos dois gráficos pode ser feita em janelas
diferentes, mantendo-se assim a possibilidade de visualização dos dois gráficos
obtidos. O comando que eprmite isto é o figure. Observe a seqüência de comando a
seguir:
>> plot(x1,y1)
% este comando traça o primeiro gráfico
>> figure(2)
% este comando prepara uma segunda janela
>> plot(x2,y2)
% este segundo gráfico vai para a segunda janela
Para fechar uma janela, utiliza-se o comando close
>> close(n)
% Fecha a janela n
>> close all
% Fecha todas as janelas de gráfico abertas
7.5 - Exemplo Ilustrativo
•
Exemplo 7.6: (Adaptado de “Fundamentos de Transferência de Calor e Massa”,
Incropera, F. P. e De Witt, D. P.)
Quando um fluido escoa através de um tubo com temperatura de parede
constante, a temperatura média do fluido ao longo do comprimento do tubo se
aproxima gradativamente da temperatura da parede.
A equação que relaciona a temperatura média do fluido com a posição ao
longo do comprimento de um tubo circular é:
 πdh 
T ( x ) = Tp − (Tp − Te) exp −
x 
 m Cp 
Seja um exemplo cujos dados são apresentados a seguir. Apresente um gráfico
que mostre o valor da temperatura média de fluido (T(x)) ao longo do comprimento
do tubo (x). No mesmo gráfico deve também ser apresentado o valor da temperatura
da parede (Tp(x)) ao longo do comprimento do tubo. Incluir um título e a
identificação dos eixos.
Dados do problema:
130
Introdução aos Processos Químicos
Temperatura média do fluido na entrada do tubo: Te = 15°C;
Temperatura da parede do tubo: Tp = 100°C;
Diâmetro do tubo: d = 50 mm;
Coeficiente de transferência de calor médio: h = 756 W/(m2 K);
Vazão mássica do fluido: m = 0,25 kg/s;
Calor específico do fluido, a pressão constante: Cp = 4178 J/(kg K);
Comprimento total do tubo: L = 6 m.
Obs: Apresente os resultados em kelvin.
8 - Expressões Lógicas : Expressões Relacionais e Comandos
Condicionais
8.1 Expressões Relacionais
Expressões relacionais são utilizadas para comparar dois elementos. O
resultado da comparação pode ser falso (0) ou verdadeiro (1) (variável booleana). Os
operadores utilizados para compor as expressões relacionais são apresentados na
Tabela 8.1.1.
Tabela 8.1.1 – Operadores de Expressões Relacionais
•
Operador
Significado
Operador
Significado
==
igual
>=
maior ou igual
~=
diferente
<
menor
>
maior
<=
menor ou igual
Exemplo 8.1:
Verifique o resultado das seguintes expressões relacionais:
2>3
;
10+2==13
,
(2+3)^2 ~= (2^2+3^2) .
131
Introdução aos Processos Químicos
8.2 Expressões Lógicas
Expressões lógicas relacionam elementos do tipo verdadeiro (1) ou falso (0) –
variáveis booleanas. O resultado de uma expressão lógica é também um resultado tipo
verdadeiro/falso (1/0). Os principais operadores lógicos são apresentados na Tabela
8.2.1.
Tabela 8.2.1 – Operadores de Expressões Lógicas
Operador
Significado
&
and / e
|
or / ou
~
not / não
Sejam A e B duas variáveis booleanas. Os resultados dos operadores lógicos
envolvendo estas duas variáveis são mostrados na Tabela 8.2.2.
Tabela 8.2.2 – Resultados de Operações Lógicas
•
A
B
A&B
A|B
~A
0
0
0
0
1
0
1
0
1
1
1
0
0
1
0
1
1
1
1
0
Exemplo 8.2:
Verifique o resultado da expressão lógica a seguir:
not A and B
sendo
A = 0 e B = 1.
8.3 Expressões Mistas
Expressões mistas utilizam operadores lógicos e relacionais simultaneamente.
•
Exemplo 8.3:
Qual o resultado das expressões abaixo:
10 > 2 & 3 < 4
e
~(2^2~=4 or 3/5==0.6)
132
Introdução aos Processos Químicos
8.4 Comandos Condicionais
Comandos condicionais do tipo if/else/end (if/then/else em outras linguagens)
permitem, através da comparação entre dois elementos, direcionar os cálculos para
caminhos distintos. No Matlab, esses comandos apresentam duas estruturas
fundamentais: if-end e if-else-end, que são apresentadas a seguir:
•
Estrutura if-end:
if condição
seqüência de comandos
end
Caso a condição (expressão relacional, lógica ou mista) seja verdadeira, o programa
executa a seqüência de comandos. Caso seja falsa, o programa ignora a seqüência e
passa para o comando posicionado imediatamente após o end.
•
Estrutura if-else-end:
if condição
seqüência de comandos 1
else
seqüência de comandos 2
end
Se a condição (expressão relacional, lógica ou mista) for verdadeira, o programa
executa a seqüência de comandos 1. Caso a expressão seja falsa, o programa executa a
seqüência de comandos 2. Após realizar uma das duas seqüências, o programa passa
para o comando posicionado imediatamente a seguir do end.
As seqüências de comandos no interior das estruturas if-else-end também
podem incluir novos comandos if/else/end, gerando assim estruturas mais complexas.
Como exemplo, tem-se:
if condição 1
if condição 1a
seqüência de comandos 1a
end
seqüência de comandos 1b
else
133
Introdução aos Processos Químicos
seqüência de comandos 2
end
Note que ao escrever estes comandos, é comum se posicionar cada grupo de
comandos correspondentes iniciando em uma mesma coluna, de modo a tronar mais
simples o entendimento da seqüência de cálculos programada.
•
Exemplo 8.4:
Observe este trecho de programa, que identifica se a produção de uma fábrica
(prod) atingiu a meta (meta) ou não. Ele também identifica se a produção ficou abaixo
do limite aceitável (lim), emitindo textos que comentam o resultado.
if prod>=meta
disp(‘Parabéns, a meta de produção foi atingida’)
else
disp(‘Produção não atingiu a meta desejada’)
if prod<lim
disp(‘Produção abaixo do limite aceitável. Realizar auditorias’)
end
end
Há outras formas de organizar comandos do tipo if/else/end que executam a
tarefa do exemplo proposto. Proponha uma alternativa.
•
Exemplo 8.5:
Um tanque cilíndrico de dióxido de carbono resiste a uma pressão máxima de
3 atmosferas. As dimensões do cilindro são: diâmetro igual a 2 m e altura igual a 1,5
m.
Fazer um programa onde o usuário digite a temperatura no interior do tanque e
a massa de gás que será adicionada. O programa deve informar se a operação é segura
ou não. Verifique utilizando o programa desenvolvido, se a uma T = 27°C, uma massa
de gás igual a 30 kg pode ser adicionada.
Utilize a equação dos gases ideais para descrever o comportamento do gás no
interior do tanque.
134
Introdução aos Processos Químicos
9 - Comandos de Repetição (for e while)
9.1 - Comando for
O comando for causa a repetição de um trecho do programa um número de
vezes que é previamente determinado. Sua estrutura é:
•
Estrutura for:
for contador = valor inicial:passo:valor final
seqüência de comandos
end
Uma estrutura for deve ser montada considerando que o programa executa as
seguintes etapas:
1) No início do comando for, o programa atribui ao contador (uma variável) o seu
valor inicial definido no próprio comando;
2) A seqüência de comandos é executada quantas vezes forem especificadas, ou seja,
até o contador atingir o valor final especificado no programa. A atualização deste
contador é efetuada automaticamente utilizando como incremento o valor do passo
indicado no comando. Quando o valor do passo não é indicado, o Matlab considera o
passo unitário.
3) Quando o valor do contador ultrapassa o valor final especificado no comando for, o
processo termina e o programa passa a executar o comando imediatamente após o end.
Quanto o valor do passo não for especificado, será considerado,
automaticamente, igual a 1.
•
Exemplo 9.1:
Este programa calcula a produção média diária (med) a partir de um período de
tempo definido pelo usuário (N):
N = input(`Digite o número de dias de acompanhamento da produção = ’);
soma=0;
for d = 1:N
disp(‘Dia ’) , d
prod = input(‘Digite a produção do dia indicado = ’);
135
Introdução aos Processos Químicos
soma=soma+prod;
end
med=soma/N;
disp(‘A produção média diária é igual a ’) , med
•
Exemplo 9.2:
Séries infinitas são seqüências de somas de números. A utilização de séries
apresenta grande importância em diversos campos da engenharia química, como, por
exemplo, nos estudos de transferência de calor e da mecânica dos fluidos.
É possível calcular o valor de π com o auxílio de uma série:
π = 6s n , quando n → ∞ ;
 n 1
sendo s n = ∑ 2  .
 k =1 k 
Determine o valor de π utilizando a série com a soma de seus 100 primeiros
termos (n =100).
Há uma outra possibilidade de resolver o Exemplo anterior sem a utilização de
uma estrutura for. Pesquise o comando sum.
9.2 - Comando while
O comando while permite que um trecho do programa seja repetido, enquanto
uma determinada condição permanecer verdadeira. A sua estrutura é:
while condição
seqüência de comandos
end
A execução deste comando segue as seguintes etapas:
1) Verifica inicialmente se a condição é verdadeira. Caso seja verdade, segue para a
seqüência de comandos, caso contrário a execução passa para o restante do programa,
logo após o end;
2) Executa a seqüência de comandos;
3) Volta à etapa 1.
136
Introdução aos Processos Químicos
•
Exemplo 9.3:
Este trecho de programa é utilizado para determinar quantos reatores em série
(N) são necessários para que uma corrente de produto atinja a concentração desejada
(cdes). Considere que a concentração de saída de cada reator (cs) é determinada por
uma função chamada reat, que utiliza como dado de entrada (argumento) a
concentração de produto na corrente de entrada (ce).
Note que esta função reat não existe no Matlab. Mais adiante, será mostrado
como o usuário pode definir uma função para depois utilizá-la. Nesse exemplo, é
considerado que a função foi definida em um ponto anterior do programa.
Programa:
cs=0; , N=0
while cs<cdes
N = N+1; , ce=cs; , cs = reat(ce);
end
disp(‘Número de reatores em série necessários: ’)
N
•
Exemplo 9.4:
Equações do tipo:
x i = f ( x i −1 ) para i = 1 , 2 , 3 ...
são muito comuns em algoritmos que utilizam métodos numéricos resolvendo
problemas de engenharia.
Seja a seguinte equação recursiva,
xi =
1
( 3 − x i −1 ) 2
com x0 = 1
.
(i) Determine o valor de xi para o qual o valor absoluto da diferença (xi-xi-1) se torna
menor do que 10-4.
(ii) Observe qual a relação entre o resultado do processo recursivo do item (i) e a
equação:
x−
1
=0
(3 − x ) 2
.
Qual a conclusão que você chega? O que representa na realidade o valor de xi
determinado no item (i).
137
Introdução aos Processos Químicos
10 - Variáveis Indexadas
10.1 - Conceito
Variáveis indexadas são variáveis formadas por um conjunto de elementos
individuais, onde cada elemento apresenta uma posição definida no conjunto. Vetores
e matrizes, tal qual foram apresentados na Seção 6, são exemplos de variáveis
indexadas, onde a posição do elemento é indicada por um índice, no caso dos vetores,
ou dois índices, no caso das matrizes. Nas linguagens de programação usuais são
possíveis variáveis indexadas com mais de dois índices.
10.2 Utilização
As variáveis indexadas permitem ao programador gerenciar uma grande
quantidade de informações de maneira simples e organizada. Uma grande massa de
dados pode ser introduzida no computador através de apenas uma variável indexada,
possibilitando depois que os dados individuais possam ser manipulados indicando
apenas a sua posição no conjunto (índices).
O exemplo a seguir ilustra a aplicação deste tipo de variável.
•
Exemplo 10.1:
Em um sistema de controle de estoque em uma indústria química, um
programa recebe os níveis diários de aditivo em um tanque em um certo período,
calcula a massa de aditivo disponível em cada dia, e devolve os dados de resposta
indicando o dia, o nível do tanque, a massa de aditivo e um aviso nos dias em que a
massa de aditivo estever abaixo do limite mínimo.
% Leitura das informações à respeito do nível diário de aditivo
Ndias=input(‘Digite o número de dias analisados’);
for i=1:Ndias
disp(‘Dia’) , i
nivel(i)=input(‘Digite o nível do tanque (m)’);
end
% Rotina para cálculo das massas de aditivo em cada tanque
for i=1:Ndias
138
Introdução aos Processos Químicos
massa(i)=pi*D^2/4*nivel(i)*dens;
end
% Saída dos resultados
for i=1:Ndias
disp(‘Dia’) , i
disp(‘Nível do tanque’) , nivel(i)
disp(‘Massa de aditivo’), massa(i)
if massa(i)<lim , disp(‘Estoque abaixo do limite mínimo’) , end
end
Observação:
O emprego das operações elemento a elemento presentes no Matlab (Seção
6.3) permite simplificar bastante a utilização das variáveis indexadas, eliminando
muitas vezes a necessidade da utilização de laços for. É importante observar que este
recurso normalmente não está disponível nas demais linguagens de programação.
11 - Funções
11.1 – Conceito e Estrutura
Funções (“function files”) são uma classe especial de arquivos de comandos.
Sua mecânica de funcionamento é similar as funções definidas na matemática. As
funções recebem um ou mais argumentos, e partir destes argumentos, procedem a
execução de um conjunto de comandos, gerando na saída um ou mais resultados
numéricos. A grande vantagem das funções é que, uma vez definidas, elas podem ser
empregadas quantas vezes forem necessárias em um ou mais programas diferentes.
Com o objetivo de apresentar, na prática, como deve ser montado um arquivo
de função, considere a criação de uma função destinada a determinar a pressão de um
gás, a partir da temperatura e do volume, segundo a equação de estado dos gases
ideais.
A função deve ser criada em um arquivo exclusivo para ela. Todo arquivo de
função deve começar pelo comando function. Ao lado deste comando, escreve-se o
valor numérico da saída da função (no nosso caso p, a pressão) igualado ao nome da
função (eq), seguido pelos argumentos de entrada (T,V; respectivamente, temperatura
e volume).
139
Introdução aos Processos Químicos
function p = eq(T,V)
Seguem-se então o conjunto de definições, operações matemáticas e comandos
que permitirão a função determinar o valor numérico da saída. No exemplo em
questão:
R=8314;
p=R*T/V;
Finalmente, um arquivo de função deve ser gravado necessariamente com o
nome da função e a extensão “.m”. No exemplo acima, o arquivo deve ser gravado
como “eq.m”.
É possível, agora, utilizar a função de cálculo da pressão de um gás (eq) na
linha de comando, em um arquivo de comandos qualquer ou até mesmo em outra
função.
Por exemplo, o comando:
PT = eq(273.15,22.4);
calcula o valor da pressão de um kgmol de gás ideal para T = 273,15 K e V = 22,4 m3,
armazenando o resultado na variável PT.
Lembrem-se que, para que o Matlab possa reconhecer a função criada, deve-se
inicialmente indicar o “endereço” do arquivo (Seção 5).
•
Exemplo 11.1:
Criar uma função que faça a conversão de volume em ft3 para litros e m3.
11.2 Variáveis Locais e Globais
Quando um arquivo de comandos convencional é executado, as variáveis
envolvidas são manipuladas ao longo do programa, e, no final, continuam
armazenadas em um espaço de memória gerenciado pelo Matlab (“workspace”).
Tente, como exemplo, executar um arquivo de comandos e depois digite o comando
who.
Funções, no entanto, operam de maneira diferente. As variáveis definidas no
interior de uma função (variáveis locais) não são armazenadas após a execução da
função, e também não interferem com as demais variáveis externas. Da mesma
maneira, as operações matemáticas e os comandos utilizados no interior da função só
reconhecem as variáveis internas à função.
140
Introdução aos Processos Químicos
•
Exemplo 11.2:
Limpe as variáveis da memória do Matlab (comando clear all), execute uma
vez a função gerada no exemplo da Seção 11.1 e digite o comando who.
Caso seja necessário, é possível permitir que uma função reconheça uma ou
mais variáveis externas. Neste caso utiliza-se o comando global,
global A B C
onde A, B e C são nomes de variáveis.
O comando global deve ser incluído na função e também no arquivo de
comando onde as variáveis globais aparecem.
Em teoria, é possível nunca usar o comando global, introduzindo todos os
valores numéricos necessários para o cálculo da função, ou através do argumento, ou
definindo-os no interior da própria função. Mas este pode não ser o procedimento
mais prático sempre. Em um programa onde um grande número de parâmetros é
calculado através de um arquivo de comandos principal e depois estes parâmetros são
utilizados em várias funções diferentes, torna-se mais prático “distribuir” estes
parâmetros através do comando global.
12 - Bibliografia
“Notas de Aula do Curso de Computação I”
Eduardo Paz e Moacyr Azevedo
“Matlab - User`s Guide”
The MathWorks, Inc.
“Matlab - Versão do estudante - Guia do Usuário”
Makron Books
“Mini-Curso: Uma Introdução ao Mathematica” (Apostila)
Marcelo Castier
141
Download