Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
c
ao ao MATLAB
Outubro de 2013
Sum
ario
1 Ambiente de programac
ao
1.1
1.2
1.3
Janela de comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.1
1.1.2
Configuracao do editor . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.3
Uso do editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.1
Comando help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.2
Comando lookfor . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 Elementos fundamentais
2.1
2.2
11
Constantes e variaveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.1.1
Arranjos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
2.1.2
Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
2.1.3
Variaveis literais . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
2.1.4
Variaveis especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
Expressoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
SUMARIO
ii
2.3
2.4
2.2.1
Expressoes aritmeticas . . . . . . . . . . . . . . . . . . . . . . . . . .
23
2.2.2
Expressoes logicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
2.2.3
Ordem de precedencia . . . . . . . . . . . . . . . . . . . . . . . . . .
31
2.2.4
Expressoes literais . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
Graficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
2.3.1
Graficos bidimensionais . . . . . . . . . . . . . . . . . . . . . . . . . .
34
2.3.2
Graficos tridimensionais . . . . . . . . . . . . . . . . . . . . . . . . .
38
2.3.3
41
Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
3 Linguagem de programac
ao
3.1
3.2
3.3
45
45
3.1.1
Formato de exibicao . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
3.1.2
Espaco de trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
3.1.3
Diario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
3.1.4
49
Estruturas condicionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
3.2.1
Estrutura if-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
3.2.2
Estrutura if-else-end
. . . . . . . . . . . . . . . . . . . . . . . . .
54
3.2.3
Estrutura if-elseif-end . . . . . . . . . . . . . . . . . . . . . . . .
55
Estruturas de repeticao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
3.3.1
Estrutura for-end . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
3.3.2
Estrutura while-end . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
SUMARIO
3.3.3
3.4
3.5
59
Arquivos M . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
3.4.1
Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
3.4.2
62
3.4.3
Subprograma function . . . . . . . . . . . . . . . . . . . . . . . . .
63
3.4.4
Depuracao de programa . . . . . . . . . . . . . . . . . . . . . . . . .
66
3.4.5
Gerenciamento de arquivos . . . . . . . . . . . . . . . . . . . . . . . .
66
Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
4 Func
oes para C
alculo Num
erico
4.1
4.2
4.3
iii
69
Algebra
linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
4.1.1
Decomposicoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
4.1.2
Inversa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
74
4.1.3
Solucao de sistemas . . . . . . . . . . . . . . . . . . . . . . . . . . . .
74
4.1.4
Autovalores e autovetores . . . . . . . . . . . . . . . . . . . . . . . .
75
4.1.5
Normas e condicao . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
78
4.2.1
78
4.2.2
Interpolacao unidimensional . . . . . . . . . . . . . . . . . . . . . . .
78
4.2.3
Ajuste polinomial . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
80
Integracao numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
4.3.1
Formula de Newton-Cotes . . . . . . . . . . . . . . . . . . . . . . . .
82
4.3.2
Quadratura de Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
SUMARIO
iv
4.4
4.5
84
4.4.1
84
4.4.2
Calculo de razes . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
86
4.4.3
88
Medidas de tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
89
5 Implementac
ao de algoritmos
5.1
5.2
5.3
5.4
91
Interpolacao polinomial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
91
5.1.1
Polinomios de Newton . . . . . . . . . . . . . . . . . . . . . . . . . .
91
5.1.2
Implementacao e uso . . . . . . . . . . . . . . . . . . . . . . . . . . .
91
Sistemas lineares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93
5.2.1
93
5.2.2
Sistemas triangulares . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
5.2.3
Implementacao e uso . . . . . . . . . . . . . . . . . . . . . . . . . . .
95
Integracao numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
99
5.3.1
99
5.3.2
Quadratura de Gauss-Legendre . . . . . . . . . . . . . . . . . . . . .
99
5.3.3
Implementacao e uso . . . . . . . . . . . . . . . . . . . . . . . . . . .
99
5.4.2
Pref
acio
MATLAB (R), acronismo de MATrix LABoratory, e um sistema interativo e linguagem de
programacao para computacao numerica e visualizacao para as areas cientficas e tecnicas.
Seu elemento basico de dados e uma matriz. O MATLAB permite a solucao de muitos
problemas numericos em uma fracao do tempo que seria necessario para escrever um programa em uma linguagem como FORTRAN, C ou Pascal. Alem do mais, em MATLAB
as solucoes dos problemas sao expressas de um modo bem proximo do que elas sao escritas
matematicamente. MATLAB e marca registrada da
The MathWorks, Inc.
3 Apple Hill Drive
Natick, Massachusetts 01760 USA
www.mathworks.com.
Existem versoes profissionais do MATLAB para computadores com sistemas operacionais
Linux, Windows e Mac. Tambem, sao disponveis versoes de estudante para estes sistemas.
O objetivo deste texto e apresentar o MATLAB como uma linguagem de programacao dotada
de funcoes nao disponveis nas linguagens convencionais. Por isso, este material pode ser
utilizado em disciplinas, tais como, Programacao de Computadores, Algoritmos e Estruturas
vi
Captulo 1
Ambiente de programa
c
ao
A interacao entre o MATLAB e o usuario e feita por intermedio de uma janela, na qual um
comando e fornecido e o resultado exibido. No caso de d
uvida sobre a sintaxe ou mesmo a
existencia de um comando, o MATLAB possui meios de auxiliar o usuario durante a sessao.
1.1
Janela de comando
Para executar o MATLAB em ambiente Windows, o cursor deve ser colocado sobre o seu
cone e pressionado o botao da esquerda do mouse e no caso de ambiente Unix deve-se entrar
com o comando matlab no terminal. Aparecera a janela de comando pela qual sera feita a
interacao entre o MATLAB e o usuario. O sinal de que o programa esta pronto para receber
um comando e indicado pelos caracteres >>. A Figura 1.1 mostra a janela de comando para
o ambiente Windows.
longo, entao tres pontos (...) seguidos do pressionamento da tecla Enter ou Return indica
que o comando continuara na proxima linha. Comandos m
ultiplos podem ser colocados em
uma mesma linha se eles forem separados por vrgulas ou ponto-e-vrgulas. Alem disso, as
vrgulas servem para mostrar os resultados e os ponto-e-vrgulas para suprimir a exibicao.
Todo texto apos o sinal de % e considerado comentario sendo usado para a documentacao
de um programa. As teclas e servem para listar os comandos previamente usados e as
teclas e movem o cursor na linha de comando possibilitando a sua modificacao.
O n
umero de linhas a serem exibidas de cada vez na janela de comando pode ser redefinida
pelo comando more. Sua sintaxe e
more(<n
umero-de-linhas>)
onde <n
umero-de-linhas> define o n
umero de linhas a serem exibidas. O comando e desativado por more off, enquanto que more on define um n
umero de linhas de modo a ocupar
toda a janela de comando.
A execucao de um comando pode ser interrompida a qualquer instante bastando para isto
pressionar as teclas Control e C, simultaneamente. O comando clc e usado para limpar
a janela de comandos e home posiciona o cursor no canto superior esquerdo da janela de
comando. O termino de execucao do MATLAB e feito pelos comandos quit ou exit.
Quando o MATLAB for ativado, os comandos contidos no arquivo matlabrc.m sao automaticamente executados para que sejam atribuidos valores a alguns parametros. Nesta fase
tambem sao executados os comandos do arquivo startup.m, caso ele exista. O usuario pode
criar, em seu proprio diretorio, o arquivo startup.m contendo, por exemplo, definicao de
constantes matematicas e fsicas, formatos de exibicao ou quaisquer comandos para personalizar a sua janela de comando.
A abrangencia e potencialidade do MATLAB esta muito alem do que sera mostrado neste
texto, por isso e aconselhavel executar o comando demo para visualizar uma demonstracao
e se ter uma ideia dessa potencialidade.
1.1.1
Mudan
ca do diret
orio corrente
O diretorio corrente e aquele considerado em uso, sem ser necessario especifica-lo explicitamente durante uma acao. Para se saber qual o diretorio corrente utiliza-se o comando pwd
(print working directory):
>> pwd
% mostrar o diret
orio de trabalho corrente
ans =
C:\Users\ffcampos\Documents\MATLAB
O diretorio corrente pode ser alterado por meio do comando cd (change directory). Se for
usar um pendrive, inser-lo em uma porta USB e verificar a qual drive ele foi associado. Por
exemplo, se foi ao drive D:, executar
>> cd d:
>> pwd
ans =
D:\
1.1.2
% mudar o diret
orio de trabalho corrente para D:
Configura
c
ao do editor
Inicialmente, deve-se especificar qual o editor a ser usado. Para tal, clicar com o mouse
na opcao File no canto superior esquerdo e segurando o botao, arrastar o cursor ate
Preferences e ao aparecer uma tela selecionar Editor/Debugger. Entao, surgira uma
tela como a da Figura 1.2. Em Editor, clicar em MATLAB Editor para especificar o editor
padrao do MATLAB ou escolher outro de preferencia do usuario.
1.1.3
Uso do editor
Para se editar um arquivo novo, clicar na opcao File no canto superior esquerdo da janela de
comando e arrastar o cursor para New e em seguida para Script para editar um programa ou
para Function no caso de uma funcao. Ao aparecer a tela do editor, como a da Figura 1.3,
o usuario podera digitar o codigo do programa ou funcao. Por exemplo, editar
mensagem = al^
o mam~
ae
Por se tratar de um arquivo novo, ou seja, nao previamente editado, ele deve ser salvo com
um nome a ser fornecido, por exemplo, alo.m (todo arquivo MATLAB deve ter a extensao
.m). Para tanto, clicar na opcao File, dentro do editor, e arrastar o cursor para Save
As (salvar como), e fornecer o nome alo.m. Para executar o programa alo.m ele deve ser
chamado,
Para editar uma function, por exemplo, de nome normafun.m usar as opcoes File -->
New --> Function do editor. A seguir editar o texto abaixo e nao se esquecer de salva-lo
com o nome normafun.m,
function norm2 = normafun(y)
% NORMAFUN
norma-2 de vetor
n = length(y);
soma = 0;
for i = 1:n
soma = soma + y(i)^2;
end
norm2 = sqrt(soma);
end % normafun
>> n2 = normafun(w)
% chamar a fun
c~
ao normafun. Observar que os nomes
% das vari
aveis de entrada n~
ao s~
ao necessariamente
% iguais aos da defini
c~
ao da fun
c~
ao.
n2 =
6
>> whos
Name
Size
n2
w
1x1
1x4
% verificar a presen
ca somente de n2 e w
Bytes Class
Attributes
8
32
double
double
Para sada com mais de um parametro, alterar a primeira linha da funcao para
function [norm2, n] = normafun(y)
e executar
>> [n2, n] = normafun(w)
n2 =
6
n =
4
>> whos
Name
Size
n
n2
w
1.2
% chamar a fun
c~
ao com 2 par^
ametros de sa
da
% verificar a presen
ca, agora, de n2, w e n
Bytes Class
Attributes
1x1
1x1
1x4
8
8
32
double
double
double
Existem muito mais comandos do que aqueles apresentados neste texto, o que torna mais
difcil relembra-los. Com o intuito de auxiliar o usuario na procura de comandos, o
MATLAB prove assistencia por meio de suas extensivas capacidades de auxlio direto. Estas capacidades estao disponveis em tres formas: o comando help, o comando lookfor e
interativamente por meio de um menu de barras, no caso da versao para ambiente Windows.
1.2.1
Comando help
O comando help e a maneira mais simples de obter auxlio no caso de se conhecer o topico
em que se quer assistencia. Sua sintaxe e
help <t
opico>
onde <t
opico> e o nome da funcao ou de diretorio. Por exemplo,
>> help sqrt
SQRT
Square root.
SQRT(X) is the square root of the elements of X. Complex
results are produced if X is not positive.
See also sqrtm, realsqrt, hypot.
Reference page in Help browser
doc sqrt
Assim, sao produzidas informacoes sobre a funcao sqrt para extrair raiz quadrada. O
comando help funciona a contento quando se conhece exatamente o topico sobre o qual se
quer assistencia. Considerando que muitas vezes este nao e o caso, o help pode ser usado
sem <t
opico> para listar todos os topicos de auxlio primario,
>> help
HELP topics:
matlab/general
matlab/ops
matlab/lang
matlab/elmat
matlab/randfun
matlab/elfun
matlab/specfun
matlab/matfun
matlab/datafun
matlab/polyfun
matlab/funfun
matlab/sparfun
matlab/scribe
matlab/graph2d
matlab/graph3d
matlab/specgraph
matlab/graphics
matlab/uitools
matlab/strfun
matlab/imagesci
matlab/iofun
matlab/audiovideo
matlab/timefun
matlab/datatypes
matlab/verctrl
matlab/codetools
matlab/helptools
matlab/demos
matlab/timeseries
matlab/guide
matlab/plottools
toolbox/local
controllib/general
controllib/graphics
optim/optim
optim/optimdemos
shared/optimlib
toolbox/stats
shared/statslib
symbolic/symbolic
perms
nchoosek
factorial
Coordinate transforms.
cart2sph
- Transform Cartesian to spherical coordinates.
cart2pol
- Transform Cartesian to polar coordinates.
pol2cart
- Transform polar to Cartesian coordinates.
sph2cart
- Transform spherical to Cartesian coordinates.
hsv2rgb
- Convert hue-saturation-value colors to red-green-blue.
rgb2hsv
- Convert red-green-blue colors to hue-saturation-value.
1.2.2
Comando lookfor
O comando lookfor prove assistencia pela procura em todas as primeiras linhas dos topicos
de auxlio do MATLAB e retornando aquelas que contenham a palavra-chave especificada.
O mais importante e que a palavra-chave nao precisa ser um comando. Sua sintaxe e
lookfor <palavra-chave>
- Identity matrix.
- Sparse identity matrix.
Apesar de a palavra identity nao ser um comando do MATLAB, ela foi encontrada na
descricao de duas funcoes, para uma dada instalacao. Tendo esta informacao, o comando
help pode ser usado para exibir informacoes a respeito de um comando especfico, como por
exemplo,
>> help eye
EYE Identity matrix.
EYE(N) is the N-by-N identity matrix.
EYE(M,N) or EYE([M,N]) is an M-by-N matrix with 1s on
the diagonal and zeros elsewhere.
EYE(SIZE(A)) is the same size as A.
1.3. Exerccios
Em ambiente Windows, um auxlio por intermedio de menu-dirigido e disponvel selecionando Table of Contents ou Index no menu Help. Como o uso desta forma de assistencia
e bem intuitivo, o melhor a fazer e experimentar!
1.3
Exerccios
Sec
ao 1.1 Janela de comando
1.1 Executar o programa MATLAB.
1.2 Verificar a diferenca entre , e ; nos comandos pi+1, pi*10 e pi+1; pi*10;.
1.3 Testar o funcionamento das teclas e .
1.4 Ver o funcionamento das teclas e .
1.5 Verificar a diferenca entre more(20), more off e more on.
Sec
ao 1.2 Comandos de auxlio ao usu
ario
1.6 Quantos parametros tem a funcao erro erf?
1.7 Quais sao os comandos utilizados para interpolacao (interpolation)?
1.8 Qual o comando usado para calcular o determinante (determinant) de uma matriz?
1.9 Qual o comando para achar raiz (root) de uma equacao polinomial?
10
1.10 Comparar a soma dos autovalores (eigenvalues) com o traco (trace) de uma matriz de
Pascal de ordem qualquer. Fazer a mesma comparacao usando uma matriz com elementos
aleatorios.
Captulo 2
Elementos fundamentais
Neste captulo serao apresentados alguns tens basicos, como constantes, variaveis, expressoes e graficos, o que tornara possvel o uso imediato do MATLAB no modo interativo.
Alem disso, estes elementos sao fundamentais para a elaboracao de programas.
2.1
Constantes e vari
aveis
Uma constante numerica no MATLAB e formada por uma sequencia de dgitos que pode
estar precedida por um sinal positivo (+) ou por um negativo (-) e pode conter um ponto
decimal (.). Esta sequencia pode terminar por uma das letras e, E, d ou D seguida de outra
sequencia de dgitos precedida de um sinal positivo (+) ou um negativo (-). Esta segunda
sequencia e a potencia de 10 pela qual a primeira sequencia deve ser multiplicada. Por
exemplo, 1.23e-1 significa 0,123 e 4.567d2 e 456,7.
Em modo interativo, o MATLAB e um interpretador de expressoes. A expressao fornecida
e analisada sintaticamente e se estiver correta sera avaliada. O resultado pode ser atribudo
a` uma variavel por intermedio do sinal (=),
<vari
avel> = <express~
ao>
Por exemplo,
>> g=8.6+6.8
g =
15.4000
Se o nome da variavel e o sinal de atribuicao (=) forem omitidos, entao o resultado sera dado
a` variavel default ans (answer),
11
12
>> 8/5
ans =
1.6000
2.1.1
Comentario
caracteres alem do 63o sao ignorados,
caracteres de pontuacao e de operadores nao
sao permitidos,
raiz, Raiz e RAIZ sao variaveis distintas.
Arranjos
-0.3000
13
Para gerar um vetor com o primeiro elemento igual a 10, o segundo igual a 15, o terceiro
igual a 20 e assim, sucessivamente, ate o u
ltimo igual a 40, basta definir
>> b = 10:5:40
b =
10
15
20
25
30
35
40
30
35
40
% segundo elemento de c
14
>> c(3:5)
% terceiro ao quinto elemento
ans =
20
25
30
>> c(4:end)
% quarto ao
ultimo elemento
ans =
25
30
35
40
Nos exemplos acima os arranjos possuem uma linha e varias colunas, por isso sao tambem
chamados vetores linha. Do mesmo modo, podem existir vetores coluna, ou seja, arranjos
com varias linhas e uma u
nica coluna. Para criar um vetor coluna elemento por elemento
estes devem estar separados por (;)
v = [v1 ;v2 ; . . . ;vn ]
Deste modo, para gerar um vetor coluna com os elementos 1.5, -3.2, -8.9,
>> v = [1.5;-3.2;-8.9]
v =
1.5000
-3.2000
-8.9000
-8.9000
15
No caso do vetor ser complexo o operador de transposicao (.) deve ser usado para obter a
transposicao, pois o uso do operador () resultara em um complexo conjugado transposto.
Por exemplo, seja o vetor complexo,
>> z = (1:3)+(0.1:0.1:0.3)*i
z =
1.0000 + 0.1000i
2.0000 + 0.2000i
3.0000 + 0.3000i
o transposto e
>> t = z.
t =
1.0000 + 0.1000i
2.0000 + 0.2000i
3.0000 + 0.3000i
No caso do vetor nao ser complexo a transposicao pode ser feita usando () ou (.). A
funcao length e usada para se saber o comprimento de um vetor,
>> comp = length(z)
comp =
3
2.1.2
Matrizes
As matrizes sao arranjos bidimensionais ou conjunto de vetores e constituem as estruturas fundamentais do MATLAB e por isso existem varias maneiras de manipula-las. Uma
vez definidas, elas podem ser modificadas de varias formas, como por insercao, extracao e
rearranjo.
Similarmente aos vetores, para construir uma matriz os elementos de uma mesma linha
devem estar separados por branco ou vrgula e as linhas separadas por ponto-e-vrgula ou
Enter (ou Return),
16
-5
9
Se for atribudo um valor a um elemento nao existente, ou seja, alem dos elementos da
matriz, entao o MATLAB aumenta esta matriz automaticamente, sem aviso, preenchendo-a
com valores nulos de forma a matriz permanecer retangular,
>> A(3,6) = 1
A =
3
8
4
7
0
0
-5
9
0
0
0
0
0
0
0
0
0
1
De modo similar aos arranjos, os elementos de uma matriz podem ser referenciados individualmente, tal como, elemento da linha 2 e coluna 3,
>> B(2,3)
ans =
6
ou em conjuntos, neste caso usando a notacao de arranjo. Por exemplo, os elementos das
linhas 1 e 3 e coluna 2,
>> B([1 3],2)
ans =
2
8
17
cria uma matriz C a partir das linhas 3, 2 e 1 e colunas 1, 2 e 3 de B, ou seja, cria uma matriz
C a partir das linhas de B em ordem inversa. Considerando que sao referenciadas todas as 3
colunas de B, a notacao simplificada (:) pode ser igualmente usada em vez de 1:3,
>> C = B(3:-1:1,:)
C =
7
8
9
4
5
6
1
2
3
Para construir uma matriz E a partir da matriz B seguida da coluna 2 de C seguida ainda de
uma coluna com os elementos iguais a 2,
>> E = [B C(:,2) [2 2 2]]
E =
1
2
3
8
4
5
6
5
7
8
9
2
2
2
2
Para remover uma linha ou coluna de uma matriz usa-se a matriz vazia []. Por exemplo,
para remover a coluna 3 de E,
18
>> E(:,3) = []
E =
1
2
4
5
7
8
8
5
2
2
2
2
5
2
2
2
O MATLAB tem funcoes que se aplicam individualmente a` cada coluna da matriz produzindo
um vetor linha com elementos correspondentes ao resultado de cada coluna. Se a funcao for
aplicada `a transposta da matriz ter-se-ao resultados relativos a` cada linha da matriz. Se o
argumento da funcao for um vetor em vez de uma matriz, entao o resultado sera um escalar.
Algumas destas funcoes sao mostradas na Tabela 2.2.
Seja um quadrado magico que e uma matriz de ordem n > 0 com valores entre 1 e n2 tal
que a soma das linhas, colunas e diagonal sao iguais, exceto para n = 2,
19
Descricao
soma dos elementos
produto dos elementos
media aritmetica
desvio padrao
maior elemento
menor elemento
ordenar os elementos (usar help sort)
>> A = magic(4)
A =
16
2
3
13
5
11
10
8
9
7
6
12
4
14
15
1
>> sum(A)
ans =
34
34
34
34
>> prod(A)
ans =
2880
2156
2700
1248
>> mean(A)
ans =
8.5000
8.5000
8.5000
8.5000
>> std(A)
ans =
5.4467
5.1962
5.1962
5.4467
>> max(A)
ans =
16
14
15
13
>> max(max(A))
% maior elemento da matriz
ans =
16
>> min(A)
ans =
4
2
3
1
>> sort(A)
ans =
4
2
3
1
5
7
6
8
9
11
10
12
16
14
15
13
Existem tambem varias funcoes para manipulacao de matrizes dentre as quais destacam-se
20
tril
triu
Descricao
se o argumento for um vetor, entao cria uma matriz diagonal com
os elementos do vetor; se o argumento for uma matriz, entao produz
um vetor coluna contendo os elementos da diagonal.
obtem a parte triangular inferior de uma matriz.
obtem a parte triangular superior de uma matriz.
0
0
6
0
0
0
0
1
0
0
6
15
0
0
0
1
3
10
6
0
13
8
12
1
Tambem sao disponveis varias matrizes elementares de grande utilidade, como as mostradas
na Tabela 2.4. Se um u
nico parametro for provido, entao a matriz sera quadrada de ordem
igual ao valor do parametro. Se forem dois parametros, entao ela sera retangular com as
dimensoes iguais aos valores desses parametros. Por exemplo,
>> Z = zeros(2)
21
Descricao da matriz
nula.
elementos iguais a 1.
identidade ou parte dela.
elementos aleatorios uniformemente distribuidos entre 0 e 1.
elementos aleatorios com distribuicao normal com media 0 e desvio
padrao 1.
Z =
0
0
0
0
>> U = ones(2,3)
U =
1
1
1
1
1
1
>> I = eye(2,4)
I =
1
0
0
0
1
0
>> R = rand(3)
R =
0.8147
0.9134
0.9058
0.6324
0.1270
0.0975
>> N = randn(3,5)
N =
2.7694
0.7254
-1.3499
-0.0631
3.0349
0.7147
0
0
0.2785
0.5469
0.9575
-0.2050
-0.1241
1.4897
1.4090
1.4172
0.6715
-1.2075
0.7172
1.6302
2.1.3
Vari
aveis literais
22
2.1.4
Vari
aveis especiais
O MATLAB tem diversas variaveis especiais, as quais estao listadas na Tabela 2.5. Com
excessao de ans, i e j estas variaveis nao devem ser redefinidas. Para mais informacoes
sobre matrizes e outras variaveis use help elmat.
2.2
Express
oes
2.2. Expressoes
23
Valor
nome de variavel default usado para resultados.
3, 1416.
menor n
umero na forma 2d que adicionado a 1 resulta em um
n
umero de ponto flutuante maior que 1. Seu valor e eps = 252
2,22041016 (para 8 bytes) em computadores com aritmetica de
ponto flutuante padrao IEEE.
inf
infinito, por exemplo, 1/0.
NaN
nao e um
umero (Not-a-Number), por exemplo, 0/0.
n
iej
i = j = 1.
realmin menor n
umero positivo de ponto flutuante em um computador particular. Em maquinas com formato de ponto flutuante padrao IEEE
realmin 2,225110308 .
realmax maior n
umero de ponto flutuante representavel em um computador
particular. Em maquinas com formato de ponto flutuante padrao
IEEE realmax 1,797710308 .
2.2.1
Express
oes aritm
eticas
Operador
+
*
/ ou \
^
Exemplo
1+2
5.1-4.7
6*9.98
6/7 5\3
2^10
As operacoes basicas entre vetores so sao definidas quando estes tiverem o mesmo tamanho
e orientacao (linha ou coluna). Estas operacoes basicas sao apresentadas na Tabela 2.7.
As operacoes de multiplicacao, divisao e potenciacao envolvendo vetores antecedidas pelo
caractere (.), significa que estas operacoes sao efetuadas elemento a elemento. Considere,
>> a = 1:5, b = 10:10:50, c = 2
a =
24
Expressao
adicao escalar
adicao vetorial
multiplicacao escalar
multiplicacao vetorial
divisao a` direita
divisao a` esquerda
potenciacao
a+c
a+b
a*c
a.*b
a./b
a.\b
a.^c
c.^a
a.^b
10
20
30
40
50
33
44
55
Resultado
[ a1 +c
[ a1 +b1
[ a1 c
[ a1 b1
[ a1 /b1
[ b1 /a1
[ a1 ^c
[ c^a1
[ a1 ^b1
a2 +c ... an +c ]
a2 +b2 ... an +bn ]
a2 c ... an c ]
a2 b2 ... an bn ]
a2 /b2 ... an /bn ]
b2 /a2 ... bn /an ]
a2 ^c ... an ^c ]
c^a2 ... c^an ]
a2 ^b2 ... an ^bn ]
b =
c =
2
>> a + c
ans =
3
4
>> a + b
ans =
11
22
>> a ./ b
ans =
0.1000
>> a .^ c
ans =
1
4
>> c .^ a
ans =
2
4
0.1000
0.1000
16
25
16
32
0.1000
0.1000
De modo similar `as operacoes vetorias, existem as operacoes matriciais basicas, as quais estao
compiladas na Tabela 2.8. O operador \ envolvendo matrizes e vetores esta relacionado com
solucao de sistemas lineares, conforme sera visto na Secao 4.1.3 Solucao de sistemas. Sejam
as matrizes A e B de ordem 3 e o escalar c,
>> A = [1 2 3; 4 5 6; 7 8 9], B = [11 12 13; 14 15 16; 17 18 19], c = 3
A =
2.2. Expressoes
Expressao
Resultado
adicao escalar
A+c
aij + c
adicao matricial
A+B
aij + bij
multiplicacao escalar
A*c
aij c
A.*B
aij bij
multiplicacao matricial
A*B
AB
A./B
aij /bij
divisao a` esquerda
A.\B
bij /aij
potenciacao
A.^c
acij
A^c
Ac
c.^A
caij
c^A
cA
A.^B
aijij
1
4
7
2
5
8
3
6
9
11
14
17
12
15
18
13
16
19
5
8
11
6
9
12
14
20
26
16
22
28
B =
c =
3
>> A + c
ans =
4
7
10
>> A + B
ans =
12
18
24
>> A * c
ans =
25
26
3
12
21
6
15
24
9
18
27
A diferenca no resultado das expressoes quando os operadores contem o caractere (.) deve
ser observada. Na multiplicacao,
>> A .* B
% multiplica
c~
ao de matriz elemento a elemento
ans =
11
24
39
56
75
96
119
144
171
>> A * B % multiplica
c~
ao matricial ordin
aria
ans =
90
96
102
216
231
246
342
366
390
E na potenciacao,
>> A .^ c
% elemento de uma matriz elevado a uma constante
ans =
1
8
27
64
125
216
343
512
729
>> A ^ c
% multiplica
c~
ao sucessiva de matriz ( A^3 = A*A*A )
ans =
468
576
684
1062
1305
1548
1656
2034
2412
>> c .^ A
% constante elevada a elemento da matriz
ans =
3
9
27
81
243
729
2187
6561
19683
Como pode ser esperado de uma linguagem para aplicacoes nas areas cientficas e tecnicas,
o MATLAB oferece varias funcoes importantes para Matematica, Ciencias e Engenharia. A
Tabela 2.9 apresenta algumas funcoes matematicas elementares, e uma lista mais completa
pode ser obtida usando o comando help elfun. As funcoes matematicas especializadas
podem ser listadas usando help specfun.
Se a variavel for um vetor ou uma matriz a avaliacao de uma funcao se da para cada elemento
da variavel,
>> a = 1:5
2.2. Expressoes
ceil
fix
floor
Funcao
Trigonometricas
arco co-seno
cos
arco co-seno hiperbolico
cosh
arco co-tangente
cot
arco co-tangente hiperbolica
coth
arco co-secante
csc
arco co-secante hiperbolica
csch
arco secante
sec
arco secante hiperbolica
sech
arco seno
sin
arco seno hiperbolico
sinh
arco tangente
tan
arco tangente hiperbolica
tanh
arco tangente de 4 quadrantes
Exponenciais
exponencial
log10
logaritmo natural
sqrt
Complexas
valor absoluto
imag
angulo de fase
real
complexo conjugado
Numericas
arredonda em direcao a +
lcm
arredonda em direcao a 0
rem
arredonda em direcao a
round
gcd
acos
acosh
acot
acoth
acsc
acsch
asec
asech
asin
asinh
atan
atanh
atan2
exp
log
abs
angle
conj
Descricao
sign
Descricao
co-seno
co-seno hiperbolico
co-tangente
co-tangente hiperbolica
co-secante
co-secante hiperbolica
secante
secante hiperbolica
seno
seno hiperbolico
tangente
tangente hiperbolica
logaritmo decimal
raiz quadrada
parte imaginaria do complexo
parte real do complexo
mnimo m
ultiplo comum
resto de divisao
arredonda em direcao ao inteiro mais proximo
sinal
a =
1
2
3
>> b = sqrt(a)
b =
1.0000
1.4142
1.7321
2.0000
2.2361
Os resultados acima podem ser apresentados na forma de uma tabela pelo comando
>> [a;b]
ans =
1.0000
2.0000
3.0000
1.0000
1.4142
1.7321
27
28
4.0000
5.0000
2.2.2
2.0000
2.2361
Express
oes l
ogicas
Uma expressao se diz logica quando os operadores sao logicos e os operandos sao relacoes
e/ou variaveis do tipo logico. Uma relacao e uma comparacao realizada entre valores do
mesmo tipo. A natureza da comparacao e indicada por um operador relacional conforme a
Tabela 2.10.
Tabela 2.10: Operadores relacionais.
Operador relacional
>
>=
<
<=
==
~=
Descricao
maior que
maior ou igual a
menor que
menor ou igual a
igual a
diferente de
10
Assim,
>> d = a >= c
d =
0
0
2.2. Expressoes
>> e = a + (b <= 3)
e =
1
2
3
10
29
11
e2
V F
V F
F F
e1 ou e2
e1 \e2 V F
V
V V
F
V F
n
ao e1
e1 V F
F V
Alguns dos operadores logicos sao listados na Tabela 2.12. Para os vetores a e b definidos
Tabela 2.12: Operadores logicos.
Operador logico Descricao
&
e
&&
e
|
ou
||
ou
~
n
ao
Operacao
conjuncao elemento a elemento
conjuncao curto circuito
disjuncao elemento a elemento
disjuncao curto circuito
negacao
anteriormente,
>> f = (a > 3) & (a <= 8)
f =
0
0
0
1
Quando os operandos de uma expressao logica forem matrizes (ou vetores), entao o MATLAB
executa a operacao logica entre os correspondentes elementos das matrizes, ou seja, elemento
a elemento. O resultado e uma matriz de mesma dimensao das matrizes envolvidas. Por
exemplo, dadas as matrizes A e B,
30
>> A = [1 2 3 4; 5 6 7 8]
A =
1
2
3
4
5
6
7
8
>> B = [9 8 7 6; 5 4 3 2]
B =
9
8
7
6
5
4
3
2
0
1
1
0
1
0
0
0
Por outro lado, uma operacao curto circuito envolve os operadores && e ||, mas somente
para operandos escalares. Neste tipo de operacao, o segundo operando e avaliado somente
quando o resultado nao e totalmente determinado pelo primeiro operando. No caso de
e1 && e2, se a expressao e1 for igual a 0 (falso), entao toda a expressao e1 && e2 resultara
em falso, independentemente, do valor da expressao e2 (ver Tabela 2.11). Nessas condicoes
nao e necessario avaliar e2 porque o resultado ja e conhecido. Desde modo, o MATLAB
fara um curto circuito na operacao e1 && e2 ao avaliar somente a primeira expressao e1.
Por exemplo,
>> x = 1; y = 2;
>> r = (y ~= 0) && (x/y < 1)
r =
1
Como y 6= 0 e verdadeiro entao a segunda expressao x/y < 1 e avaliada resultando no valor
verdadeiro. No entanto,
2.2. Expressoes
31
>> x = 1; y = 0;
>> r = (y ~= 0) && (x/y < 1)
r =
0
resulta que a primeira expressao seja falso fazendo com que a segunda expressao nao seja
avaliada. Considerando que a operacao (e1 e e2 ) sera sempre falso se uma dela for falso,
nao e necessario avaliar a segunda expressao que, neste exemplo, causaria uma divisao por
zero.
No caso de e1 || e2, se a expressao e1 for igual a 1 (verdadeiro), entao toda a expressao
sera sempre verdadeiro nao importando o valor de e2 (ver Tabela 2.11). Tambem haveria
um curto circuito ao nao se avaliar e2.
2.2.3
Ordem de preced
encia
A ordem de precedencia para expressoes envolvendo operadores aritmeticos e logicos e apresentada na Tabela 2.13. Os parenteses podem ser usados para alterarem a ordem de preTabela 2.13: Ordem de precedencia das operacoes aritmeticas e logicas.
Ordem de
precedencia
1a
2a
3a
4a
5a
6a
7a
8a
9a
10a
11a
Operadores
( )
. .^ ^
+ (unario) -(unario) ~
.* ./ .\ * / \
+ :
< <= > >= == ~=
&
|
&&
||
cedencia e dentro de um mesmo nvel os operadores tem igual precedencia, sendo calculados
da esquerda para a direita. Por exemplo, a avaliacao da expressao
>> h = -(a - 5) .^ 2 > -9 & 3 * b <= 15
h =
0
0
0
0
1
1
32
h1 =
-4
-3
-2
>> h2 = h1 .^ 2
h2 =
16
9
4
>> h3 = 3 * b
h3 =
27
24
21
>> h4 = -h2
h4 =
-16
-9
-4
>> h5 = h4 > -9
h5 =
0
0
1
>> h6 = h3 <= 15
h6 =
0
0
0
>> h = h5 & h6
h =
0
0
0
-1
16
25
18
15
12
-1
-1
-4
-9
-16
-25
Deve ser observado que o operador & tem precedencia sobre o operador |, de modo que a
expressao e1 | e2 & e3 e avaliada como e1 | (e2 & e3). No entanto, e mais seguro usar
parenteses para, explicitamente, especificar a ordem de precedencia desejada das expressoes
contendo combinacoes de & e |. A mesma regra se aplica para as expressoes envolvendo os
operadores curto circuito && e ||.
2.2.4
Express
oes literais
51
105
2.2. Expressoes
45
46
47
48
49
50
51
52
53
54
55
56
!
"
#
$
%
&
(
)
*
+
,
i
j
k
l
m
n
o
p
q
r
s
t
117
118
119
120
121
122
123
124
125
126
u
v
w
x
y
z
{
|
}
~
a
`
a
a
^
a
~
200
201
202
203
204
205
206
207
`
E
e
e
^
E
`
I
^
I
Representacao
208 -D 216
N 217
209 ~
210 `
O 218
211 o
219
212 o
^ 220
213 o
~ 221
214
O 222
215 223
m =
70
117
110
>> c = setstr(m)
c =
Fun
c~
ao
231
227
111
u
226 a
^ 234 e
^
^
U 227 a
~ 235 e
u 228 a
236
`
Y 229 a
237
230 238
^
231 c
239
240
241 n
~
242 o
`
243 o
244 o
^
245 o
~
246 o
247
248
249
250
251
252
253
254
255
u
`
u
u
^
u
y
33
34
com este valor numerico e possvel, por exemplo, extrair a raiz quadrada,
>> y = sqrt(x)
y =
11.0906 + 0.0256i
2.3
Gr
aficos
Uma das grandes habilidades do MATLAB e a facilidade para produzir graficos de otima
qualidade. Nesta secao serao vistos como gerar graficos bi e tridimensionais e os modos de
grava-los em arquivos para que possam ser includos em textos.
2.3.1
Gr
aficos bidimensionais
Para gerar graficos bidimensionais podem ser usados as versateis funcoes plot e fplot.
Func
ao plot
A sintaxe desta funcao e
35
2.3. Graficos
plot(x1, y1, <tipo de linha 1>, x2, y2, <tipo de linha 2>, ...)
onde x e y sao vetores contendo as abscissas e ordenadas dos pontos a serem exibidos,
respectivamente e <tipo de linha> e uma cadeia de 1 a 4 caracteres que especifica a cor e
o estilo da linha, os quais sao mostrados na Tabela 2.16.
Tabela 2.16: Alguns tipos de linha da funcao plot.
Smbolo
y
m
c
r
g
b
w
k
Cor
Smbolo
amarela
.
lilas
o
turquesa
x
vermelho
+
verde
*
azul
branco
:
preto
-.
--
Estilo de linha
ponto
crculo
marca x
mais
asterisco
linha solida
linha pontilhada
linha de traco e ponto
linha tracejada
Considere os vetores,
>> x = linspace(-8,8,50); y = sin(x); z = cos(x);
O grafico produzido e mostrado na Figura 2.1(a). Tambem pode ser gerado um grafico
um pouco mais complexo, sen(x) e cos(x) em funcao de x com os valores de sen(x) sendo
destacados com (*) e os de cos(x) com (o).
Para isto o comando
>> plot(x, y, -*, x, z, -.o)
produz a Figura 2.1(b). Existem alguns comandos para identificacao nos graficos, como os
exibidos na Tabela 2.17. Assim, os comandos
>>
>>
>>
>>
xlabel(eixo x)
ylabel(eixo y)
title(fun
c~
oes seno e co-seno)
text(4.1,0.7,cos(x))
36
0.8
0.8
0.6
0.6
0.4
0.4
0.2
0.2
0.2
0.2
0.4
0.4
0.6
0.6
0.8
0.8
1
8
1
8
a) f (x) = sen(x)
Descricao
escreve
escreve
escreve
escreve
escreve
<texto>
<texto>
<texto>
<texto>
<texto>
produzirao os rotulos e ttulos no grafico da Figura 2.1(b), como mostrado na Figura 2.2(a).
O comando grid on faz com que apareca uma grade no grafico produzido. Por sua vez grid
off faz com que a grade desapareca. O uso de grid sem argumento altera o estado, isto e,
se nao houver grade entao grid sera equivalente `a grid on e se houver grid fara com que
a grade desapareca.
O comando legend(<texto 1>,<texto 2>,...) adiciona uma caixa de legendas ao
esboco da figura atual, usando as cadeias de caracteres <texto i> como rotulos. Para
mover a caixa de legendas basta pressionar o botao esquerdo do mouse sobre ela e coloca-la
na posicao desejada.
A Figura 2.2(b) mostra o efeito dos comandos
>> grid on
>> legend(sen(x), cos(x), Location, SouthWest)
Para mais informacoes sobre o uso de plot e das funcoes relacionadas use o comando help.
37
2.3. Graficos
funes seno e coseno
0.8
0.8
cos(x)
cos(x)
0.4
0.4
0.2
0.2
eixo y
0.6
eixo y
0.6
0.2
0.2
0.4
0.4
0.6
0.6
0.8
0.8
sen(x)
cos(x)
1
8
0
eixo x
1
8
a) Rotulos e ttulos
0
eixo x
b) Grade e legendas
produzem o grafico mostrado na Figura 2.3(a). Para que a funcao especificada pela cadeia
f(x) = sen(x)*x
f(x) = sen(x)*x
20
10
15
6
10
4
2
f(x)
f(x)
4
10
6
15
20
20
15
10
0
x
a) Restricao em x
10
15
20
10
15
10
0
x
10
15
b) Restricoes em x e y
38
Para mais informacoes sobre os comandos para manipulacao de graficos bidimensionais use
help graph2d.
2.3.2
Gr
aficos tridimensionais
De uma maneira similar aos graficos bidimensionais, o MATLAB possui varios comandos
para que graficos tridimensionais sejam tambem facilmente esbocados. Serao descritas a seguir, de modo sucinto, algumas funcoes com esta finalidade. Portanto, para mais informacoes
sobre essas funcoes usar o comando help graph3d.
Func
ao meshgrid
O comando [X,Y] = meshgrid(x,y) transforma o domnio especificado pelos vetores x e
y em matrizes X e Y que podem ser usadas para avaliar funcoes de duas variaveis e fazer
esbocos tridimensionais de malhas e superfcies. As linhas da matriz X sao copias do vetor
x e as colunas da matriz Y sao copias do vetor y,
>> x = -1:0.5:2
x =
-1.0000
-0.5000
0
>> y = -1:0.5:1
y =
-1.0000
-0.5000
0
>> [X,Y] = meshgrid(x,y)
X =
-1.0000
-0.5000
0
-1.0000
-0.5000
0
-1.0000
-0.5000
0
-1.0000
-0.5000
0
-1.0000
-0.5000
0
Y =
-1.0000
-1.0000
-1.0000
-0.5000
-0.5000
-0.5000
0
0
0
0.5000
0.5000
0.5000
1.0000
1.0000
1.0000
>> Z = X + Y
Z =
-2.0000
-1.5000
-1.0000
-1.5000
-1.0000
-0.5000
-1.0000
-0.5000
0
-0.5000
0
0.5000
0
0.5000
1.0000
0.5000
1.0000
1.5000
2.0000
0.5000
1.0000
0.5000
0.5000
0.5000
0.5000
0.5000
1.0000
1.0000
1.0000
1.0000
1.0000
1.5000
1.5000
1.5000
1.5000
1.5000
2.0000
2.0000
2.0000
2.0000
2.0000
-1.0000
-0.5000
0
0.5000
1.0000
-1.0000
-0.5000
0
0.5000
1.0000
-1.0000
-0.5000
0
0.5000
1.0000
-1.0000
-0.5000
0
0.5000
1.0000
-0.5000
0
0.5000
1.0000
1.5000
0
0.5000
1.0000
1.5000
2.0000
0.5000
1.0000
1.5000
2.0000
2.5000
1.0000
1.5000
2.0000
2.5000
3.0000
39
2.3. Graficos
Func
ao plot3
Esta funcao e uma generalizacao da funcao plot (ver Secao 2.3.1 Graficos bidimensionais)
para esbocos tridimensionais. Sua sintaxe e
plot3(X1, X1, Z1, <tipo de linha 1>, X2, Y2, Z2, <tipo de linha 2>, ...)
[X,Y] = meshgrid(-3:0.2:3,-2:0.2:2);
Z = sin(X).*cos(Y).^2;
plot3(X,Y,Z); grid on
xlabel(eixo x); ylabel(eixo y); zlabel(eixo z)
title(plot3)
mesh
0.5
0.5
eixo z
eixo z
plot3
0.5
0.5
1
2
1
2
3
2
0
2
0
0
1
0
1
2
eixo y
2
eixo x
a) plot3
eixo y
eixo x
b) mesh
40
>>
>>
>>
>>
>>
[X,Y] = meshgrid(-3:0.2:3,-2:0.2:2);
Z = sin(X).*cos(Y).^2;
mesh(X,Y,Z); grid on
xlabel(eixo x); ylabel(eixo y); zlabel(eixo z)
title(mesh)
0.5
0.5
eixo z
eixo z
meshc
0.5
0.5
1
2
1
2
3
2
0
2
0
0
1
0
1
2
eixo y
2
eixo x
eixo y
a) meshc
eixo x
b) meshz
Func
oes surf e surfl
A funcao surf(X,Y,Z) produz uma superfcie sombreada tridimensional especificada pelas
matrizes X, Y e Z. A funcao surfl(X,Y,Z) gera uma superfcie sombreada acrescida de um
efeito de iluminacao. Deste modo, os comandos
>>
>>
>>
>>
>>
[X,Y] = meshgrid(-3:0.2:3,-2:0.2:2);
Z = sin(X).*cos(Y).^2;
surf(X,Y,Z); grid on
xlabel(eixo x); ylabel(eixo y); zlabel(eixo z)
title(surf)
41
2.3. Graficos
surfl(X,Y,Z); grid on
xlabel(eixo x); ylabel(eixo y); zlabel(eixo z)
title(surfl)
shading interp
colormap(gray)
produzem as superfcies mostradas nas Figuras 2.6(a) e (b). Os comandos shading interp
e colormap(gray) foram usados para realcar o efeito da iluminacao.
surfl
0.5
0.5
eixo z
eixo z
surf
0.5
0.5
1
2
1
2
3
2
0
2
0
0
1
0
1
2
eixo y
2
eixo x
eixo y
a) surf
eixo x
b) surfl
2.3.3
As figuras geradas podem ser facilmente impressas ou gravadas em um arquivo para posterior
impressao ou inclusao em um texto. Para tal basta usar o comando print cuja sintaxe e
onde <disp> e o dispositivo para especificar o tipo de arquivo a ser gravado com o nome
<nome do arquivo>. Alguns destes dispositivos sao mostrados na Tabela 2.18.
Por exemplo, o comando
>> print -deps figplot
gera um arquivo PostScript (R) encapsulado com nome figplot.eps. Usar o comando help
print para mais informacoes sobre todos os dispositvos suportados.
42
2.4
Descric
ao
Exerccios
Se
c
ao 2.1 Constantes e vari
aveis
Observar atentamente e anotar o resultado dos comandos. Apesar de os comandos estarem
separados por vrgula, entrar com um de cada vez.
2.1 Atribuir o valor 1,23103 a` variavel a e 4,17102 a` variavel b.
2.2 Conferir os nomes permitidos de variaveis
arco-seno=0, limite:sup=3, Area=3, area=1
2.4. Exerccios
43
Sec
ao 2.2 Express
oes
Observar atentamente e anotar o resultado dos comandos. Apesar de os comandos estarem
separados por vrgula, entrar com um de cada vez.
2.6 Avaliar as expressoes escalares
5+3, 4-1, 6*3,
10/2, 2\5, 3^2,
1+2*3-4/5, 6*2^3
p
3
e(e a)(e b) + cd ,
b2 c
y = a
+
d+e
z = log10
b
d + e2
cos(a)
d + sen(b + c)
+ exp
3
,
b+a
c2
+
1 + b2 .
b a 1 + b3
44
=
=
=
=
1
% verdadeiro
0
% falso
sqrt(2) > 1
exp(0) == 0
completar a tabela
a
b c d
a & b
a & c
b & d
a | b
a | c
b | d
~a ~b
Captulo 3
Linguagem de programa
c
ao
No captulo anterior foram descritos os elementos fundamentais do MATLAB, os quais
possibilitam sua utilizacao em um modo interativo. Neste captulo serao abordados alguns
comandos que tornarao possvel escrever programas, tais como, comandos para entrada e
sada de dados, manipulacao de arquivos, estruturas condicionais e estruturas de repeticao.
3.1
Existem comandos para especificar o formato de sada dos resultados, gravacao e leitura das
variaveis de uma sessao de trabalho para uso posterior e edicao de programas em arquivos.
3.1.1
Formato de exibi
c
ao
Para saber o valor de uma variavel basta entrar com o nome de seu identificador,
>> pi
ans =
3.1416
O comando disp(<vari
avel>) e usado para exibir <vari
avel> sem mostrar o seu nome ou
para exibir uma cadeia de caracteres contida na <vari
avel>,
>> disp(matriz identidade de ordem 3), disp(eye(3))
matriz identidade de ordem 3
1
0
0
0
1
0
0
0
1
Para exibir um resultado numerico sao seguidas diversas regras. Normalmente, se o resultado
for um n
umero inteiro, ele e exibido como tal. Igualmente, quando o resultado for um n
umero
45
46
real (ponto flutuante), ele e mostrado com quatro dgitos apos o ponto decimal. Se os dgitos
significativos do resultado estiverem fora desta faixa, entao o resultado e exibido em notacao
cientfica. O comando format e usado para modificar o formato numerico de exibicao, como
mostrado na Tabela 3.1.
Comando
format short
format bank
format long
format short e
format long e
format hex
format +
format rat
format compact
format loose
format
3.1.2
Resultado
3.1416
4 dgitos decimais,
3.14
2 dgitos decimais,
3.141592653589793
15 dgitos decimais,
3.1416e+00
4 dgitos decimais e expoente,
3.141592653589793e+00 15 dgitos e expoente,
400921fb54442d18
hexadecimal,
+
+, ou branco para valor positivo,
negativo ou nulo,
355/113
aproximacao racional,
suprime linhas em branco,
mantem linhas em branco,
atribui o padrao : short e loose.
Espa
co de trabalho
Durante uma sessao, as variaveis utilizadas residem no espaco de trabalho e podem ser
armazenadas quando desejado. O comando who lista o nome das variaveis que estao sendo
usadas, ou seja, que estao presentes no espaco de trabalho, enquanto que o comando whos
fornece maiores informacoes sobre essas variaveis. As variaveis no espaco de trabalho podem
ser removidas, incondicionalmente, usando o comando clear1 .
>> clear tempo raiz
>> clear
47
onde <nome do arquivo> especifica que as variaveis do espaco de trabalho serao gravadas
no arquivo binario <nome do arquivo>.mat. Por exemplo, save trab1 faz com que todas
as variaveis da sessao sejam gravadas no arquivo trab1.mat. Se o nome do arquivo nao for
dado, entao todas as variaveis serao gravadas no arquivo default matlab.mat;
<vari
aveis> definem quais as variaveis do espaco de trabalho a serem gravadas no arquivo
<nome do arquivo>.mat. As variaveis devem estar separadas por brancos;
<formatos> especificam as caractersticas dos dados que serao gravados no arquivo denominado <nome do arquivo>.mat. Os <formatos> podem ser
define que o arquivo sera no formato ASCII e seu nome nao contera a
extensao .mat, que e a forma usada para armazenar arquivos binarios.
-double antecedido por -ascii, define que os n
umeros serao gravados com 16
dgitos em vez de 8.
-tabs
antecedido por -ascii, define que os dados estarao tabulados.
-append adiciona variaveis a um arquivo ja existente.
-ascii
O comando load sem argumento recupera os dados do arquivo default matlab.mat; load
trab1 (sem extensao) recupera os dados do arquivo binario trab1.mat. A extensao pode
ser usada para recuperar arquivos ASCII. Neste caso, o arquivo deve conter uma matriz de
dados com m linhas e n colunas em cada linha. O resultado e uma matriz m n com o
mesmo nome do arquivo sem a extensao. Os dados em formato ASCII tem que estar na
forma de matriz senao o comando load nao conseguira recupera-los.
No exemplo a seguir, as variaveis a (1 3), b (2 3) e c (3 3) sao gravadas no arquivo
ASCII de nome trab.dat usando o comando save. Em seguida, o comando load e utilizado
para recuperar estes dados gerando a variavel trab (6 3) no espaco de trabalho,
>> a = 1:3
a =
1
2
>> b = eye(2,3)
48
b =
1
0
0
0
1
0
>> c = magic(3)
c =
8
1
6
3
5
7
4
9
2
>> who
% vari
aveis no espa
co de trabalho
Your variables are:
a b c
>> whos
% vari
aveis no espa
co de trabalho
Name
Size
Bytes Class
Attributes
a
1x3
24 double
b
2x3
48 double
c
3x3
72 double
>> save trab.dat a b c -ascii
% gravar o arquivo ASCII trab.dat
>> type trab.dat
% mostrar o conte
udo do arquivo trab.dat
1.0000000e+00
2.0000000e+00
1.0000000e+00
0.0000000e+00
0.0000000e+00
1.0000000e+00
8.0000000e+00
1.0000000e+00
3.0000000e+00
5.0000000e+00
4.0000000e+00
9.0000000e+00
>> load trab.dat
>> whos
% vari
aveis no espa
co de
Name
Size
Bytes
a
1x3
24
b
2x3
48
c
3x3
72
trab
6x3
144
>> trab
trab =
1
2
3
1
0
0
0
1
0
8
1
6
3
5
7
4
9
2
3.0000000e+00
0.0000000e+00
0.0000000e+00
6.0000000e+00
7.0000000e+00
2.0000000e+00
trabalho
Class
double
double
double
double
Attributes
Se o arquivo contiver uma variavel com o mesmo nome de uma ja existente no espaco de
trabalho, entao o comando load faz com que a variavel do espaco de trabalho seja substituda
pela variavel existente no arquivo.
3.1.3
49
Di
ario
3.1.4
Leitura e grava
c
ao de dados
O comando fopen associa o arquivo fsico <nome do arquivo> a` unidade fid que sera
utilizada nos comandos de entrada e sada no modo especificado pela <permiss~
ao>. Os
caracteres permitidos para <permiss~
ao> estao listados na Tabela 3.2.
Tabela 3.2: Atributos de arquivo.
<permiss~
ao>
Especificacao
r
r+
w
w+
a
a+
50
Se <permiss~
ao> for omitida, entao sera assumido o valor r. Se nao for especificado, os
arquivos serao abertos em modo binario. Para abrir um arquivo texto, o caracter t deve
ser adicionado ao caractere de permissao, como em, wt e rt+. Similarmente, o caractere
b pode ser usado para reiterar que um arquivo deve ser binario.
Caso o comando fopen tenha sucesso ao abrir o arquivo, ele retornara o identificador de
arquivo fid contendo um n
umero inteiro maior do que 2 e o conte
udo de <mensagem>
sera vazio. O fid e usado com outras rotinas de entrada e sada para identificar o arquivo
no qual as operacoes serao realizadas.
No entanto, se o comando fopen nao tiver sucesso, entao fid = -1 e <mensagem> contera
uma cadeia de caracteres informando o tipo de erro ocorrido. O comando help fopen pode
ser utilizado para obter mais informacoes sobre este comando.
Fechamento de arquivo
O comando fclose(fid) fecha o arquivo previamente aberto pelo comando fopen, cujo
identificador associado a este arquivo seja fid. O valor 0 e retornado em caso de sucesso no
fechamento e -1 em caso de insucesso. Por sua vez, o comando fclose(all) fecha todos
os arquivos abertos. Quando um arquivo for fechado, a associacao entre o identificador fid
e o arquivo fsico <nome do arquivo> sera desfeita.
Gravac
ao em arquivo
O comando fprintf grava dados formatados em um arquivo e sua sintaxe e
onde <tamanho> e o n
umero de bytes escritos (opcional), fid e o identificador associado ao
arquivo no qual sera feita a gravacao dos valores contidos na <vari
avel> com o formato especificado na cadeia de caracteres <formato>, a qual deve conter caracteres alfanumericos
e/ou especificacoes de conversao. Estas especificacoes de conversao sao delimitadas pelo caractere % e uma das letras i, e, f, g ou s, de acordo com a Tabela 3.3. Deste modo,
>> fprintf(a precis~
ao deste computador = %12.5e\n,eps)
a precis~
ao deste computador = 2.22045e-16
onde \n e usado para comecar uma nova linha. Quando for necessario ter o caractere ()
exibido basta usa-lo duas vezes,
>> fprintf(hoje e dia %9s\n, date)
hoje e dia 24-Oct-2013
51
Especificacao
usado para valores inteiros, sendo n o tamanho do campo de exibicao;
notacao na forma []888.888, sendo n o tamanho do campo (n
umero
total de caracteres exibidos) e d o n
umero de dgitos decimais;
notacao na forma []8.888e 88, sendo n o tamanho do campo (n
umero
total de caracteres exibidos) e d o n
umero de dgitos decimais;
equivalente a %n.de ou %n.df, dependendo de qual formato for mais curto,
alem disso os zeros insignificantes nao sao exibidos;
exibe caracteres em um campo de tamanho n.
Se fid for omitido do comando fprintf ou se fid = 1, entao osvalores serao simplesmente
exibidos na tela. No exemplo abaixo, uma tabela contendo x, x e ex para 1 x 2 e
gerada e gravada no arquivo sqrtexp.dat,
>> x = 1:0.2:2;
% definir x
>> tab = [x; sqrt(x); exp(-x)]
tab =
1.0000
1.2000
1.4000
% gerar a tabela
1.6000
1.8000
2.0000
52
1.0000
1.0954
1.1832
1.2649
1.3416
1.4142
0.3679
0.3012
0.2466
0.2019
0.1653
0.1353
>> fid = fopen(sqrtexp.dat, w)
% abrir o arquivo para escrita
fid =
3
>> fprintf(fid, %5.2f%10.5f%10.4f\n, tab)
% escrever a tabela no arquivo
ans =
156
>> fclose(fid)
% fechar o arquivo
ans =
0
>> type sqrtexp.dat
% listar o arquivo
1.00
1.00000
0.3679
1.20
1.09545
0.3012
1.40
1.18322
0.2466
1.60
1.26491
0.2019
1.80
1.34164
0.1653
2.00
1.41421
0.1353
[<vari
avel>, <tamanho>] = fscanf(fid, <formato>, <elementos>)
onde fid e o identificador associado ao arquivo no qual esta sendo feita a leitura dos dados
escritos no formato especificado na cadeia de caracteres <formato>. Os dados sao convertidos segundo o <formato> e atribudos a` <vari
avel>. As especificacoes de conversao sao
mostradas na Tabela 3.3 e o parametro <elementos> e descrito na Tabela 3.4. A variavel
<tamanho> (opcional) retorna o n
umero de elementos que foram lidos com sucesso.
Tabela 3.4: Especificacao de elementos para leitura.
<elementos>
Especificacao
n
inf
[m,n]
53
Quando o MATLAB estiver lendo um arquivo ele tentara combinar os dados no arquivo
com a forma especificada em <formato>. Se a combinacao ocorrer, entao os dados serao
atribudos por coluna a` <vari
avel>. No entanto, se somente uma combinacao parcial ocorrer, entao apenas os dados combinados com o <formato> serao atribudos a` <vari
avel>
e a operacao de leitura sera interrompida.
De modo similar ao fprintf, o comando fscanf do MATLAB difere de seu homonimo da
linguagem C em um aspecto muito importante, ele e vetorizado ao retornar um argumento
matriz. Isto significa que o <formato> e reciclado atraves do arquivo ate o final do arquivo
ser encontrado ou a quantidade de dados definida em <tamanho> tiver sido lida,
>> frewind(fid)
% posicionar a leitura para o in
cio do arquivo
>> [A, n] = fscanf(fid, %5f%10f%*10f, [2 inf])
% ler 2 colunas
A =
1.0000
1.0000
1.2000
1.0955
1.4000
1.1832
1.6000
1.2649
1.8000
1.3416
2.0000
1.4142
n =
12
>> fclose(fid)
ans =
0
% fechar o arquivo
54
3.2
Estruturas condicionais
3.2.1
Estrutura if-end
if <condi
c~
ao>
<comandos>
end
e a execucao para a = 2,
Entre com o valor de a: 2
b =
1.4142
Neste exemplo, a raiz quadrada de a sera atribuda a b se, e somente se, o valor de a for
maior ou igual a 0.
3.2.2
Estrutura if-else-end
Caso haja duas alternativas, uma outra estrutura condicional deve ser usada
if <condi
c~
ao>
<comandos 1>
else
<comandos 0>
end
55
3.2.3
Estrutura if-elseif-end
if <condi
c~
ao 1>
<comandos 1>
elseif <condi
c~
ao 2>
<comandos 2>
elseif <condi
c~
ao 3>
<comandos 3>
. . .
else
<comandos 0>
end
56
Para a = 6 + 8i,
Entre com o valor de a: 6 + 8i
ans =
6.0000 + 8.0000i 10.0000
Deste modo foi executado o primeiro comando para o qual a condicao imag(a) ~= 0 foi
satisfeita. Portanto, na estrutura if-elseif-end uma u
nica lista de comandos e executada.
3.3
Estruturas de repeti
c
ao
A estrutura de repeticao faz com que uma sequencia de comandos seja executada repetidamente ate que uma dada condicao de interrupcao seja satisfeita. O MATLAB possui duas
estruturas de repeticao, as estruturas for-end e a while-end.
3.3.1
Estrutura for-end
for <vari
avel> = <arranjo>
<comandos>
end
onde <vari
avel> e a variavel-de-controle que assume todos os valores contidos no vetor
<arranjo>. Assim, o n
umero de repeticoes da lista <comandos> e igual ao n
umero de
elementos do vetor <arranjo>. A variavel-de-controle nao pode ser redefinida dentro da
estrutura for-end. Os comandos
n = input(Valor de n: ); s = 0; n2 = n^2;
for i = 1:2:2*n-1
s = s + i;
end
n2, s
57
executados para n = 5,
Valor de n: 5
n2 =
25
s =
25
Para n = 4,
Ordem do quadrado m
agico: 4
A =
16
2
3
13
5
11
10
8
9
7
6
12
4
14
15
1
Soma_Linhas =
34
34
34
34
Soma_Colunas =
34
34
34
34
Soma_Diagonal =
34
O MATLAB possui comandos para determinar estes somatorios de um modo mais simples
por meio do comando sum que fornece a soma das colunas de uma matriz.
58
3.3.2
Estrutura while-end
while <condi
c~
ao>
<comandos>
end
3.3.3
59
while 1
<comandos 1>
if <condi
c~
ao>
break
end
<comandos 2>
end
60
3.4
Arquivos M
Alem de se poder entrar com cada comando de uma vez, o MATLAB permite, como qualquer
outra linguagem de programacao, que seja executada uma sequencia de comandos escrita
em um arquivo. Por esta razao este tipo de arquivo e chamado de roteiro (script) e deve
possuir a extensao .m. Serao apresentados dois tipos de roteiros: programa e funcao.
3.4.1
Programa
Os arquivos M podem ser criados usando o editor de texto do MATLAB ou um outro editor
de texto qualquer e para executar um programa basta entrar com o nome do arquivo que o
contenha
>> decsomat
Ordem da matriz: 3
A =
62
82
-44
81
26
9
-74
-80
91
L =
0
0
0
81
0
0
-74
-80
0
D =
62
0
0
3.4. Arquivos M
0
0
26
0
0
91
0
0
0
82
0
0
-44
9
0
61
U =
O comando echo on e usado para que os comandos do arquivo sejam mostrados durante a
execucao e para suprimir a exibicao basta usar echo off.
Para exibir uma janela contendo um menu de escolha para o usuario e utilizado o comando
menu. Sua sintaxe e
<vari
avel> = menu(<t
tulo>, <op
c~
ao 1>, ..., <op
c~
ao n>)
cria o menu mostrado na Figura 3.1, no canto superior esquerdo da tela. A escolha do
Para interromper a execucao de um programa ate que qualquer tecla seja acionada basta
usar o comando pause. Para que a interrupcao seja por n segundos, em vez de esperar pelo
acionamento de tecla, usado-se pause (n). O comando pause e especialmente u
til quando
da exibicao de varios graficos,
62
x = -10:0.1:10;
for n = 1:5
plot(x, sin(x).*x.^n), grid on
pause
end
3.4.2
Antes de ser apresentado o segundo tipo de arquivo M (function) se faz necessario mostrar
os comandos para execucao de expressoes. O MATLAB possui dois comandos com este
proposito: feval e eval, os quais sao de grande valia, principalmente, para o usuario criar
novas functions. O comando
[v1 , v2 , . . . , vm ] = feval(<fun
c~
ao>, a1 , a2 , . . . , an )
Note que para avaliar uma expressao que possui a variavel x, esta tem que ser previamente
definida. Um uso efetivo de eval e mostrado na function pegaso da Secao 3.4.3 Subprograma function. A funcao eval e tambem capaz de executar tarefas mais complexas, para
tal, considere o programa contido no arquivo tabeval.m,
3.4. Arquivos M
63
% programa tabeval.m
%
Tabela = [sqrt(x)
exp(x)
% Observe o caractere branco entre ) e
1/x+5*x];
n = input(Escolha a express~
ao: );
x = input(Defina o argumento: );
a = eval(Tabela(n,:))
Para executa-lo,
>> tabeval
Escolha a express~
ao: 3
Defina o argumento: 2
a =
10.5000
Neste exemplo, como foi escolhido n = 3 entao a terceira expressao sera utilizada. Para x =
2 tem-se que a = 1/2+5*2 = 10,5. Considerando que a variavel Tabela e uma matriz de
caracteres, entao cada linha deve ter o mesmo n
umero de colunas (ver Secao 2.1.3 Variaveis
literais).
3.4.3
Subprograma function
Um outro tipo de arquivo de roteiro e usado para o usuario criar suas proprias funcoes. Por
exemplo, seja a funcao parabola para calcular as duas razes de uma parabola contida no
arquivo parabola.m,
function raizes = parabola(a, b, c)
%PARABOLA
ra
zes de uma par
abola.
%
PARABOLA(A, B, C) calcula as duas ra
zes da par
abola
%
P(X) = A*X^2 + B*X + C = 0
%
retornando-as no vetor RAIZES.
%
delta = sqrt(b^2 - 4 * a * c);
raizes(1) = (-b + delta ) / (2 * a);
raizes(2) = (-b - delta ) / (2 * a);
end % function parabola
Alem de possibilitar ao usuario criar as suas proprias funcoes, essas funcoes tem o mesmo
status que as outras funcoes do MATLAB,
>> lookfor parabola
parabola
- ra
zes de uma par
abola.
>> help parabola
PARABOLA
ra
zes de uma par
abola.
PARABOLA(A, B, C) calcula as duas ra
zes da par
abola
P(X) = A*X^2 + B*X + C = 0
retornando-as no vetor RAIZES.
64
O nome da funcao tem que ser igual ao nome do arquivo M onde ela esta definida, mas sem a
extensao .m, ou seja, a funcao parabola descrita acima deve estar no arquivo parabola.m.
Um arquivo pode conter mais que uma function, sendo que a primeira delas deve ter o
nome desse arquivo. As outras functions so podem ser chamadas pela primeira delas, nao
sendo possvel serem chamadas pelas functions escritas em um outro arquivo. Ao contrario
do programa no qual as variaveis sao globais, em uma function as variaveis internas sao
locais, ou seja, elas nao tem acesso e nem podem criar variaveis no espaco de trabalho. Por
sua vez, os parametros de sada (raizes no caso da function parabola) sao criados no
espaco de trabalho.
Os comandos nargin e nargout retornam o n
umero de argumentos de entrada e sada, respectivamente, especificados pelo usuario para uma function. A function pegaso calcula
o zero pertence ao intervalo [a b] da funcao definida na cadeia de caracteres funcao, utilizando o robusto e eficiente metodo pegaso. Nesta function e utilizado o comando eval
para avaliacao de expressao, o qual e descrito na Secao 3.4.2 Comandos para execucao de
expressoes,
function [Raiz, Iter, Info] = pegaso(funcao, a, b, Toler, IterMax, Exibe)
%PEGASO
C
alculo de raiz de equa
c~
ao pelo m
etodo p
egaso.
%
% par^
ametros de entrada:
%
FUNCAO: cadeia de caracteres que especifica a fun
c~
ao,
%
A: limite inferior do intervalo que cont
em a raiz,
%
B: limite superior do intervalo que cont
em a raiz,
%
TOLER: toler^
ancia no c
alculo da raiz,
%
ITERMAX: n
umero m
aximo de itera
c~
oes e
%
EXIBE: especifica se os resultados intermedi
arios ser~
ao mostrados:
%
EXIBE = O: n~
ao exibe e
%
EXIBE = 1: exibe os resultados.
% observa
c~
ao:
%
FUNCAO, A e B s~
ao necess
arios enquanto que TOLER, ITERMAX e
%
EXIBE ter~
ao valores pr
e-definidos caso n~
ao sejam fornecidos.
% par^
ametros de sa
da:
%
RAIZ: zero da fun
c~
ao,
%
ITER: n
umero gasto de itera
c~
oes e
%
INFO: informa
c~
ao, sendo
%
INFO = 0: convergiu e
%
INFO = 1: n~
ao convergiu com os par^
ametros dados.
%
if nargin < 3, error(N
umero de argumentos insuficientes), end
if nargin < 4, Toler = 1e-10; end
if nargin < 5, IterMax = 100; end
if nargin < 6, Exibe = 0; end
x = a; Fa = eval(funcao); x = b; Fb = eval(funcao);
if Exibe ~= 0
fprintf(
C
alculo de raiz de equa
c~
ao pelo m
etodo p
egaso\n)
fprintf(iter
a
b
x
Fx
delta_x\n)
end
k = 0; x = b; Fx = Fb;
3.4. Arquivos M
65
while 1
k = k + 1; deltax = -Fx / (Fb - Fa) * (b - a);
x = x + deltax; Fx = eval(funcao);
if Exibe ~= 0
fprintf(%3i%11.5f%11.5f%11.5f%14.5e%14.5e\n, k, a, b, x, Fx, deltax);
end
if ((abs(deltax) < Toler && abs(Fx) < Toler) || k >= IterMax), break, end
if Fx*Fb < 0
a = b; Fa = Fb;
else
Fa = Fa * Fb / (Fb + Fx);
end
b = x; Fb = Fx;
end
Raiz = x;
if nargout > 1, Iter = k; end
if nargout > 2, Info = abs(deltax) >= Toler || abs(Fx) >= Toler; end
end % function pegaso
Os argumentos funcao, a e b devem ser fornecidos senao uma mensagem de erro sera exibida
e a execucao da function interrompida. No entanto, os argumentos Toler (tolerancia da
raiz), IterMax (n
umero maximo de iteracoes) e Exibe (exibe resultados intermediarios)
sao opcionais; caso nao sejam includos na lista de argumentos de entrada serao atribudos
valores pre-definidos. Se forem especificados mais de seis argumentos de sada, entao havera
a exibicao de uma mensagem de erro e a interrupcao da function.
Se nenhum ou apenas um argumento de sada for especificado, entao sera retornado a raiz
da equacao na variavel Raiz. Se forem dois argumentos, entao alem da Raiz sera retornado
o n
umero gasto de iteracoes na variavel Iter. Se forem tres argumentos de sada, entao
serao retornados Raiz, Iter e a informacao sobre erro Info. Mais de tres argumentos de
sada causam a exibicao de uma mensagem de erro e a nao execucao da function.
Para calcular a raiz de f (x) = cos(x2 1) x + 1 = 0 pertencente ao intervalo [0, 2], com
tolerancia = 101 , com no maximo 10 iteracoes, listando os resultados intermediarios e
retornado a raiz, o n
umero de iteracoes e a informacao sobre erro,
>> [raiz, numiter, info] = pegaso(cos(x^2-1)*sqrt(x+1), 0, 2, 1e-1, 10, 1)
C
alculo de raiz de equa
c~
ao pelo m
etodo p
egaso
iter
a
b
x
Fx
delta_x
1
0.00000
2.00000
0.47920
8.72828e-01 -1.52080e+00
2
2.00000
0.47920
0.99219
1.41128e+00
5.12995e-01
3
2.00000
0.99219
1.68045 -4.09987e-01
6.88254e-01
4
0.99219
1.68045
1.52552
3.83307e-01 -1.54933e-01
5
1.68045
1.52552
1.60038
1.54647e-02
7.48614e-02
raiz =
1.6004
numiter =
5
66
info =
0
Por sua vez, calculando a mesma raiz com os argumentos de entrada opcionais previamente
atribudos, ou seja, tolerancia = 1010 , maximo de 100 iteracoes, nao listando os resultados
intermediarios e alem disto retornado somente a raiz e o n
umero gasto de iteracoes,
>> [raiz, numiter] = pegaso(cos(x^2-1)*sqrt(x+1), 0, 2)
raiz =
1.6034
numiter =
9
Conforme ja mencionado, a variaveis de uma function sao locais, ou seja, so podem ser
referenciadas internamente, nao sendo reconhecidas pelo espaco de trabalho e por outras
functions. No entanto, alem do uso de argumentos, um outro modo de trocar informacoes
entre o espaco de trabalho e as functionss e pelo uso de variaveis globais. A declaracao
3.4.4
Depura
c
ao de programa
3.4.5
Gerenciamento de arquivos
Diversos comandos para gerenciamento de arquivos sao disponveis, sendo alguns mostrados
na Tabela 3.5.
2
3.5. Exerccios
67
Descricao
what
dir ou ls
type <nome do arquivo>
delete <nome do arquivo>
cd <dir> ou chdir <dir>
cd ou chdir ou pwd
which <nome do arquivo>
3.5
Exerccios
Sec
ao 3.1 Comandos de entrada e sada
3.1 Verificar as diferencas entre os formatos de exibicao para as variaveis a = sqrt(2), e =
exp(10), x = 1:10, y = x e M = rand(3):
a, M, disp(a), disp(M),
format bank, x, disp(x),
format short e, a, e, x,
format compact, a, e, x,
format, fprintf(%10.5f %12.3e\n, a, e),
fprintf(%5.1f\n, x), fprintf(%5.1f\n, y)
3.2 Observar os resultados dos comandos para controle do espaco de trabalho utilizando as
variaveis do Exerccio 3.1:
who, whos, save, clear, who, load, whos,
save esptrab x y, clear, who,
load esptrab, whos, x, y
3.3 Gravar os comandos do Exerccio 3.2 no arquivo diario e usar type diario para ver o
seu conte
udo.
3.4 Gerar uma tabela de x, sen(x), 0 x /2 e grava-la no arquivo seno.dat.
3.5 Acrescentar o valor + 1, sen( + 1) na u
ltima linha do arquivo seno.dat gravado no
Exerccio 3.4.
Sec
ao 3.2 Estruturas condicionais
3.6 Qual o valor de b da estrutura if-end mostrada na Secao 3.2.1, para a = -1?
68
u11 u12 u13 u1n
b1
l11
x1
y1
c1
y2 c2
y3 c3
u33 u3n
.. ..
..
..
..
..
..
..
. .
. . . .
.
.
unn
xn
bn
yn
cn
Captulo 4
Fun
c
oes para C
alculo Num
erico
Neste captulo serao descritas algumas funcoes do MATLAB que implementam metodos
especficos usualmente abordados em textos para a disciplina Calculo Numerico. O foco sera
4.1
Algebra
linear
4.1.1
Decomposi
c
oes
69
70
0.5000
-0.4516
1.0000
4.0000
0
0
1.0000
7.7500
0
-1.0000
6.2500
8.3226
U =
P =
0
1
0
0
0
1
1
0
0
>> R = P * M - L * U
% P * M = L * U
R =
0
0
0
0
0
0
0
0
0
>> [E, D] = lu(M)
E =
0.5000
-0.4516
1.0000
1.0000
0
0
0.2500
1.0000
0
D =
4.0000
1.0000
-1.0000
0
7.7500
6.2500
0
0
8.3226
>> R = M - E * D
% M = E * D
R =
0
0
0
0
0
0
0
0
0
A funcao chol(X) fatora uma matriz simetrica definida positiva pelo metodo de Cholesky.
Ha varios usos entre os quais U = chol(X) que produz uma matriz triangular superior U tal
que U*U = X. Se X nao for definida positiva, entao sera emitida uma mensagem de erro.
Por outro lado, [U,p] = chol(X) nunca produz uma mensagem de erro. Se X for definida
positiva, entao p = 0 e U sera igual ao mencionado acima. Porem, se X nao for definida
positiva, entao p sera um inteiro positivo e U sera uma matriz triangular superior de ordem
p-1 tal que U*U = X(1:p-1,1:p-1). Por exemplo,
>> A = [4 -2 2; -2 10 -7; 2 -7 30];
>> U = chol(A)
U =
2
-1
1
0
3
-2
0
0
5
>> U * U - A
% A = U * U
ans =
0
0
0
0
0
0
4.1. Algebra
linear
71
0
0
0
>> B = [1 -2 4; -2 5 3; 4 3 8]
B =
1
-2
4
-2
5
3
4
3
8
>> U = chol(B)
??? Error using ==> chol
Matrix must be positive definite.
>> [U, p] = chol(B)
U =
1
-2
0
1
p =
3
>> U * U
ans =
1
-2
-2
5
0.4146
-0.6961
-0.5412
0.2250
72
0.5257
-0.8507
0.8507
0.5257
>> round(U*U)
% U
e ortonormal
ans =
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
>> round(V*V)
% V
e ortonormal
ans =
1
0
0
1
>> round(A -U * S * V)
% A = U*S*V
ans =
0
0
0
0
0
0
0
0
>> [U, S, V] = svd(A, 0)
U =
-0.1884
-0.5472
0.4673
0.0110
-0.4351
-0.6517
0.7462
-0.5251
S =
12.4766
0
0
6.9523
V =
0.5257
-0.8507
0.8507
0.5257
>> B = A
>> B =
2
3
1
8
-4
5
-7
6
>> [U, S, V] = svd(B, econ)
U =
-0.5257
-0.8507
-0.8507
0.5257
S =
12.4766
0
0
6.9523
V =
0.1884
-0.5472
-0.4673
0.0110
0.4351
-0.6517
-0.7462
-0.5251
>> s = svd(A)
4.1. Algebra
linear
73
s =
12.4766
6.9523
74
0
0
0
7.7275
0
0
P =
0
1
1
0
>> round(A*P - Q*R)
ans =
0
0
0
0
0
0
0
0
% A*P = Q*R
A funcao qr pode ser utilizada tanto para matrizes densas quanto para esparsas e tambem
suporta uma decomposicao mais economica. Use help qr para mais detalhes.
4.1.2
Inversa
4.1.3
7 3 -2; 9 10 5 -4; -2 -2 -1 1]
-4
-2
-4
1
6.0000
11.0000
-27.0000
7.0000
18.0000
34.0000
-82.0000
23.0000
0
0
0
1
Solu
c
ao de sistemas
Dado um sistema de equacoes lineares Ax = b, o vetor solucao x pode ser facilmente calculada por meio do operador (\). Para um sistema com matriz simetrica,
>> A = [4 -2 2; -2 10 -7; 2 -7 30];
>> b = [8 11 -31];
>> x = A \ b
% vetor solu
c~
ao
4.1. Algebra
linear
75
x =
3
1
-1
>> r = (b - A * x)
r =
0
4.1.4
Autovalores e autovetores
76
[V, D] = eig(A)
% autovalores e autovetores de A
V =
0.7387
0.5463
0.3948
0.4732
-0.8375
0.2734
-0.4799
0.0151
0.8772
D =
1.4104
0
0
0
5.6162
0
0
0
9.9734
d = eig(A)
% somente os autovalores de A
d =
1.4104
5.6162
9.9734
round(V*V)
% como A
e sim
etrica ent~
ao V
e ortonormal
ans =
1
0
0
0
1
0
0
0
1
4.1.5
Normas e condi
c
ao
O MATLAB possui uma funcao para calcular diversas normas de vetores e matrizes, bem
como uma funcao para determinar o n
umero de condicao de matrizes. O comando norm(X,p)
fornece a norma p de um vetor ou matriz X. No caso de um vetor x, o parametro p
pode ser qualquer n
umero (inteiro ou real, positivo ou negativo), alem dos caracteres inf
(norm(x,inf) = max(abs(x))) e -inf (norm(x,-inf) = min(abs(x))). Se o parametro
p for omitido, entao e assumido p = 2, ou seja, norm(x) = norm(x,2). No caso de uma
matriz X, p pode ser somente 1, 2, inf ou fro (Frobenius) e se ele for omitido tambem
sera assumido p = 2 (norm(X) = norm(X,2)). Por exemplo,
x = [-1 2 -3 4 -5];
norm(x, 2), norm(x)
% norma-2 vetorial
ans =
7.4162
ans =
7.4162
norm(x, 1)
% norma-1 vetorial
ans =
15
norm(x, inf)
% norma-inf vetorial
ans =
5
A = [1 2 3; 4 5 6; 7 8 9];
norm(A, 2), norm(A)
% norma-2 matricial
ans =
16.8481
4.1. Algebra
linear
77
ans =
16.8481
norm(A, 1)
% norma-1 matricial
ans =
18
norm(A, inf)
% norma-inf matricial
ans =
24
norm(A,fro)
% norma de Frobenius
ans =
16.8819
>> B = [5 3 0; -1 8 6; 4 2 9];
>> cond(B, 2), cond(B)
% n
umero de condi
c~
ao em norma-2
ans =
2.6641
ans =
2.6641
>> cond(B, 1)
% n
umero de condi
c~
ao em norma-1
ans =
4.7744
% rec
proco do n
umero de condi
c~
ao em norma-1
78
6.6613e-16
>> det(B)
ans =
399
A funcao trace(M) determina o traco da matriz M, isto e, a soma dos elementos da sua
diagonal principal. Para a matriz A definida anteriormente,
>> t = trace(A)
t =
15
4.2
Interpolac
ao e ajuste de curvas
O MATLAB possui funcoes intrnsecas para calculo das diferencas finitas ascendentes, interpolacao unidimensional e bidimensional e para regressao polinomial.
4.2.1
C
alculo das diferen
cas finitas ascendentes
A funcao diff(x) calcula a diferenca entre dois elementos adjacentes do vetor x. No caso
de x ser uma matriz serao tomadas as diferencas em cada uma das colunas,
>> x = [1 2 4 4 7]
x =
1
2
4
>> d1 = diff(x)
d1 =
1
2
0
4.2.2
Interpola
c
ao unidimensional
Dada uma tabela com pares (xi , yi ) especificados nos vetores x e y, respectivamente, entao
os valores de z contidos no vetor z podem ser interpolados usando a funcao interp1, cuja
sintaxe e
<resultado> = interp1(x,y,z,<m
etodo>)
parametro
linear
cubic
spline
nearest
79
metodo
interpolacao
interpolacao
interpolacao
interpolacao
linear.
por polinomios c
ubicos.
por splines c
ubicos.
vizinho mais proximo.
Quando o metodo nao for especificado sera assumida uma interpolacao linear. Por exemplo,
sejam cinco pontos da funcao y = x4 , para 1 x 1 definidos por
x = linspace(-1, 1, 5);
y = x.^4;
% ordenadas
80
A partir dos 50 pontos em x1 foram criados os vetores lin, cub e spl que contem as ordenadas obtidas por interpolacao usando polinomios lineares, c
ubicos e splines, respectivamente.
A Figura 4.1 mostra graficamente os resultados da funcao interp1. Usualmente os splines
produzem uma aproximacao mais suave da funcao como pode ser observado neste caso. A
funcao interp2 pode ser usada para se obter uma interpolacao bidimensional.
Resultados de interp1
y=x4
pontos dados
linear
cubic
splines
0.8
0.6
0.4
0.2
0.8
0.6
0.4
0.2
0
x
0.2
0.4
0.6
0.8
4.2.3
Ajuste polinomial
Apesar de a pouca exatidao dos dados o resultado nao foi muito diferente da relacao exata
que e F = 95 C + 32. Os pontos do polinomio de regressao de grau 1 avaliados para os valores
de c, isto e, P (ci ) sao obtidos pelo comando
81
40.0226
41.2077
41.8003
42.9854
44.7630
45.9481
46.5406
47.7257
48.9108
50.0959
-0.0226
-0.2077
0.1997
0.0146
0.2370
0.0519
-0.5406
0.2743
0.0892
-0.0959
O diagrama de dispersao com os pares (ci , fi ) representados por o, bem como a reta de
quadrados mnimos sao produzidos pela sequencia
>>
>>
>>
>>
>>
50
Graus Fahrenheit
48
46
44
42
40
38
14
16
18
20
22
24
Graus Celsius
26
28
30
32
82
4.3
Integrac
ao num
erica
4.3.1
F
ormula de Newton-Cotes
Func
ao quad
Esta funcao calcula uma integral pela formula de Simpson adaptativa e a sua sintaxe e
quad(<fun
c~
ao>, a, b, <toler^
ancia>, <mostra>)
100
80
1.5
60
1
y = f(x)
y = f(x)
40
20
0.5
0
0
20
0.5
40
60
5
x
8
x
10
12
14
16
Para calcular
Z 9
83
usando quad,
>> % Toler^
ancia default 10^(-6)
>> Integral = quad(cos(3*x+1) .* x.^2 + x.^1.5, 1, 9);
>> fprintf(Integral = %15.10f\n, Integral)
Integral = 102.5106397426
>>
>> % Toler^
ancia 10^(-10)
>> Integral = quad(cos(3*x+1) .* x.^2 + x.^1.5, 1, 9, 1e-10);
>> fprintf(Integral = %15.10f\n, Integral)
Integral = 102.5106396486
A funcao integrando tambem pode ser definida em um arquivo, por exemplo, usando f.m
function y = f(x)
y = cos(3*x+1) .* x.^2 + x.^1.5;
end
% f
e chama-la como
>> Integral = quad(@f, 1, 9, 1e-10);
% Fun
c~
ao definida no arquivo f.m
>> fprintf(Integral = %15.10f\n, Integral)
Integral = 102.5106396486
4.3.2
Quadratura de Gauss
Func
ao quadgk
A quadratura de Gauss-Kronrod esta implementada na funcao quadgk, cuja sintaxe e
84
e executa-se
>> [Integral, LimEr] = quadgk(@g, 0, Inf, AbsTol, 1e-5, RelTol, 1e-3);
>> fprintf(Integral = %15.10f\nLimite
= %12.5e\n, Integral, LimEr)
Integral =
1.5000000017
Limite
= 9.73015e-06
>>
>> [Integral, LimEr] = quadgk(@g, 0, Inf, AbsTol, 1e-15, RelTol, 1e-10);
>> fprintf(Integral = %15.10f\nLimite
= %12.5e\n, Integral, LimEr)
Integral =
1.5000000000
Limite
= 1.05661e-12
4.4
C
alculo de zero e mnimo de fun
c
ao
O MATLAB possui funcoes para manipular polinomios, calcular razes de equacoes e determinar o mnimo de funcoes. Para mais informacoes sobre estes topicos usar help polyfun.
4.4.1
Opera
c
oes com polin
omios
Varias funcoes sao disponveis de modo a permitir que as operacoes envolvendo polinomios
sejam feitas de um modo bem simples. Os coeficientes de um polinomio sao definidos como
elementos de um vetor, como por exemplo, P (x) = c1 xn + c2 xn1 + . . . + cn x + cn+1 e
representado pelo vetor c = [c1 c2 . . . cn cn+1 ].
Avaliac
ao
Um polinomio pode ser avaliado pela funcao polyval(c,x), onde o vetor c contem os
coeficientes do polinomio e x contem os pontos nos quais ele sera avaliado. Para avaliar
P (x) = 3x5 2x4 + 5x3 + 7x2 3x + 1 nos pontos x = 1, 2, 3, 4 e 5,
>> c = [3 -2 5 7 -3 1]; x = 1:5;
>> y = polyval(c, x)
y =
11
127
757
2981
8911
85
Adic
ao e subtrac
ao
Apesar de o MATLAB nao dispor de uma funcao para somar polinomios, esta operacao pode
ser efetuada pela adicao vetorial. Assim, para somar os polinomios a(x) = 5x3 4x2 + 1 e
b(x) = 2x3 + 5x2 x 4,
>> a = [5 -4 0 1]; b = [2 5 -1 -4];
>> c = a + b
c =
7
1
-1
-3
Multiplicac
ao
Se os vetores a e b contem os coeficientes dos polinomios a(x) e b(x), respectivamente, entao
os coeficientes do polinomio resultante da multiplicacao de a(x) por b(x) pode ser obtido pela
funcao conv(a,b). Por exemplo, a multiplicacao de a(x) = 3x2 5x + 4 por b(x) = 2x 1
e feita por,
>> a = [3 -5 4]; b = [2 -1];
>> c = conv(a, b)
c =
6
-13
13
-4
resultando no polinomio c(x) = 6x3 13x2 +13x4. Para multiplicar mais de dois polinomios
a funcao conv deve ser usada repetidamente.
Divis
ao
O comando [q,r] = deconv(a,b) faz a divisao entre os polinomios, cujos coeficientes sao os
elementos dos vetores a e b, respectivamente. O vetor q contem os coeficientes do polinomio
quociente e o vetor r contem os coeficientes do polinomio obtido pelo resto da divisao, ou
seja, a = conv(q,b) + r. A divisao de d(x) = 2x4 3x3 +4x2 5x+6 por e(x) = x2 3x+1
e efetuada por,
86
14
12
4.4.2
C
alculo de razes
87
c2 /c1 c3 /c1
1
0
0
1
C=
..
..
.
.
0
0
...
0
0
...
0
0
.
..
..
...
.
.
...
1
0
Func
ao fzero
A funcao fzero permite o calculo da raiz de uma equacao qualquer de uma variavel. Sua
sintaxe e
fzero(@<fun
c~
ao>, x0, optimset(<op
c~
oes>))
onde @<fun
c~
ao> e o nome de um arquivo M, no qual a funcao esta definida, x0 e o valor
inicial (ou um vetor contendo os limites do intervalo que contem a raiz) e as <op
c~
oes>
permitem alterar os parametros predefinidos de fzero via a function optimset (opcional).
Por exemplo, calcular uma raiz da equacao f (x) = 3x2 sen(x)ex = 0 definida no arquivo
h.m abaixo e cujo esboco e apresentado na Figura 4.3(b),
88
function y = h(x)
y = 3 * x^2 * sin(x) * exp(-x);
end
% h
x
4
3.37878
3.01123
3.15392
3.14212
3.14159
3.14159
3.14159
f(x)
-0.665343
-0.274329
0.174092
-0.015708
-0.000668368
4.62986e-07
-8.79406e-11
-8.79406e-11
Procedure
initial
interpolation
interpolation
interpolation
interpolation
interpolation
interpolation
interpolation
A funcao fzero e uma implementacao do robusto e eficiente algoritmo de van WijngaardenDekker-Brent baseado em interpolacao linear e quadratica inversas e bissecao.
4.4.3
Determina
c
ao de mnimo de func
ao
A funcao fminbnd(<fun
c~
ao>,a,b) determina o mnimo de uma funcao de uma variavel que
se encontra no intervalo (a, b). A cadeia de caracteres <fun
c~
ao> pode ser uma expressao ou o
nome de um arquivo M no qual a funcao esta definida. Para a funcao f (x) = 3x2 sen(x)ex do
arquivo h.m na Secao 4.4.2 Calculo de razes existe um mnimo no intervalo [3, 5], conforme
a Figura 4.3(b). Este mnimo pode ser obtido usando o arquivo h.m,
>> minimo = fminbnd(@h, 3, 5)
minimo =
4.2275
89
Como a funcao tambem pode ser especificada diretamente na expressao e considerando que o
maximo de f (x) e igual ao mnimo de f (x), entao o maximo de f (x) = 3x2 sen(x)ex [0, 2]
e calculado por
>> maximo = fminbnd(-3*x^2*sin(x)*exp(-x), 0, 2)
maximo =
1.7274
De modo similar `a fzero, os parametros predefinidos de fminbnd tambem podem ser alterados por meio da function optimset.
4.5
Medidas de tempo
Muitas vezes e necessario ter uma ideia do tempo gasto para executar um programa ou parte
dele, e ate mesmo comparar o desempenho de implementacoes diferentes de um programa.
Usando as funcoes tic e toc e possvel saber o tempo gasto para a execucao de um grupo
de comandos. A sua sintaxe e
tic
<comandos>
<vari
avel> = toc
O tic inicia a contagem do tempo e o toc fornece o tempo, em segundos, passado desde
o u
ltimo tic, sendo opcional a atribuicao do tempo gasto `a <vari
avel>. Por exemplo,
considere a execucao do programa no arquivo medidas.m,
%
medidas.m
%
clear
% remover todas as vari
aveis do espa
co de trabalho
nmax = 500000; repete = 10;
tic;
for k = 1:repete
for i = 1:nmax
lambda(i) = i / 10;
end
end
tic_toc = toc;
fprintf(tempo m
edio sem aloca
c~
ao = %7.3f s\n, tic_toc / repete)
tic;
lambda = zeros(1,nmax);
% pr
ealoca
c~
ao do espa
co
for k = 1:repete
for i = 1:nmax
lambda(i) = i / 10;
end
end
tic_toc = toc;
fprintf(tempo m
edio com aloca
c~
ao = %7.3f s\n, tic_toc / repete)
90
21.480 s
0.007 s
Captulo 5
Implementa
c
ao de algoritmos
Neste captulo sera mostrado como implementar alguns algoritmos basicos vistos na disciplina Calculo Numerico, utilizando a linguagem de programacao do MATLAB. Apesar de
o MATLAB possuir varias funcoes predefinidas e de grande interesse, conforme visto no
Captulo 4 Funcoes para Calculo Numerico, o objetivo deste captulo e desenvolver as habilidades de programacao. Os algoritmos dados a seguir sao o livro Algoritmos Numericos, 2a
edicao, Campos, filho, F. F., LTC Editora, 2007.
5.1
Interpolac
ao polinomial
5.1.1
Polin
omios de Newton
A Figura 5.1 exibe um algoritmo para interpolar um valor z em uma tabela definida pelos
vetores x e y usando um polinomio de Newton de diferencas divididas de grau n. Os
parametros de entrada do algoritmo sao o n
umero m de pontos, o vetor x contendo as m
abscissas xi , o vetor y com as m ordenadas yi e o ponto z a ser interpolado. O parametro
de sada e o valor r do polinomio de Newton de grau m 1 avaliado no ponto z.
5.1.2
Implementa
c
ao e uso
91
92
Algoritmo Polin
omio Newton
{ Objetivo: Interpolar valor em tabela usando polinomio de Newton }
par
ametros de entrada m, x, y , z
{ n
umero de pontos, abscissas, ordenadas e valor a interpolar }
par
ametro de sada r { valor interpolado }
para i 1 at
e m fa
ca
Dely (i) y (i)
fim para
{ construc
ao das diferencas divididas }
para k 1 at
e m 1 fa
ca
para i m at
e k + 1 passo 1 fa
ca
Dely (i) (Dely (i) Dely (i 1 ))/(x(i) x(i k))
fim para
fim para
{ avaliac
ao do polin
omio pelo processo de Horner }
r Dely (m)
para i m 1 at
e 1 passo 1 fa
ca
r r (z x(i)) + Dely (i)
fim para
fim algoritmo
93
Exemplo 5.1 Seja o arquivo interpola.dat, contendo o tamanho de dois vetores e o seus
elementos,
5
0.1
0.3
0.4
0.6
0.7
0.3162 0.5477 0.6325 0.7746 0.8367
produz os resultados,
>> interpola
Pares ordenados lidos
0.1000
0.3000
0.4000
0.6000
0.7000
0.3162
0.5477
0.6325
0.7746
0.8367
Interpola
c~
ao via polin^
omio de Newton de grau 1
z = 0.12
r = 0.3393
Interpola
c~
ao via polin^
omio de Newton de grau 2
z = 0.35
r = 0.5912
5.2
Sistemas lineares
5.2.1
Decomposi
c
ao LU com pivotac
ao parcial
A Figura 5.2 apresenta um algoritmo para a decomposicao LU de uma matriz A, via metodo
de eliminacao de Gauss com pivotacao parcial. Os parametros de entrada sao a ordem n e
a matriz A. Os parametros de sada sao as matrizes L\U escritas sobre A, o determinante
Det de A e o vetor Pivot contendo as linhas pivotais.
94
Algoritmo Decomposi
c
ao LU
{ Objetivo: Fazer a decomposicao LU de uma matriz A }
par
ametros de entrada n, A { ordem e matriz a ser decomposta }
par
ametros de sada A, Det, Pivot
{ matriz decomposta A = U + L I, determinante, pivos }
para i 1 at
e n fa
ca, Pivot(i) i, fim para; Det 1
para j 1 at
e n 1 fa
ca
{ escolha do elemento pivo }
p j; Amax abs(A(j, j))
para k j + 1 at
e n fa
ca
se abs(A(k, j)) > Amax ent
ao
Amax abs(A(k, j)); p k
fim se
fim para
se p 6= j ent
ao
{ troca de linhas }
para k 1 at
e n fa
ca
t A(j, k); A(j, k) A(p, k); A(p, k) t
fim para
m Pivot(j); Pivot(j) Pivot(p); Pivot(p) m
Det Det
fim se
Det Det A(j, j)
se abs(A(j, j)) 6= 0 ent
ao
{ eliminac
ao de Gauss }
r 1 /A(j, j)
para i j + 1 at
e n fa
ca
Mult A(i, j) r ; A(i, j) Mult
para k j + 1 at
e n fa
ca
A(i, k) A(i, k) Mult A(j, k)
fim para
fim para
fim se
fim para
Det Det A(n, n)
fim algoritmo
5.2.2
Sistemas triangulares
O algoritmo das substituicoes sucessivas para solucao de Ly = P b e apresentado na Figura 5.3. Os parametros de entrada sao a ordem n do sistema, a matriz triangular inferior
L, o vetor de termos independentes b e o vetor Pivot contendo as linhas pivotais, fornecido
pela decomposicao LU da Figura 5.2. O parametro de sada e o vetor solucao y .
95
Algoritmo Substitui
c
oes Sucessivas Pivotal
{ Objetivo: Resolver o sistema triangular inferior Ly = P b }
{
pelas substituicoes sucessivas, com a matriz L }
{
obtida de decomposicao LU com pivotacao parcial }
par
ametros de entrada n, L, b, Pivot
{ ordem, matriz triangular inferior unitaria, }
{ vetor independente e posicao dos pivos }
par
ametro de sada y { solucao do sistema triangular inferior }
k Pivot(1 ); y (1 ) b(k)
para i 2 at
e n fa
ca
Soma 0
para j 1 at
e i 1 fa
ca
Soma Soma + L(i, j) y (j)
fim para
k Pivot(i); y (i) b(k) Soma
fim para
fim algoritmo
Algoritmo Substitui
c
oes Retroativas
{ Objetivo: Resolver o sistema triangular superior U x = d }
{
pelas substituicoes retroativas }
par
ametros de entrada n, U, d
{ ordem, matriz triangular superior e vetor independente }
par
ametro de sada x { solucao do sistema triangular superior }
x(n) d(n)/U(n, n)
para i n 1 at
e 1 passo 1 fa
ca
Soma 0
para j i + 1 at
e n fa
ca
Soma Soma + U(i, j) x(j)
fim para
x(i) (d(i) Soma)/U(i, i)
fim para
fim algoritmo
5.2.3
Implementa
c
ao e uso
96
97
%
L: matriz dos coeficientes,
%
b: vetor dos termos independentes,
%
pivot: vetor com as linhas pivotais e
%
Exibe: op
c~
ao para exibir resultados: 0 n~
ao exibe e 1 exibe.
%
%
Par^
ametro de sa
da:
%
y: vetor solu
c~
ao.
%
n = length(b); y = zeros(n,1);
y(1) = b(pivot(1));
for i = 2:n
colunas = 1:i-1;
Soma = sum(L(i,colunas) .* y(colunas));
y(i) = b(pivot(i)) - Soma;
end
if Exibe
fprintf(Solu
c~
ao do sistema triangular inferior pivotado:\n)
for i = 1:n, fprintf(y(%i) = %10.5f
, i, y(i)), end, fprintf(\n)
end
end % substituicoes_sucessivas_pivotal
function x = substituicoes_retroativas(U, d, Exibe)
%
substituicoes_retroativas
resolver sistema triangular superior.
%
%
Introdu
c~
ao ao MATLAB
%
%
Par^
ametros de entrada:
%
U: matriz dos coeficientes,
%
d: vetor dos termos independentes e
%
Exibe: op
c~
ao para exibir resultados: 0 n~
ao exibe e 1 exibe.
%
%
Par^
ametro de sa
da:
%
x: vetor solu
c~
ao.
%
n = length(d); x = zeros(n,1);
x(n) = d(n) / U(n,n);
for i = n-1:-1:1
colunas = i+1:n;
Soma = sum(U(i,colunas) .* x(colunas));
x(i) = (d(i) - Soma) / U(i,i);
end
if Exibe
fprintf(Solu
c~
ao do sistema triangular superior:\n)
for i = 1:n, fprintf(x(%i) = %10.5f
, i, x(i)), end, fprintf(\n)
end
end % substituicoes_retroativas
4
-1
-2
0
1
-1
0
98
0
5
1
4
0
-2
-4
5
-3
1
-1
4
produz os resultados,
>> sistema
matriz e vetor lidos
A =
4
-1
0
-1
1
-2
1
0
0
4
-4
1
5
0
5
-1
b =
1
-2
-3
4
Decomposi
c~
ao LU com pivota
c~
ao parcial
Matrizes L \ U:
5.00000
0.00000
5.00000 -1.00000
0.00000
4.00000 -4.00000
1.00000
0.80000 -0.25000 -5.00000
0.05000
0.20000 -0.50000
0.40000
0.68000
Determinante =
68.00000
Linhas pivotais: 4 3 1 2
Solu
c~
ao do sistema triangular inferior pivotado:
y(1) =
4.00000
y(2) =
-3.00000
y(3) =
-2.95000
Solu
c~
ao do sistema triangular superior:
x(1) =
-0.66176
x(2) =
0.94118
x(3) =
0.54412
5.3
y(4) =
-3.12000
x(4) =
-4.58824
99
Integrac
ao num
erica
A integracao numerica consiste em aproximar a funcao integrando por um polinomio interpolador e determinar analiticamente a integral desse polinomio no intervalo de interesse.
Sera mostrada a quadratura de Gauss-Legendre, bem como calcular as abscissas e pesos
requeridos por essa formulacao.
5.3.1
5.3.2
Quadratura de Gauss-Legendre
A Figura 5.6 apresenta o algoritmo GaussLegendre para integrar a funcao f (x), de a ate b,
pela quadratura de Gauss-Legendre. Os parametros de entrada sao os limites de integracao
inferior a e superior b e o n
umero de pontos n 1 . A funcao f (x) deve ser especificada em
uma cadeia de caracteres.
Os parametros de sada sao o resultado da quadratura Integral e Info, a informacao sobre
consistencia dos parametros de entrada e convergencia dos zeros do polinomio de Legendre
pelo metodo de Newton-Raphson, sendo Info = 0 se houve consistencia e convergencia,
Info = 1 se n < 1 e Info = k se k zeros do polinomio nao convergiram. As abscissas e os
pesos sao calculados pelo algoritmo GaussLegendreAbsPes da Figura 5.5.
5.3.3
Implementa
c
ao e uso
100
Algoritmo GaussLegendreAbsPes
{ Objetivo: Calcular abscissas e pesos para a quadratura de Gauss-Legendre }
par
ametro de entrada n { n
umero de pontos (n 1 ) }
par
ametros de sada T , W , Info { abscissas (T (1 ): menor zero e T (n): maior zero), }
{ pesos e informac
ao sobre convergencia do metodo de Newton-Raphson, sendo }
{ Info = 0 : todos os zeros convergiram e Info = k: k zeros nao convergiram }
Info 0 ; Toler 10 15 ; IterMax 30 ; m trunca((n + 1 )/2 )
fracn 1 (1 1 /n)/(8 n2 ); pin 3 ,141592653589793 /(n + 0 ,5 )
{ os zeros s
ao simetricos, calcula-se apenas os nao negativos }
para i 1 at
e m fa
ca
z fracn cos((i 0 ,25 ) pin) { valor inicial }
{ c
alculo do i-esimo zero do polin
omio de Legendre pelo metodo de Newton-Raphson }
Iter 0
repita
{ avaliac
ao do polin
omio de Legendre e sua derivada no ponto z }
Iter Iter + 1 ; pz 1 ; p1 0
para j 0 at
e n 1 fa
ca
p0 p1 ; p1 pz; pz ((2 j + 1 ) z p1 j p0 )/(j + 1 )
fim para
dpz (n (p1 z pz))/(1 z 2 ); z1 z; z z1 pz/dpz
se abs(z z1 ) Toler ou Iter = IterMax ent
ao, interrompa, fim se
fim repita
{ verificac
ao da convergencia do i-esimo zero }
se abs(z z1 ) Toler ent
ao
T (i) z; T (n+1 i) z
{ Abscissas }
W (i) 2 /((1 z 2 ) dpz 2 ); W (n+1 i) W (i) { Pesos }
sen
ao
T (i) 0 ; T (n+1 i) 0 ; W (i) 0 ; W (n+1 i) 0 ; Info Info + 1
fim se
fim para
fim algoritmo
Algoritmo GaussLegendre
{ Objetivo: Integrar uma funcao pela quadratura de Gauss-Legendre }
par
ametros de entrada a, b, n
{ limite inferior, limite superior e n
umero de pontos (n 1 ) }
par
ametros de sada Integral, Info { valor da integral e informacao sobre }
{ consistencia e convergencia, sendo Info = 0 se houve consistencia e convergencia, }
{ Info = 1 se n < 1 e Info = k se k zeros nao convergiram }
Integral 0 ; Info 0
{ consistencia do n
umero de pontos }
se n < 1 ent
ao, Info 1 , abandone, fim se
{ c
alculo das abscissas e pesos }
[T , W , Info] GaussLegendreAbsPes(n) (ver Figura 5.5)
se Info 6= 0 ent
ao, abandone, fim se
{ c
alculo da integral }
ba2 (b a)/2
para i 1 at
e n fa
ca
x a + ba2 (T (i) + 1 ); y f (x) { avaliar a funcao integrando em x }
Integral Integral + y W (i)
fim para
Integral ba2 Integral
fim algoritmo
101
102
else
T(i) = 0; T(n+1-i) = 0; W(i) = 0; W(n+1-i) = 0; Info = Info + 1;
end
end
if Exibe
fprintf(C
alculo das abscissas e pesos para a quadratura de Gauss-Legendre:\n)
fprintf(Abscissas:\n), for i = 1:n, fprintf(T(%i) = %10.5f
, i, T(i)), end
fprintf(\nPesos:\n), for i = 1:n, fprintf(W(%i) = %10.5f
, i, W(i)), end
fprintf(\nInfo = %5i\n, Info)
end
end % gauss_legendre_abspes
Exemplo 5.3 Calcular as abscissas e pesos para a quadratura de Gauss-Legendre com quatro
pontos e exibir os resultados,
>> [T, W, Info] = gauss_legendre_abspes(4, 1);
C
alculo das abscissas e pesos para a quadratura de Gauss-Legendre:
Abscissas:
T(1) =
-0.86114
T(2) =
-0.33998
T(3) =
0.33998
T(4) =
Pesos:
W(1) =
0.34785
W(2) =
0.65215
W(3) =
0.65215
W(4) =
Info =
0
0.86114
0.34785
103
if Info ~= 0
error(Erro em gauss_legendre_abspes: abscissas n~
ao convergiram)
end
%
calculo da integral
ba2 = (b - a) / 2;
if Exibe, fprintf(
Integra
c~
ao num
erica via Gauss-Legendre\n);
fprintf(
i
t(i)
x(i)
f(x(i))
W(i)\n);
end
for i = 1:n
x = a + ba2 * (T(i) + 1); y = eval(funcao);
Integral = Integral + y * W(i);
if Exibe, fprintf(%4i %10.5f %12.5f %12.5f %10.5f\n, i, T(i), x, y, W(i)), end
end
Integral = ba2 * Integral;
if Exibe, fprintf(\nIntegral =%15.10f\nInfo
=%4i\n, Integral, Info), end
end % funcao gauss_legendre
Z
Exemplo 5.4 Calcular
5.4
3.1110975509
0
Razes de equac
oes
As razes de equacoes de grau maior que quatro nao podem ser expressas por meio de
radicais em termos dos coeficientes da equacao e tambem, para a grande maioria das equacoes
transcendentes nao existem expressoes analticas para calcular suas razes. Sera visto o
classico metodo de Newton-Raphson para realizar essa tarefa.
5.4.1
M
etodo de Newton-Raphson
104
Algoritmo NewtonRaphson
{ Objetivo: Calcular a raiz de equacao pelo metodo de Newton-Raphson }
par
ametros de entrada x0 , Toler , IterMax
{ valor inicial, toler
ancia e n
umero maximo de iteracoes }
par
ametros de sada Raiz, Iter , Info
{ raiz, n
umero gasto de iterac
oes e informacao, sendo Info = 0 : raiz calculada e }
{ Info = 1 : n
ao convergiu. }
x x0 ; Iter 0 ; deltax 1
repita
Fx f (x); DFx f 0 (x) { avaliar a funcao e sua derivada em x }
escreva Iter , x, Fx, DFx
se (abs(deltax) Toler e abs(Fx) Toler ) ou DFx = 0 ou Iter IterMax ent
ao
interrompa
fim se
deltax Fx/DFx; x x deltax; Iter Iter + 1 ; escreva deltax
fim repita
Raiz x
{ teste de convergencia }
se abs(deltax) Toler e abs(Fx) Toler ent
ao
Info 0
sen
ao
Info 1
fim se
fim algoritmo
5.4.2
Implementa
c
ao e uso
105
%
x = x0; Iter = 0; deltax = 1;
if Exibe
fprintf(\n C
alculo de raiz de equa
c~
ao pelo m
etodo de Newton-Raphson\n\n)
fprintf( k
x_k
Fx_k
DFx_k
deltax_k\n)
end
while 1
Fx = eval(funcao); DFx = eval(derivada);
if Exibe, fprintf(%3i%11.5f%14.5e%14.5e, Iter, x, Fx, DFx), end
if (abs(deltax) <= Toler && abs(Fx) <= Toler) || DFx == 0 || Iter >= IterMax
break
end
deltax = Fx / DFx; x = x - deltax; Iter = Iter + 1;
if Exibe, fprintf(%14.5e\n, deltax), end
end
Raiz = x;
% teste de converg^
encia
Info = abs(deltax) > Toler || abs(Fx) > Toler;
if Exibe, fprintf(\n\nRaiz =%9.5f\nIter =%3i\nInfo =%3i\n, Raiz, Iter, Info), end
end % newton_raphson
Exemplo 5.5 Calcular uma raiz de f (x) = 2x3 cos(x + 1) 3 = 0 pelo metodo de NewtonRaphson, a partir de x0 = 2, com tolerancia 1010 e no maximo 20 iteracoes.
>> [r,it,in] = newton_raphson(2*x^3-cos(x+1)-3,6*x^2+sin(x+1),2,1e-10,20,1);
C
alculo de raiz de equa
c~
ao pelo m
etodo de Newton-Raphson
k
0
1
2
3
4
5
6
Raiz =
Iter =
Info =
x_k
2.00000
1.42049
1.14763
1.08260
1.07913
1.07912
1.07912
1.07912
6
0
Fx_k
1.39900e+01
3.48360e+00
5.68365e-01
2.74519e-02
7.53233e-05
5.72166e-10
-8.88178e-16
DFx_k
2.41411e+01
1.27670e+01
8.74054e+00
7.90406e+00
7.86071e+00
7.86059e+00
7.86059e+00
deltax_k
5.79509e-01
2.72860e-01
6.50264e-02
3.47314e-03
9.58226e-06
7.27893e-11