Você está na página 1de 113

Introdu

c
ao ao MATLAB
Outubro de 2013

Frederico Ferreira Campos, filho


DCC.UFMG

Sum
ario

1 Ambiente de programac
ao
1.1

1.2

1.3

Janela de comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.1.1

Mudanca do diretorio corrente . . . . . . . . . . . . . . . . . . . . . .

1.1.2

Configuracao do editor . . . . . . . . . . . . . . . . . . . . . . . . . .

1.1.3

Uso do editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Comandos de auxlio ao usuario . . . . . . . . . . . . . . . . . . . . . . . . .

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

Gravar figuras em arquivo . . . . . . . . . . . . . . . . . . . . . . . .

41

Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

3 Linguagem de programac
ao
3.1

3.2

3.3

45

Comandos de entrada e sada . . . . . . . . . . . . . . . . . . . . . . . . . .

45

3.1.1

Formato de exibicao . . . . . . . . . . . . . . . . . . . . . . . . . . .

45

3.1.2

Espaco de trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

3.1.3

Diario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

49

3.1.4

Leitura e gravacao de dados . . . . . . . . . . . . . . . . . . . . . . .

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

Estrutura com interrupcao no interior . . . . . . . . . . . . . . . . . .

59

Arquivos M . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

60

3.4.1

Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

60

3.4.2

Comandos para execucao de expressoes . . . . . . . . . . . . . . . . .

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

Interpolacao e ajuste de curvas . . . . . . . . . . . . . . . . . . . . . . . . .

78

4.2.1

Calculo das diferencas finitas ascendentes . . . . . . . . . . . . . . . .

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

Calculo de zero e mnimo de funcao . . . . . . . . . . . . . . . . . . . . . . .

84

4.4.1

Operacoes com polinomios . . . . . . . . . . . . . . . . . . . . . . . .

84

4.4.2

Calculo de razes . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

86

4.4.3

Determinacao de mnimo de funcao . . . . . . . . . . . . . . . . . . .

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

Decomposicao LU com pivotacao parcial . . . . . . . . . . . . . . . .

93

5.2.2

Sistemas triangulares . . . . . . . . . . . . . . . . . . . . . . . . . . .

94

5.2.3

Implementacao e uso . . . . . . . . . . . . . . . . . . . . . . . . . . .

95

Integracao numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

99

5.3.1

Abscissas e pesos para a quadratura de Gauss-Legendre . . . . . . . .

99

5.3.2

Quadratura de Gauss-Legendre . . . . . . . . . . . . . . . . . . . . .

99

5.3.3

Implementacao e uso . . . . . . . . . . . . . . . . . . . . . . . . . . .

99

Razes de equacoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103


5.4.1

Metodo de Newton-Raphson . . . . . . . . . . . . . . . . . . . . . . . 103

5.4.2

Implementacao e uso . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

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

de Dados, Calculo Numerico, Analise Numerica, Algebra


Linear e quaisquer outras dos
cursos das areas de Ciencias Exatas e Engenharia. Tambem, serao exploradas algumas
caractersticas proprias que mostrarao por que o MATLAB e uma poderosa ferramenta de
apoio ao aprendizado e utilizacao da Computacao Cientfica.
No Captulo 1 e descrito o ambiente de programacao do MATLAB mostrando a janela de
comandos e como se obter informacoes de comandos durante a sessao. O Captulo 2 mostra
os seus elementos fundamentais, como constantes e variaveis, expressoes e graficos. No
Captulo 3, o MATLAB e apresentado como uma linguagem de programacao, sendo descritos
comandos de entrada e sada, estruturas condicionais e de repeticao, uso de arquivos e como
construir as proprias funcoes. O Captulo 4 descreve algumas funcoes intrsecas para resolver
problemas de algebra linear, interpolacao, ajuste de curvas, integracao numerica e calculo de
zeros e mnimo de funcao. Finalmente, o Captulo 5 mostra como alguns algoritmos basicos,
vistos na disciplina Calculo Numerico, podem ser implementados em MATLAB.
Sugestoes para aprimorar o presente texto, bem como, para efetuar correcoes serao bemvindas pelo e-mail: ffcampos@dcc.ufmg.br.
Belo Horizonte, outubro de 2013.
Frederico Ferreira Campos, filho
DCC.ICEx.UFMG
v

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.

Figura 1.1: Janela de comando do MATLAB em ambiente Windows.


Um comando e finalizado acionando-se a tecla Enter ou Return. Se um comando for muito
1

Captulo 1. Ambiente de programacao

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

1.1. Janela de comando

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.

Figura 1.2: Escolha do Editor.

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,

Captulo 1. Ambiente de programacao

Figura 1.3: Edicao de arquivo.


>> alo
mensagem =
al^
o mam~
ae

Para alterar o conte


udo do arquivo que esta aberto, basta editar o texto. Por exemplo,
trocar mam~
ae por papai. Como o arquivo alo.m ja existe entao ele deve ser salvo, sem
especificar o nome, usando a opcao Save (salvar) do menu File. Para executar,
>> alo
mensagem =
al^
o papai

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

A seguir, executar os comandos,


>> clear
>> whos
>> w = [1 1 3 5]
w =
1
1
3

% remover todas as vari


aveis do ambiente de trabalho
% listar as vari
aveis correntes
% criar um vetor
5

1.2. Comandos de auxlio ao usuario

>> 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

Comandos de auxlio ao usu


ario

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>

Captulo 1. Ambiente de programacao

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

General purpose commands.


Operators and special characters.
Programming language constructs.
Elementary matrices and matrix manipulation.
Random matrices and random streams.
Elementary math functions.
Specialized math functions.
Matrix functions - numerical linear algebra.
Data analysis and Fourier transforms.
Interpolation and polynomials.
Function functions and ODE solvers.
Sparse matrices.
Annotation and Plot Editing.
Two dimensional graphs.
Three dimensional graphs.
Specialized graphs.
Handle Graphics.
Graphical User Interface Tools.
Character strings.
Image and scientific data input/output.
File input and output.
Audio and Video support.
Time and dates.
Data types and structures.
Version control.
Commands for creating and debugging code
Help commands.
Examples and demonstrations.
Time series data visualization and exploration.
Graphical User Interface Tools.
Graphical User Interface Tools.

1.2. Comandos de auxlio ao usuario

toolbox/local
controllib/general
controllib/graphics
optim/optim
optim/optimdemos
shared/optimlib
toolbox/stats
shared/statslib
symbolic/symbolic

General preferences and configuration information.


Control Library - General Utilities.
Control Library - Graphics.
Optimization Toolbox
Demonstrations of large-scale methods.
Optimization Toolbox Library
Statistics Toolbox
Statistics Toolbox Library
Symbolic Math Toolbox

importante notar que os topicos listados irao depender da instalacao do MATLAB em um


E
computador particular. Estes topicos podem variar de acordo com essa instalacao. Para
obter auxlio sobre as funcoes matematicas especializadas,
>> help specfun
Specialized math functions.
Specialized math functions.
airy
- Airy functions.
besselj
- Bessel function of the first kind.
bessely
- Bessel function of the second kind.
besselh
- Bessel functions of the third kind (Hankel function).
besseli
- Modified Bessel function of the first kind.
besselk
- Modified Bessel function of the second kind.
beta
- Beta function.
betainc
- Incomplete beta function.
betaincinv - Inverse incomplete beta function.
betaln
- Logarithm of beta function.
ellipj
- Jacobi elliptic functions.
ellipke
- Complete elliptic integral.
erf
- Error function.
erfc
- Complementary error function.
erfcx
- Scaled complementary error function.
erfinv
- Inverse error function.
expint
- Exponential integral function.
gamma
- Gamma function.
gammainc
- Incomplete gamma function.
gammaincinv - Inverse incomplete gamma function.
gammaln
- Logarithm of gamma function.
psi
- Psi (polygamma) function.
legendre
- Associated Legendre function.
cross
- Vector cross product.
dot
- Vector dot product.
Number theoretic functions.
factor
- Prime factors.
isprime
- True for prime numbers.
primes
- Generate list of prime numbers.
gcd
- Greatest common divisor.
lcm
- Least common multiple.
rat
- Rational approximation.
rats
- Rational output.

Captulo 1. Ambiente de programacao

perms
nchoosek
factorial

- All possible permutations.


- All combinations of N elements taken K at a time.
- Factorial function.

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.

O comando help e mais conveniente se o usuario conhecer exatamente o topico em que


deseja auxlio. No caso de nao saber soletrar ou mesmo desconhecer um topico as outras
duas formas de assistencia sao muitas vezes mais produtivas.

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>

onde <palavra-chave> e a cadeia de caracteres que sera procurada nos comandos do


MATLAB. Para informacoes sobre a matriz identidade,
>> lookfor identity
eye
speye

- 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

EYE with no arguments is the scalar 1.


EYE(M,N,CLASSNAME) or EYE([M,N],CLASSNAME) is an M-by-N matrix with 1s
of class CLASSNAME on the diagonal and zeros elsewhere.
Note: The size inputs M and N should be nonnegative integers.
Negative integers are treated as 0.
Example:
x = eye(2,3,int8);
See also speye, ones, zeros, rand, randn.
Reference page in Help browser
doc eye

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

Captulo 1. Ambiente de programacao

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

Captulo 2. Elementos fundamentais

>> 8/5
ans =
1.6000

Algumas linguagens de programacao requerem um tratamento especial para n


umeros complexos, o que nao e o caso do MATLAB. Operacoes matematicas com n
umeros complexos
sao escritas do mesmo modo como para n
umeros reais,
>> a=3+2i
a =
3.0000 + 2.0000i
>> b=5-7j
b =
5.0000 - 7.0000i

Note que as letras i e j sao usadas para indicar a parte imaginaria do n


umero complexo.
As variaveis reais e complexas ocupam 8 e 16 bytes de memoria, respectivamente.
Na Secao 2.2 Expressoes serao apresentados os tipos de expressoes possveis. Como qualquer
outra linguagem de programacao, o MATLAB tem regras a respeito do nome de variaveis,
conforme mostrado na Tabela 2.1.
Tabela 2.1: Regras para nomes de variaveis.
Regra sobre nome de variavel
conter ate 63 caracteres
comecar com letra seguida de
letras, n
umeros ou ( )
Tamanho da letra e diferenciador

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

Um arranjo ou vetor e um conjunto de variaveis homogeneas (conte


udo de mesmo tipo)
identificadas por um mesmo nome e individualizadas por meio de ndices. O arranjo pode
ser definido elemento por elemento,

a = [a1 ,a2 , . . . ,an ]

separados por espaco em branco ou vrgula,


>> a = [5 1.5,-0.3]
a =
5.0000
1.5000

-0.3000

2.1. Constantes e variaveis

13

O vetor a possui os elementos a(1) = 5, a(2) = 1.5 e a(3) = -0.3. Se os valores do


arranjo forem igualmente espacados ele pode ser definido pela expressao

b = <valor inicial>:<incremento>:<valor final>

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

Se o incremento desejado for igual a 1, entao ele podera ser omitido,


>> u = 5:9
u =
5
6

Em vez de se usar incremento, um arranjo tambem pode ser construdo definindo o n


umero
desejado de elementos na funcao linspace, cuja sintaxe e

linspace(<valor inicial>,<valor final>,<n


umero de elementos>)

Assim, para criar um arranjo com o primerio elemento igual a 10, o u


ltimo igual a 40 e
possuindo 7 elementos,
>> c = linspace(10,40,7)
c =
10
15
20
25

30

35

40

Foi gerado um vetor identico a b = 10:5:40 definido acima. Se no comando linspace o


parametro <n
umero de elementos> for omitido, entao serao gerados 100 pontos. Os elementos tambem podem ser acessados individualmente,
>> c(2)
ans =
15

% segundo elemento de c

ou em blocos usando os comandos de definicao de arranjos,

14

Captulo 2. Elementos fundamentais

>> c(3:5)
% terceiro ao quinto elemento
ans =
20
25
30
>> c(4:end)
% quarto ao
ultimo elemento
ans =
25
30
35
40

Lembrando que 5:-2:1 gera a sequencia 5, 3, 1, segue-se que,


>> c(5:-2:1)
ans =
30
20

% quinto, terceiro e primeiro elementos


10

O enderecamento indireto tambem e possvel, permitindo referenciar os elementos em qualquer ordem,


>> c([4 1])
ans =
25
10

% quarto e primeiro elementos

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

Separando os elementos de um arranjo por brancos ou vrgulas sao especificados os elementos


em diferentes colunas (vetor linha). Por outro lado, separando os elementos por ponto-evrgula especifica-se os elementos em diferentes linhas (vetor coluna). Para transformar um
vetor linha em um vetor coluna e vice-versa, e usado o operador de transposicao ()
>> x = v
x =
1.5000
-3.2000
>> y = (1:3)
y =
1
2
3

-8.9000

2.1. Constantes e variaveis

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

e o complexo conjugado transposto


>> cc = z
cc =
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),

A = [a11 a12 . . . a1n ;a21 a22 . . . a2n ; . . . ; am1 am2 . . . amn ]

16

Captulo 2. Elementos fundamentais

Para criar uma matriz A com 2 linhas e 3 colunas,


>> A = [3 2 -5; 4 7 9]
A =
3
2
-5
4
7
9

Para modificar um elemento basta atribuir-lhe um novo valor,


>> A(1,2) = 8
A =
3
8
4
7

-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

Seja agora a matriz quadrada B de ordem 3,


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

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

2.1. Constantes e variaveis

17

A notacao de vetor, <valor inicial>:<incremento>:<valor final>, tambem pode ser


usada ou ate mesmo linspace. Os elementos das linhas 1 e 2 e u
ltima coluna sao
>> B(1:2,end)
ans =
3
6

Lembrando que 3:-1:1 gera a sequencia 3, 2, 1 e 1:3 produz 1, 2, 3, entao o comando


>> C = B(3:-1:1,1:3)
C =
7
8
9
4
5
6
1
2
3

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 criar uma matriz D a partir das linhas 1 e 2 e colunas 1 e 3 de B, faz-se


>> D = B(1:2,[1 3])
D =
1
3
4
6

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

Captulo 2. Elementos fundamentais

>> E(:,3) = []
E =
1
2
4
5
7
8

8
5
2

2
2
2

E posteriormente para remover a linha 1,


>> E(1,:) = []
E =
4
5
7
8

5
2

2
2

A funcao size e usada para fornecer o n


umero de linhas e colunas de uma matriz. Ela pode
ser usada de duas formas:
>> tam = size(E)
tam =
2
4

onde a variavel tam e um vetor linha com duas posicoes, contendo o n


umero de linhas e
colunas de E, respectivamente. A outra forma e
>> [nlin, ncol] = size(E)
nlin =
2
ncol =
4

onde as variaveis simples nlin e ncol contem o n


umero de linhas e colunas de E, respectivamente. Se a funcao length for usada em uma matriz, entao ela fornecera o maior valor
entre n
umero de linhas e colunas,
>> m = length(E)
m =
4

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,

2.1. Constantes e variaveis

19

Tabela 2.2: Exemplos de funcoes.


Funcao
sum
prod
mean
std
max
min
sort

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

Captulo 2. Elementos fundamentais

aquelas mostradas na Tabela 2.3.


Tabela 2.3: Algumas funcoes para operacoes de matrizes.
Funcao
diag

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.

Para a matriz A dada acima,


>> d = diag(A)
d =
16
11
6
1
>> D = diag(d)
D =
16
0
0
11
0
0
0
0
>> L = tril(A)
L =
16
0
5
11
9
7
4
14
>> U = triu(A)
U =
16
2
0
11
0
0
0
0

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)

2.1. Constantes e variaveis

21

Tabela 2.4: Algumas matrizes elementares.


Funcao
zeros
ones
eye
rand
randn

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

As funcoes rand e randn produzem n


umeros pseudoaleatorios e a sequencia gerada e determinada pelo estado do gerador. Quando o MATLAB for ativado, e atribudo um mesmo
valor inicial ao estado, e portanto, a sequencia de n
umeros gerados sera a mesma. Depois
de gerada uma sequencia o estado do gerador e mudado. Para colocar o gerador no estado
inicial usa-se o comando
reset(RandStream.getDefaultStream);

2.1.3

Vari
aveis literais

Uma variavel pode conter uma cadeia de caracteres em vez de um n


umero. Estes caracteres
sao manipulados iguais aos vetores linha. A cadeia de caracteres deve estar delimitada por
apostrofos para ser atribuida a uma variavel literal. Assim,

22

Captulo 2. Elementos fundamentais

>> a = MATLAB, b = cadeia de caracteres


a =
MATLAB
b =
cadeia de caracteres

Para obter os caracteres das posicoes 4, 5 e 6 da variavel a,


>> c = a(4:6)
c =
LAB

Os caracteres podem ser concatenados,


>> d = [a manipula b]
d =
MATLAB manipula cadeia de caracteres

e as cadeias de caracteres contendo mais de uma linha devem ter o mesmo n


umero de colunas
como acontece com as matrizes,
>> e = [O MATLAB
permite
matrizes
literais]
e =
O MATLAB
permite
matrizes
literais

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

Uma expressao e uma combinacao de constantes, variaveis e operadores, cuja avaliacao


resulta em um valor u
nico. O MATLAB suporta tres tipos de expressoes: aritmeticas,
logicas e literais.

2.2. Expressoes

23

Tabela 2.5: Variaveis especiais.


Variavel
ans
pi
eps

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

Sao disponveis as operacoes aritmeticas basicas mostradas na Tabela 2.6. As expressoes


sao avaliadas da esquerda para a direita, tendo a potenciacao maior ordem de precedencia,
seguida pela multiplicacao e divisao (ambas tendo igual precedencia) e seguida pela adicao e
subtracao (com igual precedencia). Os parenteses podem ser usados para alterarem a ordem
de precedencia.
Tabela 2.6: Operacoes aritmeticas basicas.
Operacao
Expressao
adicao
a+b
subtracao
ab
multiplicacao
ab
divisao
ab
potenciacao
ab

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

Captulo 2. Elementos fundamentais

Tabela 2.7: Operacoes vetoriais basicas.


Seja a = [ a1 a2 ...an ], b = [ b1 b2 ...bn ] e c um escalar
Operacao

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

Tabela 2.8: Operacoes matriciais basicas.


Seja c um escalar e
A = [ a11 a12 ... a1n ; a21 a22 ... a2n ; ... ; am1 am2 ... amn ]
B = [ b11 b12 ... b1n ; b21 b22 ... b2n ; ... ; bm1 bm2 ... bmn ]
Operacao

Expressao

Resultado

adicao escalar

A+c

aij + c

adicao matricial

A+B

aij + bij

multiplicacao escalar

A*c

aij c

multiplicacao por elemento

A.*B

aij bij

multiplicacao matricial

A*B

AB

divisao por elemento

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

Captulo 2. Elementos fundamentais

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

Tabela 2.9: Funcoes matematicas elementares.


Funcao

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

maximo divisor comum

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

Captulo 2. Elementos fundamentais

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

O resultado de uma relacao ou de uma expressao logica e verdadeiro ou falso, contudo no


MATLAB o resultado e numerico, sendo que 1 significa verdadeiro e 0 significa falso. Note
que (=) e usado para atribuicao de um valor a uma variavel enquanto que (==) e usado
para comparacao de igualdade. Os operadores relacionais podem ser usados para comparar
vetores do mesmo tamanho ou comparar um escalar com os elementos de um vetor. Em
ambos os casos o resultado sera um vetor de mesmo tamanho. Por exemplo, sejam os vetores
a e b e o escalar c,
>> a = 1:10, b = 9:-1:0, c = 5
a =
1
2
3
4
5
b =
9
8
7
6
5
c =
5

10

Assim,
>> d = a >= c
d =
0
0

produz um vetor que contem o valor 1 (verdadeiro) quando o elemento correspondente do


vetor a for maior ou igual a 5, caso contrario contem o valor 0 (falso). Como no MATLAB
o resultado da relacao logica e um valor numerico, este pode fazer parte de uma expressao
aritmetica,

2.2. Expressoes

>> e = a + (b <= 3)
e =
1
2
3

10

29

11

Portanto, quando um elemento de b for menor ou igual a 3, o valor 1 (resultado da relacao


logica) e adicionado ao correspondente valor de a.
Os operadores logicos permitem a combinacao ou negacao das relacoes logicas. A Tabela 2.11
apresenta os resultados obtidos com os operadores logicos, sendo e1 e e2 expressoes logicas
e V significando verdadeiro e F falso.
Tabela 2.11: Resultados com operadores logicos.
e1 e
e1 \e2
V
F

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

Os elementos de f sao iguais a 1 quando os correspondentes elementos de a forem maiores do


que 3 e menores ou iguais a 8. Para fazer a negacao, ou seja, onde for 1 sera 0 e vice-versa,
>> g = ~f
g =
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

Captulo 2. Elementos fundamentais

>> 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

a expressao A > 4 e B 4 resulta em


>> A > 4 & B <= 4
ans =
0
0
0
0
1
1

0
1

por sua vez, A 5 ou B > 4 produz


>> A <= 5 | B > 4
ans =
1
1
1
1
0
0

1
0

e ~(A > 3) que e o mesmo que A 3, leva a


>> ~(A > 3)
ans =
1
1
0
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

e equivalente a`s varias etapas


>> h1 = a - 5

32

Captulo 2. Elementos fundamentais

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

O MATLAB dispoe de varias funcoes para manipulacao de cadeia de caracteres conforme


pode ser obtido por help strfun. Algumas delas sao mostradas a seguir. O comando n =
abs(s) retorna no vetor n os valores numericos dos caracteres ASCII (American Standard
Code for Information Interchange) contidos no vetor s de acordo com a Tabela 2.14. Por
exemplo, para o vetor s de tamanho 4,
>> s = 5+3i
s =
5+3i
>> n = abs(s)
n =
53
43

51

105

De modo contrario, c = setstr(m) constroi a cadeia de caracteres c a partir do vetor


numerico m. Este comando e particularmente u
til para escrever textos em portugues em
versoes mais antigas do MATLAB (ver Tabela 2.15).
>> m = [70 117 110 231 227 111]

2.2. Expressoes

Tabela 2.14: Caracteres em codigo ASCII.


33
34
35
36
37
38
39
40
41
42
43
44

45
46
47
48
49
50
51
52
53
54
55
56

!
"
#
$
%
&

(
)
*
+
,

Representacao decimal dos caracteres


- 57 9 69 E 81 Q 93 ] 105
. 58 : 70 F 82 R 94 ^ 106
/ 59 ; 71 G 83 S 95 _ 107
0 60 < 72 H 84 T 96 108
1 61 = 73 I 85 U 97 a 109
2 62 > 74 J 86 V 98 b 110
3 63 ? 75 K 87 W 99 c 111
4 64 @ 76 L 88 X 100 d 112
5 65 A 77 M 89 Y 101 e 113
6 66 B 78 N 90 Z 102 f 114
7 67 C 79 O 91 [ 103 g 115
8 68 D 80 P 92 \ 104 h 116

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
{
|
}
~

Tabela 2.15: Caracteres em codigo ASCII extendido.


192
193
194
195
196
197
198
199

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

ou de um modo mais simples,


>> d = [N,setstr(250),mero]
d =
N
umero

111

decimal dos caracteres


224 a
` 232 e
`
`
U 225 a
233 e

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

Captulo 2. Elementos fundamentais

A funcao str2num(<cadeia de caracteres>) converte a representacao do valor numerico


da <cadeia de caracteres> escrita em codigo ASCII para a representacao numerica. A
<cadeia de caracteres> deve estar escrita de acordo com as regras de definicao de constantes numericas vistas na Secao 2.1 Constantes e variaveis,
>> x = str2num(1.23d2+5.678e-1i)
x =
1.2300e+02 + 5.6780e-01i

com este valor numerico e possvel, por exemplo, extrair a raiz quadrada,
>> y = sqrt(x)
y =
11.0906 + 0.0256i

Por outro lado, a funcao t = num2str(a) converte o n


umero a para a sua representacao
em caracteres. Esta funcao e de grande utilidade quando da escrita de rotulos e ttulos em
graficos (ver Secao 2.3 Graficos),
>> v = 4.1542784;
>> titulo = [velocidade = ,num2str(v), m/s]
titulo =
velocidade = 4.1543 m/s

O resultado de num2str e exibido normalmente com 4 dgitos. Se um parametro extra,


composto por uma cadeia de caracteres, for dado, entao ele indicara o formato a ser exibido,
como na function fprintf (ver Tabela 3.3, na pagina 51).
>> num2str(v, %8.5f)
ans =
4.15428

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);

Para gerar um grafico de sen(x) em funcao de x basta,


>> plot(x,y)

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

Captulo 2. Elementos fundamentais

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)

b) f (x) = sen(x) e f (x) = cos(x)

Figura 2.1: Graficos produzidos pelo comando plot.


Tabela 2.17: Funcoes para identificacao de graficos.
Comando
xlabel(<texto>)
ylabel(<texto>)
title(<texto>)
text(xi ,yi ,<texto>)
gtext(<texto>)

Descricao
escreve
escreve
escreve
escreve
escreve

<texto>
<texto>
<texto>
<texto>
<texto>

abaixo do eixo das abscissas;


ao lado do eixo das ordenadas;
no alto da figura;
na posicao (xi ,yi );
na posicao indicada pelo mouse.

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

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

Figura 2.2: Documentacao de graficos.


Func
ao fplot
O comando fplot(<fun
c~
ao>,[Xmin Xmax]) faz com que a funcao especificada pela cadeia
de caracteres <fun
c~
ao> seja esbocada no intervalo Xmin x Xmax. Os comandos
>> fplot(sin(x)*x,[-20 20]); grid on
>> xlabel(x); ylabel(f(x)); title(f(x) = sen(x)*x)

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

Figura 2.3: Esbocos da funcao f (x) = sen(x)x pelo comando fplot.


de caracteres <fun
c~
ao> seja esbocada somente para Xmin x Xmax e Ymin f (x)
Ymax usa-se o comando fplot(<fun
c~
ao>,[Xmin Xmax Ymin Ymax]). Deste modo, os
comandos abaixo geram o grafico da Figura 2.3(b),

38

Captulo 2. Elementos fundamentais

>> fplot(sin(x)*x,[-18 18 -10 10]); grid on


>> xlabel(x); ylabel(f(x)); title(f(x) = sen(x)*x)

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>, ...)

onde X, Y e Z sao matrizes de mesmo tamanho contendo as coordenadas tridimensionais dos


pontos a serem exibidos e <tipo de linha> e uma cadeia de 1 a 4 caracteres que especifica a
cor e o estilo da linha de acordo com a Tabela 2.16 da pagina 35. Se X, Y e Z forem vetores de
mesmo tamanho, entao e esbocada uma linha no espaco tridimensional, cujas coordenadas
sao os elementos destes vetores. Para produzir o esboco da funcao z = sen(x) cos(y)2 no
intervalo 3 x 3 e 2 y 2, mostrado na Figura 2.4(a), utiliza-se os comandos
>>
>>
>>
>>
>>

[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

Figura 2.4: Esbocos da funcao z = sen(x) cos(y)2 usando plot3 e mesh.


Func
oes mesh, meshc e meshz
A funcao mesh(X,Y,Z) produz o esboco de uma malha na superfcie especificada pelas
matrizes X, Y e Z. A funcao meshc(X,Y,Z) esboca a malha com contornos desenhados abaixo
e meshz(X,Y,Z) faz o esboco da malha com um plano de referencia. Os comandos

40
>>
>>
>>
>>
>>

Captulo 2. Elementos fundamentais

[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)

geram o esboco mostrado na Figura 2.4(b). Por outro lado,


>> meshc(X,Y,Z); grid on
>> xlabel(eixo x); ylabel(eixo y); zlabel(eixo z)
>> title(meshc)

usando a mesma matriz Z definida acima e


>> meshz(X,Y,Z); grid on
>> xlabel(eixo x); ylabel(eixo y); zlabel(eixo z)
>> title(meshz)

produzem os esbocos apresentados na Figuras 2.5(a) e (b).


meshz

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

Figura 2.5: Esbocos de z = sen(x) cos(y)2 usando meshc e 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

com a matriz Z definida acima e


>>
>>
>>
>>
>>

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

Figura 2.6: Esbocos de z = sen(x) cos(y)2 usando surf e surfl.

2.3.3

Gravar figuras em arquivo

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

print -d<disp> <nome do arquivo>

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

Captulo 2. Elementos fundamentais

Tabela 2.18: Alguns dispositivos para gravacao de arquivos de figuras.


<disp>
Descricao
PostScript para impressoras eps
PostScript encapsulado para
em preto e branco
impressoras em preto e branco
psc
PostScript para impressoras epsc
PostScript encapsulado para
em cores
impressoras em cores
ps2
PostScript nvel 2 para impres- esp2
PostScript nvel 2 encapsulado
soras em preto e branco
para impressoras em preto e
branco
psc2
PostScript nvel 2 para impres- epsc2
PostScript nvel 2 encapsulado
soras em cores
para impressoras em cores
jpeg<nn> JPEG, nvel de qualidade <nn> png
Portable Network Graphic 24bit
<disp>
ps

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.3 Construir os vetores e verificar as expressoes


a = [1 3.5 -4.2 7.5], b = 10:5:30,
c = 5:-2:-6, d = 5:10, e = linspace(0,10,5),
e(3), e(2:4), e(3:-1:1), e([5 1 3]),
f = e, g = e(:), h = (2:3:11)

2.4 Construir as matrizes e verificar o resultado das funcoes


A = [6 -1 4; 0 2 -3; 5 7 8], A(2,1) = 1,
B = A(2:3,[2 3 1]),
C = [A B], C(:,[2 4]) = [], C(2,:) = [],
size(C), sum(C), sum(C),
prod(C), prod(C), min(C), max(C),
zeros(3,5), ones(4), eye(5),
D = rand(3), diag(diag(D)),
triu(D), tril(D)

2.4. Exerccios

43

2.5 Analisar o resultado dos comandos


s = MATLAB, [s em ordem reversa : s(end:-1:1)]

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

2.7 Seja a = 1, b = 2, c = 3, d = 4, e = 5. Avaliar


x =

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

2.8 Avaliar as expressoes vetoriais


u = 2:6, v = linspace(10,14,5), k = 5,
u-k, u+v, u*k, u.*v,
u./v, u.\v,
u.^k, k.^u, v.^u

2.9 Avaliar as expressoes matriciais


M = [2 -3 1; 4 6 -1; -5 2 1],
N = [1 1 2; 3 1 -1; 3 2 1],
x = (1:3), z = 2
M-z, M+N,
M*z, M.*N, M*N, M*x,
M./N, M.\N,
M.^z, M^z, z.^M, z^M, M.^N

2.10 Verificar a diferenca entre as funcoes usando a = e a = 5,6:


ceil(a), fix(a), floor(a),
round(a), sign(a)

44

Captulo 2. Elementos fundamentais

2.11 Para c = 3 + 4i e c = 5 3i, observar os resultados das funcoes complexas


abs(c), conj(c),
real(c), imag(c)

2.12 Com relacao a`s variaveis logicas, dados


a
b
c
d

=
=
=
=

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

2.13 Avaliar as expressoes logicas para x = -5:5


x > -2 & x <= 3, x > 3 | abs(x) > 2

2.14 Definir os comandos para gerarem as cadeias de caracteres


T
tulo, vari
avel e equa
c~
oes.
2.15 Qual a diferenca entre as funcoes str2num e num2str?
Se
c
ao 2.3 Gr
aficos
2.16 Seja a funcao y = e1+x/10 + cos(x)x. Gerar uma tabela com 20 pontos para 5 x 5
e exibir o grafico da funcao usando o comando plot colocando rotulos e grade.
2.17 Repetir a operacao acima usando 50 pontos e sem usar grade.
2.18 Gerar uma tabela de 40 pontos para y = sen(x)x, 10 x 10 e exibir o seu grafico
usando o comando fplot com rotulos e grade.
2.19 Seja a funcao z = sen(x)y 2 . Gerar uma superfcie com 5 x 5 e 3 y 3
usando os comandos meshc e meshz.
2.20 Usando os comandos surf e surfl exibir a superfcie de z = x cos(x) sen(y) com
x e y .

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

Comandos de entrada e sada

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

Captulo 3. Linguagem de programacao

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

Tabela 3.1: O comando format.

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

remove as variaveis tempo e raiz,


remove todas as variaveis do espaco de trabalho.
Atenc
ao: nao sera solicitada a confirmacao. Todas
as variaveis estarao irremediavelmente removidas.

O comando save e usado para gravar as variaveis do espaco de trabalho em um arquivo.


Sua sintaxe e

save <nome do arquivo> <vari


aveis> <formatos>

Os nomes das vari


aveis s
ao separados por espaco em branco e nao por vrgula.

3.1. Comandos de entrada e sada

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

ao> sao intercaladas em


As variaveis salvas no arquivo ASCII <nome do arquivo>.<extens~
umeros complexos usando
uma u
nica variavel denominada <nome do arquivo>. Ao salvar n
a chave -ascii faz com que a parte imaginaria dos dados seja perdida, pois o MATLAB
nao pode carregar o dado nao numerico i.
O comando load e usado para recuperar os dados gravados em um arquivo pelo comando
save e coloca-los no espaco de trabalho. Sua sintaxe e

load <nome do arquivo>.<extens~


ao>

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

Captulo 3. Linguagem de programacao

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. Comandos de entrada e sada

3.1.3

49

Di
ario

Todos os comandos solicitados pelo usuario e as respostas fornecidas (com excessao de


graficos) podem ser gravados em um arquivo ASCII para que possam ser impressos ou
includos em um texto.
Para esta gravacao basta usar o comando diary <nome do arquivo>, a partir do qual a
interacao usuario / MATLAB sera registrada. A suspensao do registro e feita por diary
off e a reinicializacao e obtida por diary on. Por esta razao, os u
nicos nomes de arquivos
que nao sao permitidos sao on e off.

3.1.4

Leitura e grava
c
ao de dados

A transferencia de dados entre o espaco de trabalho e algum dispositivo de entrada e sada


(arquivo em disco, pendrive, impressora etc.) aumenta a utilizacao do MATLAB visto tornar
possvel a troca de informacoes com um outro programa.
Abertura de arquivo
O comando fopen abre um arquivo ou obtem informacoes sobre os arquivos abertos. Sua
sintaxe e

[fid, <mensagem>] = fopen(<nome do arquivo>, <permiss~


ao>)

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

Abre o arquivo para leitura.


Abre o arquivo para leitura e escrita, mas nao cria o arquivo.
Abre o arquivo para escrita e caso necessario cria o arquivo. Porem,
remove o conte
udo do arquivo existente.
Abre o arquivo para leitura e escrita e se necessario cria o arquivo.
Todavia, remove o conte
udo do arquivo existente.
Cria e abre um arquivo novo ou abre um arquivo ja existente para
escrita, anexando ao final do arquivo.
Cria e abre um arquivo novo ou abre um arquivo ja existente para
leitura e escrita, anexando ao final do arquivo.

w+
a
a+

50

Captulo 3. Linguagem de programacao

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

[<tamanho> =] fprintf(fid, <formato>, <vari


avel>)

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

3.1. Comandos de entrada e sada

51

Tabela 3.3: Formatos de exibicao.


Formato
%ni
%n.df
%n.de
%n.dg
%ns

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.

O comando fprintf do MATLAB difere de seu homonimo da linguagem C em um aspecto


muito importante, ele e vetorizado no caso da variavel a ser exibida ser uma matriz. Nesse
caso, o formato e aplicado aos elementos da matriz, por coluna, ate a u
ltima linha. Ele e
entao usado de modo similar, sem reinicializacao, pelos demais elementos das outras colunas
da matriz. Veja a diferenca entre os dois comandos fprintf usando a matriz M,
>> x = 1:0.5:2
x =
1.0000
1.5000
2.0000
>> M = [x; sqrt(x)]
M =
1.0000
1.0000
1.5000
1.2247
2.0000
1.4142
>> fprintf(%5.2f %10.5f \n, M)
1.00
1.50000
2.00
1.00000
1.22
1.41421
>> fprintf(%5.2f %10.5f \n, M)
1.00
1.00000
1.50
1.22474
2.00
1.41421

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

Captulo 3. Linguagem de programacao

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

Usar o comando help fprintf para mais informacoes.


Leitura em arquivo
O comando fscanf efetua a leitura de dados formatados em um arquivo. Sua sintaxe e

[<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

Le ate n valores em um vetor coluna.


Le ate o fim do arquivo, resultando em um vetor coluna contendo o
mesmo n
umero de elementos do arquivo.
Le os valores suficientes para preencher uma matriz de dimensao m n,
preenchendo esta matriz por coluna; n pode ser igual a` inf mas nao pode
ser igual a` m.

[m,n]

3.1. Comandos de entrada e sada

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,

>> fid = fopen(sqrtexp.dat, r)


% abrir o arquivo para leitura
fid =
3
>> [A, n] = fscanf(fid, %5f%10f%10f, [3 inf])
% ler 3 colunas
A =
1.0000
1.2000
1.4000
1.6000
1.8000
2.0000
1.0000
1.0955
1.1832
1.2649
1.3416
1.4142
0.3679
0.3012
0.2466
0.2019
0.1653
0.1353
n =
18

Se o caractere * for colocado entre o % e um caractere de conversao (d, e, f, g ou s), entao


o correspondente valor combinado nao sera armazenado na <vari
avel>,

>> 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

O comando frewind(fid) e usado para posicionar o acesso ao primeiro registro do arquivo,


cujo identificador seja fid. Durante o processo de leitura e importante verificar se o u
ltimo
registro do arquivo ja foi lido. O comando feof(fid) faz esta verificacao no arquivo de
identificador fid. Se o u
ltimo registro ja foi lido, entao sera retornado o valor 1, caso
contrario 0 sera retornado. Usar o comando help iofun para se conhecer outras funcoes
para leitura e gravacao de dados.

54

3.2

Captulo 3. Linguagem de programacao

Estruturas condicionais

Uma estrutura condicional permite a escolha do grupo de comandos a serem executados


quando uma dada condicao for satisfeita ou nao, possibilitando dessa forma alterar o fluxo
natural de comandos. Esta condicao e representada por uma expressao logica.

3.2.1

Estrutura if-end

A estrutura condicional mais simples e

if <condi
c~
ao>
<comandos>
end

Se o resultado da expressao logica <condi


c~
ao> for 1 (verdadeiro), entao a lista de <comandos>
sera executada. Se o resultado for 0 (falso), entao os <comandos> nao serao executados.
Considere os comandos,
a = input(Entre com o valor de a: );
if a >= 0
b = sqrt(a)
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

3.2. Estruturas condicionais

55

Se o resultado da expressao logica <condi


c~
ao> for 1 (verdadeiro), entao a lista contendo
<comandos 1> sera executada. Se <condi
c~
ao> for 0 (falso), entao sera a lista <comandos 0>
a ser executada. A sequencia de comandos,
a = input(Entre com o valor de a: );
if a > 0
b = log(a)
else
b = exp(a)
end

quando executada fornecendo a = 5 produz


Entre com o valor de a: 5
b =
1.6094

Se a for positivo, entao o logaritmo natural de a sera atribudo a b e se a for negativo ou


nulo, entao b sera igual ao exponencial de a.

3.2.3

Estrutura if-elseif-end

Quando houver mais de duas alternativas, a estrutura if-else-end torna-se

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

A lista <comandos 1> sera executada se <condi


c~
ao 1> for igual a 1 (verdadeiro); ja a lista
<comandos 2> sera executada se <condi
c~
ao 2> for 1 e assim para as outras condicoes. Se
nenhuma das condicoes for 1, entao <comandos 0> sera executada. Quando a primeira
<condi
c~
ao> for satisfeita e os <comandos> executados, a estrutura if-elseif-end sera
abandonada, ou seja, o controle do processamanto sera transferido para o comando imediatamente apos o end.
Os comandos a seguir calculam o valor absoluto de um n
umero real ou complexo,

56

Captulo 3. Linguagem de programacao

a = input(Entre com o valor de a: );


if imag(a) ~= 0
b = sqrt(real(a).^2 + imag(a).^2);
elseif a < 0
b = -a;
else
b = a;
end
[a b]

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

A estrutura for-end permite que um grupo de comandos seja repetido um n


umero de vezes
definido. Sua sintaxe e

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

3.3. Estruturas de repeticao

57

executados para n = 5,
Valor de n: 5
n2 =
25
s =
25

mostram que a soma dos n primeiros n


umeros mpares e igual ao quadrado de n, pois para
n = 5 a variavel-de-controle i assume os valores 1 3 5 7 9. Foi usado o caractere (;)
para suprimir a exibicao de resultados intermediarios no calculo de s. Para mostrar que as
estruturas for-end podem estar encadeadas, considere a sequencia de comandos
n = input(Ordem do quadrado m
agico: );
A = magic(n);
Soma_Linhas = zeros(n,1); Soma_Colunas = zeros(1,n); Soma_Diagonal = 0;
for i = 1:n
Soma_Diagonal = Soma_Diagonal + A(i,i);
for j = 1:n
Soma_Linhas(i) = Soma_Linhas(i) + A(i,j);
Soma_Colunas(j) = Soma_Colunas(j) + A(i,j);
end
end
A, Soma_Linhas, Soma_Colunas, Soma_Diagonal

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

Captulo 3. Linguagem de programacao

Estrutura while-end

A estrutura while-end repete um grupo de comandos um n


umero de vezes indefinido. Sua
sintaxe e

while <condi
c~
ao>
<comandos>
end

Enquanto a expressao logica <condi


c~
ao> resultar em verdadeiro a lista <comandos> sera
repetida. Por exemplo, para determinar a precisao de um computador, os comandos
eps1 = 1; n = -1;
while 1 + eps1 > 1
epsilon = eps1; n = n + 1; eps1 = eps1 / 2;
end
n, epsilon, eps

quando executados fornecem


n =
52
epsilon =
2.2204e-16
ans =
2.2204e-16

epsilon e a chamada precisao da maquina , ou seja, o menor n


umero de ponto flutuante,
d
na forma 2 , que somado a 1 e maior que 1. Para computadores com aritmetica padrao
IEEE  = 252 que e igual `a variavel especial eps do MATLAB. Consequentemente,
>> 1 + epsilon - 1
ans =
2.2204e-16
>> 1 + epsilon / 2 - 1
ans =
0

Note que quando epsilon for somado a 1 resulta em um n


umero maior que 1. O mesmo
nao ocorre com epsilon / 2, porque qualquer valor igual ou menor do que ele somado a 1
sera simplesmente 1, ou seja, o computador ja nao consegue mais representar 1 + /2.

3.3. Estruturas de repeticao

3.3.3

59

Estrutura com interrupc


ao no interior

A estrutura while-end permite que um grupo de comandos seja repetido um n


umero indeterminado de vezes, no entanto, a condicao de interrupcao e testada no incio da estrutura.
Em varias situacoes em programacao se faz necessario interromper a execucao da repeticao
verificando a condicao no interior da estrutura e nao apenas no seu incio.
O comando break interrompe a execucao das estruturas de repeticao while-end e for-end
e transfere a execucao para o comando imediatamente seguinte ao end. Em repeticoes
aninhadas, o break interrompe a execucao apenas da estrutura mais interna. Uma repeticao
com condicao de interrupcao no interior pode ter a forma

while 1
<comandos 1>
if <condi
c~
ao>
break
end
<comandos 2>
end

A estrutura while-end e executada indefinidamente, a princpio, pois a condicao do while


e sempre verdadeiro. Contudo, quando a <condi
c~
ao> do if for satisfeita o comando break
sera executado causando a interrupcao da repeticao while-end. O conjunto de comandos
while 1
a = input(Entre com a, a > 0: );
if a <= 0
break
end
disp(rats(a))
end
disp(final da repeti
c~
ao)

lista continuamente a representacao racional


umero fornecido enquanto este for
de um n
positivo. Deste modo, para a = e a = 2,
Entre com a, a > 0: pi
355/113
Entre com a, a > 0: sqrt(2)
1393/985
Entre com a, a > 0: 0
final da repeti
c~
ao

60

3.4

Captulo 3. Linguagem de programacao

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

Um programa de arquivo M tem acesso `a todas as variaveis no espaco de trabalho e as


variaveis criadas por ele farao parte do espaco de trabalho. Alguns comandos sao particularmente u
teis para facilitar a interacao programa-usuario.
O comando <vari
avel> = input(<texto>) exibe <texto> e espera que um valor seja
atribudo a` <vari
avel> pelo teclado e error(<mensagem>) mostra <mensagem> e causa
a interrupcao da execucao do programa.
Considere o programa no arquivo decsomat.m para gerar uma matriz com elementos aleatorios entre 100 e 100 e decompo-la na soma de tres matrizes: uma triangular inferior, uma
diagonal e outra triangular superior,
% programa decsomat.m
%
n = input(Ordem da matriz: );
A = fix(200 * (rand(n) - 0.5 * ones(n)));
D = diag(diag(A));
L = tril(A) - D;
U = triu(A) - D;
A, L, D, U

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

A cadeia de caracteres <t


tulo> sera apresentada na parte superior da janela do menu e
as n opcoes <op
c~
ao i> serao colocadas a` disposicao do usuario para que ele escolha uma
delas. Se a k-esima opcao for escolhida, entao este valor de k sera atribudo a` <vari
avel>.
Por exemplo, o comando
>> m=menu(Escolha o m
etodo para calcular a raiz:,bisse
c~
ao,p
egaso,Newton-Raphson)

cria o menu mostrado na Figura 3.1, no canto superior esquerdo da tela. A escolha do

Figura 3.1: Comando menu.


metodo de Newton-Raphson (terceira opcao do menu) faz com que o valor 3 seja atribudo
a` variavel m,
m =
3

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

Captulo 3. Linguagem de programacao

x = -10:0.1:10;
for n = 1:5
plot(x, sin(x).*x.^n), grid on
pause
end

Os comandos pause off e pause on causam a desativacao e ativacao, respectivamente, de


interrupcoes pelo pause ou pause (n).

3.4.2

Comandos para execu


c
ao de express
oes

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 )

atribui os n argumentos a1 , a2 , . . . , an a` uma funcao e retorna o resultado nas m variaveis


v1 , v2 , . . . , vm . A funcao e especificada pela cadeia de caracteres <fun
c~
ao> que pode ser
uma expressao ou mesmo o nome de um arquivo contendo uma function onde a expressao
esta definida. Por isso, os dois comandos a seguir para calcular resto de divisao entre dois
n
umeros sao equivalentes,
>> x = rem(5,3)
x =
2
>> y = feval(rem,5,3)
y =
2

Por outro lado, o comando eval(<express~


ao>) interpreta a expressao definida pela cadeia
de caracteres <express~
ao>,
>> r = eval(sin(pi/2))
r =
1
>> x = 1; y = eval(2*x+exp(x-1))
y =
3

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

Captulo 3. Linguagem de programacao

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

Captulo 3. Linguagem de programacao

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

global <lista de vari


aveis>

faz com que as variaveis especificadas na <lista de vari


aveis>2 tornem-se globais e portanto esta declaracao deve aparecer no programa e nas functions de interesse. O uso de
variaveis globais torna mais difcil o entedimento e a modificacao das functions, alem de
tornar os modulos do programa menos independentes. Por estas razoes, a utilizacao de
variaveis globais deve ser evitada.
O comando return colocado dentro de uma function causa um retorno normal para o
comando seguinte a`quele que chamou a function. Ele e u
til quando da consistencia dos
parametros de entrada.

3.4.4

Depura
c
ao de programa

O comando keyboard interrompe a execucao de um programa e transfere o controle para


o teclado. Este modo especial, indicado pela letra K antes dos caracteres >>, permite listar
variaveis ou mesmo executar qualquer comando. O modo criado pelo keyboard termina com
a execucao do comando return.

3.4.5

Gerenciamento de arquivos

Diversos comandos para gerenciamento de arquivos sao disponveis, sendo alguns mostrados
na Tabela 3.5.
2

Os nomes das vari


aveis s
ao separados por espaco em branco e nao por vrgula.

3.5. Exerccios

67

Tabela 3.5: Comandos para gerenciamento de arquivos.


Comando

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>

lista os arquivos .m, .mat e .mex do diretorio corrente;


lista os arquivos do diretorio corrrente;
exibe o arquivo <nome do arquivo>.m;
remove o arquivo <nome do arquivo>;
muda o diretorio para <dir>;
mostra o diretorio corrente;
mostra em que diretorio esta <nome do arquivo>.m.

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

Captulo 3. Linguagem de programacao

3.7 Encontrar o valor de b da estrutura if-else-end da Secao 3.2.2, para a = 10.


3.8 Definir o valor de b da estrutura if-else-end da Secao 3.2.2, para a = 0.
3.9 Achar o valor de b da estrutura if-elseif-end da Secao 3.2.3, para a = -3.
3.10 Qual o valor de b da estrutura if-elseif-end da Secao 3.2.3, para a = 3+4i?
Se
c
ao 3.3 Estruturas de repetic
ao
3.11 Determinar o valor de s da estrutura for-end mostrada na Secao 3.3.1, para n = 7.
3.12 Calcular a soma das linhas, colunas e diagonal de um quadrado magico de ordem 3.
3.13 Explicar como e feita a determinacao da precisao de um computador.
3.14 Escrever os comandos para calcular a norma2 de um vetor x com n elementos e
comparar com a funcao norm.
3.15 Definir os comandos para calcular a norma1 de uma matriz A de ordem n e comparar
com a funcao norm.
Se
c
ao 3.4 Arquivos M
3.16 Escrever uma function para calcular o valor absoluto de um n
umero real ou complexo.
3.17 Dadas as matrizes triangulares U = {uij } e L = {lij } e os vetores b e c, escrever uma
function para calcular x tal que U x = b e outra para calcular y tal que Ly = c:



u11 u12 u13 u1n
b1
l11
x1
y1
c1

u22 u23 u2n x2 b2 l21 l22

y2 c2


y3 c3
u33 u3n

x3 = b3 e l31 l32 l33


= .

.. ..
..
..
..
..
..
..

. .
. . . .
.
.
unn

xn

bn

ln1 ln2 ln3 lnn

3.18 Criar o arquivo almaxmin.m


n = input(Ordem da matriz: );
A = rand(n);
maior = max(max(A)), menor = min(min(A))

3.19 Executar o programa acima para n = 5, 10 e 30.


3.20 Gerenciar o diretorio usando
what, dir, which almaxmin, type almaxmin, delete almaxmin.m, what

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

apenas nos topicos de Algebra


linear, Interpolacao, Ajuste de curvas, Integracao numerica
e Calculo de zero e mnimo de funcao.

4.1

Algebra
linear

O nome MATLAB e um acronismo de MATrix LABoratory (laboratorio de matriz), e certa


mente e na area de Algebra
linear que o MATLAB apresenta suas maiores potencialidades.
Para um conhecimento mais amplo dos comandos a respeito de vetores e matrizes usar o
comando help matfun.

4.1.1

Decomposi
c
oes

A funcao lu(X) faz a decomposicao LU da matrix X usando a estrategia da pivotacao parcial.


O uso do comando [L,U,P] = lu(X) gera uma matriz triangular inferior unitaria L, uma
matriz triangular superior U e uma matriz de permutacoes P, tal que P*X = L*U. Contudo,
o uso de [E,D] = lu(X) produz D = U e P*E = L de modo que X = E*D. Por exemplo,
>> M = [2 -3 5; 4 1 -1; 1 8 6]
M =
2
-3
5
4
1
-1
1
8
6
>> [L, U, P] = lu(M)
L =
1.0000
0
0
0.2500
1.0000
0

69

70

Captulo 4. Funcoes para Calculo Numerico

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

A funcao svd(X) faz a decomposicao em valores singulares da matriz X de dimensao m n.


O comando [U,S,V] = svd(X) produz uma matriz ortonormal U de ordem m, uma matriz
diagonal S de dimensao m n contendo os valores singulares de X em ordem nao crescente
e uma matriz ortonormal V de ordem n, de modo que X = U*S*V.
O uso de [U,S,V] = svd(X,0) produz uma decomposicao mais economica. Para m > n
ter-se-a apenas as n primeiras colunas de U e S sera quadrada de ordem n. Caso m n,
entao svd(X,0) e equivalente a` svd(X). O comando [U,S,V] = svd(X,econ) tambem
produz uma decomposicao economica. Se m n, entao o comando e equivalente a` svd(X,0).
Porem, se m < n, entao somente as m primeiras colunas de V serao computadas e S sera
quadrada de ordem m. Para se obter apenas os valores singulares de X em um vetor s basta
usar s = svd(X). Por exemplo,
>> A = [2 -4; 3 5; 1 -7; 8 6];
>> [U, S, V] = svd(A)
U =
-0.1884
-0.5472
-0.7023
0.4673
0.0110
-0.5450
-0.4351
-0.6517
0.3050
0.7462
-0.5251
0.3418
S =
12.4766
0
0
6.9523
0
0
0
0
V =

0.4146
-0.6961
-0.5412
0.2250

72

Captulo 4. Funcoes para Calculo Numerico

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

A funcao qr(X) faz a decomposicao QR da matriz X de dimensao m n. O uso de [Q,R] =


qr(X) produz uma matriz ortonormal Q de ordem m (Q*Q = eye(size(Q))) e uma matriz
triangular superior R com a mesma dimensao m n de X, de modo que X = QR. Ja [Q,R,P]
= qr(X) produz uma matriz ortogonal Q, uma matriz triangular superior R com elementos
da diagonal decrescentes e uma matriz de permutacoes P de ordem n, tal que X*P = Q*R,
>> A = [2 -4; 3 5; 1 -7; 8 6]
A =
2
-4
3
5
1
-7
8
6
>> [Q, R] = qr(A)
Q =
0.2265
-0.5326
-0.7023
0.4146
0.3397
0.3211
-0.5450
-0.6961
0.1132
-0.7754
0.3050
-0.5412
0.9058
0.1096
0.3418
0.2250
R =
8.8318
5.4349
0
9.8215
0
0
0
0
>> round(Q*Q)
% Q
e ortonormal
ans =
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
>> round(A-Q*R)
% A = Q*R
ans =
0
0
0
0
0
0
0
0
>> [Q, R, P] = qr(A)
Q =
-0.3563
0.4560
-0.6276
0.5208
0.4454
0.1417
0.4709
0.7481
-0.6236
0.4745
0.6125
-0.1041
0.5345
0.7395
-0.0963
-0.3977
R =
11.2250
4.2762

74

Captulo 4. Funcoes para Calculo Numerico

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

A funcao inv(X) calcula a inversa de X, tal que X*inv(X) = eye(size(X)),


>> A = [-2 11 3 -4; 3
A =
-2
11
3
3
7
3
9
10
5
-2
-2
-1
>> E = inv(A)
E =
1.0000
-5.0000
2.0000
-9.0000
-5.0000
23.0000
1.0000
-5.0000
>> round(A*E)
ans =
1
0
0
0
1
0
0
0
1
0
0
0

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)

% transposto do vetor res


duo

r =
0

No caso da matriz dos coeficientes ser nao simetrica, o uso e o mesmo,


>> A = [1 -3 2; -2 8 -1; 4 -6 5];
>> b = [11 -15 29];
>> x = A \ b
% vetor solu
c~
ao
x =
2.0000
-1.0000
3.0000
>> r = (b - A * x)
% transposto do vetor res
duo
r =
0
0
0

4.1.4

Autovalores e autovetores

Os autovalores sao os zeros do polinomio caracterstico da matriz. A funcao poly constroi


o polinomio caracterstico de uma matriz e roots calcula os seus zeros. Sejam,
A = [4 -1 3; -1 5 2; 3 2 8]
A =
4
-1
3
-1
5
2
3
2
8
p = poly(A)
% polin^
omio caracter
stico da matriz A
p =
1.0000 -17.0000
78.0000 -79.0000
e = roots(p)
% zeros do polin^
omio com coeficientes em p
e =
9.9734
5.6162
1.4104

A funcao eig(A) efetua o calculo do autosistema de A (autovalores e autovetores) por um


metodo mais eficiente do que construindo o polinomio caracterstico. O uso de [V,D] =
eig(A) produz uma matriz diagonal D contendo os autovalores e uma matriz V com os
correspondentes autovetores. Para obter apenas os autovalores em um vetor d basta usar d
= eig(A). Se a matriz for simetrica, entao os autovetores sao mutuamente ortogonais (V*V
= eye(size(A))). Para a matriz simetrica A definida acima,

76

Captulo 4. Funcoes para Calculo Numerico

[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

A funcao cond(X,p) calcula o n


umero de condicao da matriz X definido em termos da
normap, ou seja,
cond(X,p) = p (X) = kXkp kX 1 kp .
Se o parametro p for omitido, entao sera assumido o n
umero de condicao em norma2. Para
a matrix B abaixo,

>> 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

A funcao rcond(X) fornece uma estimativa do recproco do n


umero de condicao de X definido em termos da norma1. Se X for uma matriz bemcondicionada, entao rcond(X) sera
proximo de 1 e se X for malcondicionada rcond(X) sera proximo de 0. Para a matriz B
acima,
>> r = rcond(B)
r =
0.2094
>> 1 / r
ans =
4.7744

% rec
proco do n
umero de condi
c~
ao em norma-1

A funcao det(X) calcula o determinante da matriz X. Para A e B definidas previamente,


>> det(A)
ans =

78

Captulo 4. Funcoes para Calculo Numerico

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

Alem disso, diff(x,n) determina as diferencas finitas de ordem n


>> d2 = diff(x,2)
d2 =
1
-2
3

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

onde a cadeia de caracteres <m


etodo> especifica o metodo a ser utilizado na interpolacao,
sendo

4.2. Interpolacao e ajuste de curvas

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

% abscissas dos pontos

Interpolando os valores z = 0,6 e z = 0,7 usando os quatro metodos


interp1(x,
ans =
0.2500
interp1(x,
ans =
0.1310
interp1(x,
ans =
0.1440
interp1(x,
ans =
0.0625

y, [-0.6 0.7], linear)


0.4375
y, [-0.6 0.7], cubic)
0.2774
y, [-0.6 0.7], spline)
0.2695
y, [-0.6 0.7], nearest)
0.0625

Considerando que o valores exatos sao (0,6)4 = 0,1296 e 0, 74 = 0,2401, os metodos de


interpolacao com cubic e splines produziram, respectivamente, os melhores resultados
para este caso. As aproximacoes da funcao y = x4 por tres funcoes interpoladoras de interp1
podem ser visualizadas pelos comandos do arquivo interp.m
%
interp.m
%
x = linspace(-1, 1, 5);
% abscissas
y = x.^4;
% ordenadas
x1 = linspace(-1, 1, 50);
% abscissas para a interpola
c~
ao
y1 = x1.^4;
% ordenadas da curva real
lin = interp1(x, y, x1, linear);
% interpola
c~
ao linear
cub = interp1(x, y, x1, cubic);
% interpola
c~
ao c
ubica
spl = interp1(x, y, x1, spline);
% interpola
c~
ao por splines
plot(x1, y1, k-, x, y, ko, x1, lin, k:, x1, cub, k-., x1, spl, k--);
grid on, axis([-1 1 -0.1 1.1])
xlabel(x); ylabel(y); title(Resultados de interp1)
legend(y=x^4,pontos dados,linear,cubic,splines,Location,North)
print -deps interp1
% grava arquivo interp1.eps

80

Captulo 4. Funcoes para Calculo Numerico

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

Figura 4.1: Aproximacao de y = x4 pela funcao interp1.

4.2.3

Ajuste polinomial

O comando c = polyfit(x,y,n) atribui ao vetor c os valores dos coeficientes do polinomio


de quadrados mnimos de grau n que melhor se ajusta aos pontos (xi , yi ) definidos nos vetores
x e y. O polinomio e na forma
Pn (x) = c1 xn + c2 xn1 + c3 xn2 + . . . + cn x + cn+1 .
Para exemplificar o uso de polyfit, sejam os dados relacionando a temperatura em graus
Celsius e Fahrenheit obtidos a partir de um termometro com pouca exatidao,
>> c = [15 17 18 20 23 25 26 28 30 32];
>> f = [40 41 42 43 45 46 46 48 49 50];

Para se obter a reta de quadrados mnimos f = P1 (c) = b1 c + b2 ,


>> b = polyfit(c, f, 1)
b =
0.5925
31.1345

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

4.2. Interpolacao e ajuste de curvas

81

>> p = polyval(b, c);

os quais podem ser mostrados juntamente com os resduos do ajuste ri = fi P (ci )


[c; f; p; f-p]
ans =
15.0000
40.0000
17.0000
41.0000
18.0000
42.0000
20.0000
43.0000
23.0000
45.0000
25.0000
46.0000
26.0000
46.0000
28.0000
48.0000
30.0000
49.0000
32.0000
50.0000

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
>>
>>
>>
>>
>>

plot(c, f, ko, c, p, k-); grid on


axis([14 33 38 52])
xlabel(Graus Celsius); ylabel(Graus Fahrenheit);
title(Ajuste polinomial de grau 1)
print -deps polyfit

gerando o grafico da Figura 4.2. Os parametros de uma regressao linear m


ultipla podem ser
calculados por meio das decomposicoes svd ou qr descritas na Secao 4.1.1 Decomposicoes.
Ajuste polinomial de grau 1
52

50

Graus Fahrenheit

48

46

44

42

40

38
14

16

18

20

22
24
Graus Celsius

26

28

30

32

Figura 4.2: Regressao polinomial usando a funcao polyfit.

82

Captulo 4. Funcoes para Calculo Numerico

4.3

Integrac
ao num
erica

O MATLAB disponibiliza varios metodos para calcular, numericamente, a integral de uma


funcao de uma variavel. Serao abordados dois desses esquemas: formula de Simpson e
quadratura de Gauss-Kronrod.

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

onde a cadeia de caracteres <fun


c~
ao> define a funcao integrando, a e b sao os limites
inferior e superior de integracao, respectivamente, <toler^
ancia> especifica a tolerancia para
o calculo (se nao especificada, entao e assumido o valor 106 ) e <mostra> e um parametro
que se tiver um valor nao nulo faz com que sejam mostrados resultados intermediarios da
integracao. Tanto <toler^
ancia> quanto <mostra> sao parametros opcionais. Na definicao
da <fun
c~
ao> deve-se usar os operadores aritmeticos vetoriais .*, ./ e .^ de modo que ela
possa ser avaliada com um vetor como argumento. Ela tambem pode ser definida de varios
modos. Por exemplo, seja a funcao f (x) = cos(3x + 1)x2 + x1,5 , cujo esboco e mostrado na
Figura 4.3(a).
f(x) = cos(3*x+1) * x2 + x1,5

f(x) = 3 * x2 * sen(x) * exp(x)

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

a) f (x) = cos(3x + 1)x2 + x1,5

8
x

10

12

b) f (x) = 3x2 sen(x)ex

Figura 4.3: Funcoes para integracao numerica.

14

16

4.3. Integracao numerica

Para calcular
Z 9

83

cos(3x + 1)x2 + x1,5 dx

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

[<integral>, <lim>] = quadgk(@<fun


c~
ao>, a, b, <par 1>, <val 1>, <par 2>, <val 2>,...)

onde <integral> e o resultado da quadratura, <lim> e uma aproximacao do limite superior


do erro absoluto, @<fun
c~
ao> e uma cadeia de caracteres que define o nome de uma function
na qual a funcao integrando esta definida (precedida pelo caractere @), a e b sao os limites
inferior e superior de integracao, respectivamente, <par i> e uma cadeia de caracteres que
especifica o i-esimo parametro e <val i> o seu respectivo valor.
Os parametros <par i> e os seus valores <val i> sao opcionais. Dentre os parametros
disponveis tem-se AbsTol, a tolerancia do erro absoluto e RelTol, a tolerancia do erro

84

Captulo 4. Funcoes para Calculo Numerico

relativo. Como na funcao quad na definicao da <fun


c~
ao> deve-se usar os operadores vetoriais
.*, ./ e .^ de modo que ela possa ser avaliada com um vetor. Por exemplo, seja a funcao
f (x) = 3x2 sen(x)ex , com seu esboco mostrado na Figura 4.3(b). Para calcular
Z
3
3x2 sen(x)ex dx =
2
0
via quadgk, inicialmente, define-se a funcao integrando em um arquivo, por exemplo, g.m
function y = g(x)
y = 3 * x.^2 .* sin(x) .* exp(-x);
end
% g

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

4.4. Calculo de zero e mnimo de funcao

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

resultando c(x) = 7x3 + x2 x 3; e para subtrair,


>> d = a - b
d =
3
-9

Se os polinomios tiverem graus diferentes, entao o vetor correspondente ao de menor grau


deve ser preenchido com zeros `a esquerda de modo que ambos vetores tenham o mesmo
tamanho. Para somar e(x) = 2x3 + 4x2 + 5x 1 e f (x) = 3x + 2,
>> e = [2 4 5 -1]; f = [0 0 -3 2];
>> g = e + f
g =
2
4
2
1

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

Captulo 4. Funcoes para Calculo Numerico

>> d = [2 -3 4 -5 6]; e = [1 -3 1];


>> [q, r] = deconv(d, e)
q =
2
3
11
r =
0
0
0
25
-5

resultado no quociente q(x) = 2x2 + 3x + 11 com resto r(x) = 25x 5.


Derivac
ao
A funcao polyder efetua a derivacao polinomial. Deste modo, para obter a primeira e
segunda derivada de P (x) = x4 + 2x3 12x2 + 14x 5,
>> p = [1 2 -12 14 -5];
>> p1 = polyder(p)
p1 =
4
6
-24
>> p2 = polyder(p1)
p2 =
12
12
-24

14

resultando P 0 (x) = 4x3 + 6x2 24x + 14 e P 00 (x) = 12x2 + 12x 24.


Construc
ao a partir das razes
Dadas as razes de uma equacao polinomial em um vetor r, o comando poly(r) constroi o
polinomio associado. Por exemplo, se 1 = 1, 2 = 3 e 3 = 4, entao
>> r = [-1 3 4];
>> p = poly(r)
p =
1
-6
5

12

produz o polinomio P (x) = x3 6x2 + 5x + 12.

4.4.2

C
alculo de razes

O MATLAB disponibiliza duas poderosas funcoes para o calculo de raiz de equacao. A


funcao roots obtem todas as razes de uma equacao algebrica e a funcao fzero determina
uma raiz de uma equacao algebrica ou transcendente.
Func
ao roots
Se o vetor c contiver os coeficientes do polinomio P (x) = c1 xn + c2 xn1 + . . . + cn x + cn+1 ,
entao a funcao roots(c) fornecera um vetor coluna contendo as n razes de P (x) = 0. Para
calcular as 4 razes de P (x) = x4 + 2x3 13x2 14x 24 = 0,

4.4. Calculo de zero e mnimo de funcao

87

>> c = [1 2 -13 -14 24];


>> r = roots(c)
r =
-4.0000
3.0000
-2.0000
1.0000

Pode ser mostrado que as razes de

c2 /c1 c3 /c1

1
0

0
1
C=

..
..

.
.
0
0

P (x) = 0 sao os autovalores da matriz companheira

. . . cn /c1 cn+1 /c1

...
0
0

...
0
0
.

..
..

...
.
.
...
1
0

Deste modo, r = roots(c) e equivalente a`


>> n = length(c) - 1;
>> C = diag(ones(n-1,1), -1);
>> C(1,:) = -c(2:n+1) / c(1)
C =
-2
13
14
-24
1
0
0
0
0
1
0
0
0
0
1
0
>> r = eig(C)
r =
-4.0000
3.0000
-2.0000
1.0000

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

Captulo 4. Funcoes para Calculo Numerico

function y = h(x)
y = 3 * x^2 * sin(x) * exp(-x);
end
% h

Executando, para o valor inicial x0 = 3 e intervalo inicial x0 = [2 4],


>> Raiz = fzero(@h, 3);
% Valor inicial = 3
>> fprintf(Raiz = %15.10f\n, Raiz)
Raiz =
3.1415926536
>>
>> Raiz = fzero(@h, [2 4]); % Intervalo inicial = [2 4]
>> fprintf(Raiz = %15.10f\n, Raiz)
Raiz =
3.1415926536

Para alterar a tolerancia no calculo da raiz e exibir as iteracoes,


>> Raiz = fzero(@h, [2 4], optimset(TolX, 1e-10, Display, iter));
Func-count
2
3
4
5
6
7
8
9

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

Zero found in the interval [2, 4]


>> fprintf(Raiz = %15.10f\n, Raiz)
Raiz =
3.1415926537

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

4.5. Medidas de tempo

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

Captulo 4. Funcoes para Calculo Numerico

Os resultados produzidos foram


>> medidas
tempo m
edio sem aloca
c~
ao =
tempo m
edio com aloca
c~
ao =

21.480 s
0.007 s

Esse tempo e dependente da arquitetura do microprocessador e da quantidade de processos


em execucao na maquina naquele instante. Por isso, quando se usar o tic-toc e mais
prudente repetir o calculo algumas vezes e tomar o tempo medio para fazer a comparacao.
Este exemplo mostra a reducao dramatica no tempo gasto pelo MATLAB quando se faz
uma prealocacao de espaco de um vetor (ou matriz) antes de utiliza-lo.

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

A interpolacao polinomial consiste em aproximar uma funcao por um polinomio interpolador,


conhecida sua forma analtica ou apenas alguns valores tabelados. Serao apresentados os
polinomios de Newton.

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

Implementando o algoritmo da Figura 5.1 em MATLAB obtem-se,


function r = polinomio_newton(x, y, z, Exibe)
%
polinomio_newton
interpola
c~
ao via polin^
omios de Newton.
%

91

92

Captulo 5. Implementacao de algoritmos

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

Figura 5.1: Interpolacao por polinomio de Newton com diferencas divididas.


%
Introdu
c~
ao ao MATLAB
%
%
Par^
ametros de entrada:
%
x: vetor das abscissas,
%
y: vetor das ordenadas,
%
z: valor a ser interpolado e
%
Exibe: op
c~
ao para exibir resultados: 0 n~
ao exibe e 1 exibe.
%
%
Par^
ametro de sa
da:
%
r: resultado da interpola
c~
ao.
%
m = length(x); Dely = y;
%
constru
c~
ao das diferen
cas divididas
for k = 1:m-1
for i = m:-1:k+1
Dely(i) = (Dely(i) - Dely(i-1)) / (x(i) - x(i-k));
end
end
%
avalia
c~
ao do polin^
omio pelo processo de Horner
r = Dely(m);
for i = m-1:-1:1
r = r * (z - x(i)) + Dely(i);
end
if Exibe
fprintf(Interpola
c~
ao via polin^
omio de Newton de grau %i\n, m - 1)
fprintf(z =%5.2f
r =%7.4f\n, z, r)
end
end % polinomio_newton

5.2. Sistemas lineares

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

O programa contido no arquivo interpola.m


%
programa interpola
%
Introdu
c~
ao ao MATLAB
%
uso da fun
c~
ao polinomio_newton
%
fid = fopen(interpola.dat,r);
% abrir o arquivo interpola.dat para leitura
np = fscanf(fid, %i, 1);
% ler o n
umero de pontos
x = fscanf(fid, %f, np);
% ler o vetor de abscissas
y = fscanf(fid, %f, np);
% ler o vetor de ordenadas
fclose(fid);
% fechar o arquivo interpola.dat
disp(Pares ordenados lidos)
% exibe t
tulo
disp([x; y])
% mostrar os pontos lidos do arquivo
% interpolar z = 0,12 usando os pontos 1 e 2 e exibir resultados
r = polinomio_newton(x(1:2), y(1:2), 0.12, 1);
% interpolar z = 0,35 usando os pontos 2, 3 e 4 e exibir resultados
r = polinomio_newton(x(2:4), y(2:4), 0.35, 1);
% fim do programa interpola

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

A solucao de sistema de equacoes lineares e uma etapa fundamental na resolucao de varios


problemas de Ciencias e Engenharia. Sera vista a decomposicao LU com a estrategia da
pivotacao parcial, bem como a solucao de sistemas triangulares.

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

Captulo 5. Implementacao de algoritmos

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

Figura 5.2: Decomposicao LU por eliminacao de Gauss com pivotacao parcial.


(abs: valor absoluto.)

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 .

5.2. Sistemas lineares

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

Figura 5.3: Solucao do sistema triangular inferior Ly = P b, de LU com pivotacao parcial.


A Figura 5.4 exibe um algoritmo para resolver um sistema triangular superior pelas substituicoes retroativas. Os parametros de entrada sao a ordem n do sistema, a matriz triangular
superior U e o vetor de termos independentes d. O parametro de sada e o vetor solucao x.

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

Figura 5.4: Solucao de sistema triangular superior pelas substituicoes retroativas.

5.2.3

Implementa
c
ao e uso

As implementacoes dos tres algoritmos em MATLAB resultam em

96

Captulo 5. Implementacao de algoritmos

function [A, Det, Pivot] = decomposicao_lu(A, Exibe)


%
decomposicao_lu
fazer a decomposi
c~
ao PA = LU usando pivota
c~
ao parcial.
%
%
Introdu
c~
ao ao MATLAB
%
%
Par^
ametros de entrada:
%
A: matriz dos coeficientes e
%
Exibe: op
c~
ao para exibir resultados: 0 n~
ao exibe e 1 exibe.
%
%
Par^
ametros de sa
da:
%
A: L + U - eye(n,n),
%
Det: determinante de A e
%
Pivot: linhas pivotais.
%
n = length(A); Pivot = 1:n; Det = 1;
for j = 1:n-1
% escolha do elemento piv^
o
[Amax, p] = max(abs(A(j:n,j))); p = p + j - 1;
if p ~= j
% troca de linhas
linhas = 1:n;
t = A(j,linhas); A(j,linhas) = A(p,linhas); A(p,linhas) = t;
m = Pivot(j); Pivot(j) = Pivot(p); Pivot(p) = m; Det = -Det;
end
Det = Det * A(j,j);
if abs(A(j,j)) ~= 0
% elimina
c~
ao de Gauss
r = 1 / A(j,j);
for i = j+1:n
Mult = A(i,j) * r; A(i,j) = Mult;
colunas = j+1:n;
A(i,colunas) = A(i,colunas) - Mult * A(j,colunas);
end
end
end
Det = Det * A(n,n);
if Exibe
fprintf(Decomposi
c~
ao LU com pivota
ca
~o parcial\n)
fprintf(Matrizes L %s U:\n, \)
for i = 1:n
for j = 1:n, fprintf(%10.5f, A(i,j)), end, fprintf(\n)
end
fprintf(Determinante = %10.5f\n, Det), fprintf(Linhas pivotais:)
for i = 1:n, fprintf( %i, Pivot(i)), end, fprintf(\n)
end
end % decomposicao_lu
function y = substituicoes_sucessivas_pivotal(L, b, pivot, Exibe)
%
substituicoes_sucessivas_pivotal
resolver sistema triangular inferior.
%
%
Introdu
c~
ao ao MATLAB
%
%
Par^
ametros de entrada:

5.2. Sistemas lineares

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

Exemplo 5.2 Seja o arquivo matrizvetor.dat, contendo o n


umero de linhas e colunas da
matriz dos coeficientes, os elementos da matriz e o vetor de termos independentes,
4
4
1

4
-1
-2

0
1

-1
0

98
0
5
1

Captulo 5. Implementacao de algoritmos

4
0
-2

-4
5
-3

1
-1
4

O programa do arquivo sistema.m


%
programa sistema
%
Introdu
c~
ao ao MATLAB
%
uso das fun
c~
oes decomposicao_lu, substituicoes_sucessivas_pivotal e
%
substituicoes_retroativas
%
clear A b
% remover as vari
aveis A e b do espa
co de trabalho
fid = fopen(matrizvetor.dat,r);
% abrir o arquivo matrizvetor.dat para leitura
lincol = fscanf(fid, %i, 2) ;
% ler o n
umero de linhas e colunas da matriz
nlin = lincol(1); ncol = lincol(2);
for i = 1:nlin
A(i,:) = fscanf(fid, %f, ncol);
% ler a i-
esima linha da matriz dos coeficientes
end
b = fscanf(fid, %f, nlin);
% ler o vetor dos termos independentes
fclose(fid);
% fechar o arquivo matrizvetor.dat
disp(matriz e vetor lidos)
% exibir t
tulo
A, b
% mostrar a matriz e o vetor lidos do arquivo
% fazer a decomposi
c~
ao PA = LU e exibir resultados
[LU, determ, pivot] = decomposicao_lu(A, 1);
% resolver o sistema triangular inferior Ly = Pb e exibir resultados
y = substituicoes_sucessivas_pivotal(LU, b, pivot, 1);
% resolver o sistema triangular superior Ux = y e exibir resultados
x = substituicoes_retroativas(LU, y, 1);
% fim do programa sistema

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

5.3. Integracao numerica

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

Abscissas e pesos para a quadratura de Gauss-Legendre

As abscissas e os pesos da quadratura de Gauss-Legendre sao calculados pelo algoritmo


GaussLegendreAbsPes da Figura 5.5, sendo baseado no m
etodo de Newton-Raphson.
O parametro de entrada e o n
umero de pontos n 1 e os parametros de sada sao o vetor
T com as abscissas (T (1 ) contem o menor zero do polinomio e T (n) o maior zero), o vetor
W com os pesos e a informacao Info sobre a convergencia do metodo de Newton-Raphson,
de modo que, Info = 0 : todos os zeros convergiram e Info = k: n
umero de zeros que nao
convergiram.

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

Uma implementacao em MATLAB para o algoritmo de calculo das abscissas e pesos,

100

Captulo 5. Implementacao de algoritmos

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

Figura 5.5: Abscissas e pesos para a quadratura de Gauss-Legendre.


(abs: valor absoluto, cos: co-seno e trunca: arredonda em direcao a 0.)
function [T, W, Info] = gauss_legendre_abspes(n, Exibe)
%
gauss_legendre_abspes
calcular abscissas e pesos para quadratura de Gauss-Legendre.
%
%
Introdu
c~
ao ao MATLAB
%
%
Par^
ametros de entrada:
%
n: n
umero de pontos (n >= 1) e
%
Exibe: op
c~
ao para exibir resultados: 0 n~
ao exibe e 1 exibe.
%
%
Par^
ametros de sa
da:
%
T: abscissas, sendo
%
T(1): menor zero do polin^
omio e T(n): maior zero do polin^
omio,
%
W: pesos e

5.3. Integracao numerica

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

Figura 5.6: Integracao numerica via Gauss-Legendre.


%
Info: informa
c~
ao sobre converg^
encia do m
etodo de Newton-Raphson
%
Info = 0: todos os zeros convergiram e
%
Info = k: n
umero de vezes que os zeros n~
ao convergiram.
%
T = zeros(n,1); W = T; Info = 0; Toler = 1e-15; IterMax = 30;
m = fix((n + 1) / 2); fracn = 1 - (1 - 1 / n) / (8 * n^2); pin = pi / (n + 0.5);
% os zeros s~
ao sim
etricos, calcula-se apenas os n~
ao negativos
for i = 1:m
z = fracn * cos((i - 0.25) * pin);
% valor inicial
% c
alculo do i-
esimo zero do polin^
omio de Legendre pelo m
etodo de Newton-Raphson
Iter = 0;
while 1
%
avalia
c~
ao do polin^
omio de Legendre e sua derivada no ponto z
Iter = Iter + 1; pz = 1; p1 = 0;
for j = 0:n-1
p0 = p1; p1 = pz; pz = ((2 * j + 1) * z * p1 - j * p0) / (j + 1);
end
dpz = (n * (p1 - z * pz)) / (1 - z^2); z1 = z; z = z1 - pz / dpz;
if abs(z - z1) <= Toler || Iter == IterMax
break
end
end
% verifica
c~
ao da converg^
encia do i-
esimo zero
if abs(z - z1) <= Toler
T(i) = -z; T(n+1-i) = z; % Abscissas
W(i) = 2 / ((1 - z^2) * dpz^2); W(n+1-i) = W(i); % Pesos

101

102

Captulo 5. Implementacao de algoritmos

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

O algoritmo da quadratura de Gauss-Legendre implementado em MATLAB,


function [Integral, Info] = gauss_legendre(funcao, a, b, n, Exibe)
%
gauss_legendre
integrar uma fun
c~
ao via quadratura de Gauss-Legendre.
%
%
Introdu
c~
ao ao MATLAB
%
%
Par^
ametros de entrada:
%
funcao: cadeia de caracteres que especifica a fun
c~
ao,
%
a: limite inferior de integra
c~
ao,
%
b: limite superior de integra
c~
ao,
%
n: n
umero de pontos (n >= 1) e
%
Exibe: op
c~
ao para exibir resultados: 0 n~
ao exibe e 1 exibe.
%
%
Par^
ametros de sa
da:
%
Integral: valor da integral e
%
Info
: informa
c~
ao sobre consist^
encia e converg^
encia
%
Info = 0: houve consist^
encia e converg^
encia,
%
Info = -1: n < 1 e
%
Info = k: n
umero de vezes que os zeros n~
ao convergiram.
%
Integral = 0; Info = 0;
%
consist^
encia do n
umero de pontos
if n < 1, Info = -1; error(Erro em gauss_legendre: n
umero de pontos < 1); end
%
c
alculo das abscissas e pesos
[T, W, Info] = gauss_legendre_abspes(n, 0); % n~
ao exibe os resultados

5.4. Razes de equacoes

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

x sen(x) dx pela quadratura de Gauss-Legendre com cinco pontos.


0

>> [Integral, Info] = gauss_legendre(x*sin(x), 0, 3, 5, 1);


Integra
c~
ao num
erica via Gauss-Legendre
i
t(i)
x(i)
f(x(i))
W(i)
1
-0.90618
0.14073
0.01974
0.23693
2
-0.53847
0.69230
0.44190
0.47863
3
0.00000
1.50000
1.49624
0.56889
4
0.53847
2.30770
1.70897
0.47863
5
0.90618
2.85927
0.79656
0.23693
Integral =
Info
=

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

O algoritmo NewtonRaphson, mostrado na Figura 5.7, calcula a raiz de uma equacao


f (x) = 0 com tolerancia . Os parametros de entrada sao o valor inicial x0 , a tolerancia
Toler para o calculo da raiz e o n
umero maximo de iteracoes IterMax. A funcao f (x) e sua
0
derivada f (x) devem ser especificadas por meio de cadeias de caracteres. Os parametros de
sada sao a raiz de f (x) = 0, Raiz, o n
umero gasto de iteracoes Iter e a informacao Info, em
que Info = 0 mostra que a raiz foi calculada e Info = 1 indica que a raiz nao foi encontrada
com a tolerancia e o n
umero maximo de iteracoes fornecidos.

104

Captulo 5. Implementacao de algoritmos

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

Figura 5.7: Algoritmo do metodo de Newton-Raphson.


(abs: valor absoluto.)

5.4.2

Implementa
c
ao e uso

Implementando o algoritmo em MATLAB,


function [Raiz, Iter, Info] = newton_raphson(funcao, derivada, x0, Toler, IterMax, Exibe)
%
newton_raphson
calcular raiz de equa
c~
ao pelo m
etodo de Newton-Raphson.
%
%
Introdu
c~
ao ao MATLAB
%
%
Par^
ametros de entrada:
%
funcao: cadeia de caracteres que especifica a fun
c~
ao,
%
derivada: cadeia de caracteres que especifica a derivada,
%
x0: valor inicial,
%
Toler: toler^
ancia no c
alculo da raiz,
%
IterMax: n
umero m
aximo de itera
co
~es e
%
Exibe: op
c~
ao para exibir resultados: 0 n~
ao exibe e 1 exibe.
%
%
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.

5.4. Razes de equacoes

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