Guia MatLab por Jan Krueger Siqueira

Guia MatLab por Jan Krueger Siqueira

(Parte 1 de 4)

Guia MatLab para alunos de Engenharia Elétrica, Computação e Automação por Jan Krueger Siqueira

Editora Wally Salami

Este guia foi desenvolvido para aplicações em MatLab 7.0, embora vários dos recursos também estejam disponíveis em versões anteriores.

Por outro lado, pode haver funções que não funcionem na versão 7.0, pois isso dependerá talvez de quais bibliotecas foram selecionadas durante a instalação.

Índice

1.1 – Uso do MatLab05
1.2 – MatLab x Maple05

Capítulo 1 – Prólogo

2.1 – Declarações e Operações Básicas08
2.2 – Comandos de Ajuda1
2.3 – Comandos para a Tela de Comandos12

Capítulo 2 – Comandos Básicos

3.1 – Notação e Declaração de Vetores no MatLab14
3.2 – Operações e Funções com Vetores16
3.3 – Matrizes: o Foco do MatLab18
3.4 – Matrizes Multidimensionais21

Capítulo 3 – Vetores e Matrizes

4.1 – Aritmética e Álgebra Básicas2
4.2 – Trigonométricas2
4.3 – Equações e Polinômios23
4.4 – Álgebra Linear23
4.5 – Cálculo Diferencial e Integral24
4.6 – Sinais e Sistemas28
4.7 – Outras Funções31

Capítulo 4 – Funções Matemáticas

5.1 – A Famalía de Funções para Plotar3
5.2 – Alguns Detalhes: Título, Legendas, Etc37
5.3 – Plotando em 3D38
5.4 – Manipulando a Janela do Gráfico39
5.5 – Acessando Dados do Gráfico40

Capítulo 5 – Plotando Gráficos

6.1 – Vantagens do Editor41
6.2 – Criando Funções e Ronas41 ti
6.3 – Condicionais e Loops: “if”, “switch”, “while” e “for”43
6.4 – Recursão e Variáveis Globais45
6.5 – Debugando47

Capítulo 6 – O Editor de Funções e Rotinas

7.1 – Strings48
7.2 – Capturando e Imprimindo na Tela de Comandos48
7.3 – Arquivos de Texto, Som e Imagem49
7.4 – Execução do MatLab e de Outros Aplicativos50

Capítulo 7 – Funções de Entrada e Saída (I/O)

8.1 – Por que Isso Vale a Pena?52
8.2 – Como NÃO Fazer52
8.3 – Como Fazer53

Capítulo 8 – Programando com Qualidade Capítulo 9 – Exemplos Práticos

9.2 – Criando um Polinômio59
9.3 – “Animação Gráfica”60
9.4 – Biot-Savart Numérico62
9.5 – Documentador de “*.m”s63

Capítulo 1 – Prólogo

1.1 – Uso do MatLab

Diversos professores falam: “MatLab é uma ferramenta muito boa”, “Façam isso no MatLab” ou “Fiz uma coisa no MatLab para mostrar para vocês”. Mas o que faz desse programa uma ferramenta interessante?

Basicamente, trata-se de um software excelente para cálculos numéricos em massa, otimizado para uso de vetores e matrizes (daí o nome “MatLab”). Além disso, ele conta com ótimos recursos para plotagem, para simulação de sistemas diferenciais (Simulink) e outros muitos que jamais iremos conhecer. Se instalarmos todos as ferramentas disponíveis da versão 7.0, o espaço ocupado no HD pode ser bem maior do que o esperado (e do que o necessário).

Além do mais, seu editor de funções e rotinas oferece um espaço bem amigável aos programadores, contando inclusive com cores de identificação de código e com um debugger.

1.2 – MatLab x Maple

Talvez muitos alunos prefiram usar o programa Maple para efetuar seus cálculos de engenharia, por terem tido com ele um contato mais prematuro. Há quem faça até discussões calorosas sobre qual dos dois é o melhor software.

Pessoalmente, creio que cada um tem sua utilidade. Vejamos as vantagens do Maple:

Aspectos Maple MatLab

Expressões Literais

> sin(a)2+cos(a)2 ;

> simplify(%) ; > int(sec(x),x);

> int(1/sqrt(2*Pi)*exp(- 0.5*x^2), x=-infinity .. infinity);

>> sin(a)^2+cos(a)^2 ??? Undefined function or variable 'a'.

>> syms x ; >> a = sin(x)^2 + cos(x)^2 a = sin(x)^2+cos(x)^2

>> simplify( a ) ans = 1

>> int( 1/sqrt(2*pi)*exp(-0.5*x2), -inf, inf ) ans =

7186705221432913/18014398509481984 *2^(1/2)*pi^(1/2)

Exibição dos Dados

> ( a^2 + 5*log(x/y) ) / ( sqrt(1) + Pi ) ; >> syms a x y

>> ( a^2 + 5*log(x/y) ) / ( sqrt(1) + pi ) ans =

562949953421312/3635653209253651*a^ 2+2814749767106560/3635653209253651 *log(x/y)

Pois é, o Maple trabalha bem com expressões literais e numa exibição melhor. Agora vejamos as vantagens do MatLab:

Aspectos Maple MatLab

Uso de vetores e matrizes

> A:=matrix(2,2,[3,3,3,3]); > B:=matrix(2,2,[2,2,2,2]);

> evalm(A.B);

>> A = [ [3 3] ; [3 3] ] B = [ [2 2] ; [2 2] ]

3 3
3 3
2 2
2 2
12 12
12 12
6 6
6 6

B = >> A*B ans = >> A.*B ans =

Cálculo em Massa

> A:=[0,Pi/2,Pi,3*Pi/2,2*Pi];

> sin(A); Error, invalid input: sin expects its 1st argument, x, to be of type algebraic, but received [0, 1/2*Pi, Pi, 3/2*Pi, 2*Pi]

0 1.5708
3.14164.7124 6.2832
0 1.0

>> x = 0 : pi/2 : 2*pi x = >> sin( x ) ans = 0.0 -1.0 -0.0

> for i from 0 to 4 do v[i] := sin( Pi*i/2 ); end do;

Funções

> funcao := x-> if x>=0 then sin(x) else 1/x end if;

> funcao(-2);

> funcao(2*Pi);

Error, (in funcao) cannot determine if this expression is true or false: -2*Pi <= 0

> funcao(evalf(2*Pi,1000)); functionretorno = funcao ( x )

retorno = sin( x );
retorno = 1 / x ;

if x >=0 else end

>> funcao( -2 ) ans = -0.5000 >> funcao( 2 * pi ) ans = -2.4493e-016

Gráficos

> plot((sin(x))^2, x=0..10, title=Seno,labels=["x", "sen(x)"],labeldirections=[h orizontal,vertical]);

>> plot( 0 : 0.1 : 10 , sin( 0 : 0.1 : 10 ) .^ 2 ) >> title( 'Seno' )

>> xlabel( 'x' )

>> ylabel( 'sen( x )' )

De fato, o MatLab trabalha muito bem com matrizes e cálculos em massa, além de possuir um aspecto de programação melhor. A manipulação dos gráficos pode ser mais interessante também, dependendo da aplicação.

Moral da história: se quisermos uma análise mais matemática, mais literal, usamos o Maple; se quisermos trabalhar com muito dados numéricos e gráficos, e programar com vários funções/módulos, usamos o MatLab.

Capítulo 2 – Comandos Básicos

2.1 – Declarações e Operações Básicas

Há dois modos de se trabalhar no MatLab: usando a tela de comandos e usando o editor de texto. Para início de conversa, usaremos a tela de comandos – mas tudo o que é feito aqui pode ser usado no editor.

Æ tela de comandos

Æ editor de texto

OBS: no lado direito da tela de comandos, existe um quadro onde se podem visualizar os arquivos do diretório atual (Current Directory) e as variáveis declaradas até o momento (Workspace). Logo abaixo, temos o histórico dos comandos digitados.

Comecemos do princípio então. Digitamos o comando sempre em frente do “>>”, e a resposta aparece embaixo, como num prompt. Para declarar variáveis, fazemos o mais óbvio dos comandos.

2
4.5

>> x = 2 x = >> x = x + 2.5 x =

>> x = -5.6 + 3*i x = -5.6000 + 3.0000i >> x = 'string' x = string

Repare que não se trata de uma linguagem tipada (ou seja, uma variável pode ser ora um número inteiro, ora uma string, etc, sem precisarmos declarar seu tipo).

Repare também que o uso do ponto e vírgula não é obrigatório. Quando posto, ele apenas omite a resposta na tela de comandos (mas armazena o valor). E digitando apenas o nome da variável, seu valor aparece (caso já tenha sido declarado).

>> a ??? Undefined function or variable 'a'. >> a = 3 ;

3

A notação científica pode ser usada também. Para os que não sabem, 1.43e-3 (escreva tudo junto, sempre) significa “1.43 vezes 10 elevado a -3” = 0.00143.

12670

>> a = 12.67e3 a =

Algumas contas agora. As quatro operações básicas – adição, subtração, multiplicação e divisão – possuem os símbolos universais de todas (ou boa parte) das linguagens –> +, -, * e /, respectivamente. Lembre-se que a prioridade vai para a multiplicação e divisão, de forma que usamos parêntesis nas expressões mais complexas.

Ah, sim, você pode executar mais de um comando de uma só vez. Basta escrever um deles e apertar Shift + Enter, e então ocorre a quebra de linha.

2.6000
1.6000
4.2000

>> a = 2.6 a = >> b = 1.6 b = >> a + b ans =

>> ( a + b ) * ( a - b ) - a / b a * b

2.5750

ans =

4.1600

ans =

A potenciação é usada com o operador “^”. Já vale a pena citar aqui que o número imaginário 1− é representado por “i” ou por “j”, a menos que haja variáveis com esses nomes.

9.3200
-1
0 - 1.0000i
2

>> c = a ^ 2 + b ^ 2 c = >> i ^ 2 ans = >> j ^ 3 ans = >> i = 2 i = >> i ^ 2

4

ans =

argumento_1 , argumento_2 ,). É o caso da raiz quadrada: sqrt( numero ).

As outras operações são obtidas através de chamadas de função, como na maioria das linguagens. Basicamente, seu formato básico é nome_da_função(

2.0100
0 + 2.0100i

>> sqrt( 4.04 ) ans = >> sqrt( -4.04 ) ans =

As demais operações matemáticas serão apresentadas no Capítulo 4. Algumas outras abstrações matemáticos e computacionais, como o infinito e o “Not a Number” (NaN), também estão presentes na linguagem.

>> 1 / 0 Warning: Divide by zero.

ans = Inf

>> 0 / 0 Warning: Divide by zero.

ans = NaN

2.2 – Comandos de Ajuda

Antes de continuarmos com a apresentação de funcionalidades, é interessante já mostrar o caminho para aqueles que gostam de aprender sozinhos, por exploração. A maioria das versões do MatLab não possui um guia de ajuda em janela decente. No entanto, através da própria tela de comandos, podemos encontrar o que queremos com certa facilidade.

Qual seria o comando para ajuda então? Elementar, meu caro Watson: digitamos help nome_da_função para sabermos mais sobre essa função! Não é genial?

>> help sqrt

SQRT(X) is the square root of the elements of X. Complex
results are produced if X is not positive.
See also SQRTM.

SQRT Square root. 1

aspas simples nela (lookfor 'palavra1 palavra2')

Ok, mas e se eu não souber o nome da função de que preciso? Não se aflija, pois para isso existe o comando lookfor palavra. Com a lista de funções encontradas com palavra em sua descrição, usa-se em seguida o comando help para investigar melhor seu funcionamento. E para pesquisar uma expressão com mais de uma palavra, coloque

>> lookfor fourier FFT Discrete Fourier transform. FFT2 Two-dimensional discrete Fourier Transform. FFTN N-dimensional discrete Fourier Transform. IFFT Inverse discrete Fourier transform. IFFT2 Two-dimensional inverse discrete Fourier transform. IFFTN N-dimensional inverse discrete Fourier transform. XFOURIER Graphics demo of Fourier series expansion. DFTMTX Discrete Fourier transform matrix. INSTDFFT Inverse non-standard 1-D fast Fourier transform. NSTDFFT Non-standard 1-D fast Fourier transform.

SQRTMMatrix square root.

>> lookfor 'square root' REALSQRT Real square root. SQRT Square root. Não é a oitava maravilha do mundo, mas já quebra um galho.

2.3 – Comandos para a Tela de Comandos

Diferente do que ocorre no Maple, não é possível modificar ou reexecutar um comando da linha de onde ele foi criado. Porém é possível reobtê-lo na linha corrente com as setas cima e baixo do teclado, tal qual no prompt do DOS, por exemplo. Isso poupa o inútil trabalho de redigitação ou de Ctrl+C e Ctrl+V.

Veja que, colocando a(s) inicial(is), pode-se retomar comandos de modo mais rápido.

E, depois de digitar tantas declarações e operações, a tela já deve estar uma zona, e a memória cheia de variáveis inúteis. Isso sem falar que poderíamos estar plotando vários gráficos também. Para limpar tudo isso sem sair do programa, usamos os comandos:

Operação Função

Limpar Comandos da Tela clc

Limpar Variáveis da Memória

(ou apenas uma em específico) clear clear variavel

Fechar Janela de Gráfico (ou fechar todas as janelas) close close all

Capítulo 3 – Vetores e Matrizes

Vetores e matrizes são o grande diferencial do MatLab. Este capítulo é muito importante se quisermos rapidez e eficiência nos cálculos.

3.1 – Notação e Declaração de Vetores no MatLab

Como se sabe, um vetor nada mais é do que uma fila de números com algum significado (ou não). A vantagem que ele traz aqui no MatLab é poder operar com muitos valores de uma só vez.

Primeiramente, alguns pontos importantes: declara-se o vetor com os elementos entre colchetes (com ou sem vírgulas), o primeiro index do vetor é 1 e os elementos são acessados com o index entre parêntesis.

0 1 2 3

>> vet = [ 0 , 1 , 2 , 3 ] vet =

0 1 2 3 4

>> vet = [ 0 1 2 3 4 ] vet =

>> vet( 0 ) ??? Subscript indices must either be real positive integers or logicals.

0
3

>> vet( 1 ) ans = >> vet( 4 ) ans =

Mas e se quisermos um vetor de 0 a 9? Não precisa digitar tudo, basta usar a notação compacta val_inicial : val_final. E para ir de 0 a 9 de dois em dois? Usamos a notação val_inicial : val_passo : val_final

0 1 2 3 4 5 6 7 8 9

>> vet = 0 : 9 vet = >> vet = 0 : 2 : 9

0 2 4 6 8

vet =

E daí as brincadeiras começam. Por exemplo, pegando apenas um certo trecho do vetor.

0 1 2 3 4 5 6 7 8 9

>> vet = 0 : 9 vet =

0 2 6
1 2 3
0 3 6

>> vet( [1 3 7] ) ans = >> vet( 2 : 4 ) ans = >> vet( 1 : 3 : 9 ) ans =

Concatenando (unindo) vetores.

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

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

ans = >> [ vet1( 1 : 3 ) vet1( 6 ) vet2( 1 ) ] ans =

Podem-se alterar elementos de um vetor também, ou eliminá-los.

>> vet1 = [ 1 2 3 4 5 6 ] ; >> vet1( 1 ) = 0

0 2 3 4 5 6

vet1 = >> vet1( 1 ) = [ ]

2 3 4 5 6
2 6

vet1 = >> vet1( 2 : 4 ) = [ ] vet1 =

Não é necessário decorar todas essas manhas agora. Consulte o guia conforme necessário, e aprenda conforme o uso.

3.2 – Operações e Funções com Vetores

Um ponto fundamental é fazer aritméticas básicas com vetores. Vale lembrar que, para isso, os vetores precisam ter a mesma dimensão. Adição, subtração e multiplicação por um escalar são bem simples.

>> vetA = [ 1 2 3 ] ; vetB = [ 1 1 1 ] ; >> vetA + vetB

2 3 4
2 4 6
-1 0 1

ans = >> 2 * vetA ans = >> vetA - 2 * vetB ans =

Multiplicação, divisão e potenciação já são diferentes. Tais operações são definidas também num contexto de matrizes, o que faz necessário criar uma diferenciação entre operação de vetores / matrizes e operação de elementos de vetores / matrizes.

Portanto, para multiplicar, dividir ou elevar os elementos dum vetor, colocamos um ponto na frente do operador.

>> vetA = [ 2 3 ] ; vetB = [ 4 5 ] ; >> vetA * vetB ??? Error using ==> * Inner matrix dimensions must agree.

8 15

>> vetA .* vetB ans = 16

0.5000 0.6000
16 243

>> vetA ./ vetB ans = >> vetA .^ vetB ans =

>> vetB ^ 2 ??? Error using ==> ^ Matrix must be square.

16 25

>> vetB .^ 2 ans = A seguir, uma tabela de funções úteis para vetores.

Operação Função

Módulo (Norma) do Vetor modulo = norm( vet )

Produto Escalar de Dois Vetores prodEscalar = dot( vet1 , vet2 )

Produto Vetorial de Dois Vetores (R3) vet_result = cross( vet1 , vet2 )

Total de Elementos (Comprimento) totalElementos = length( vet )

Soma dos Elementos soma = sum( vet ) Produto dos Elementos produto = prod( vet ) Média dos Elementos media = mean( vet )

Maior dos Elementos (ou o maior elemento e seu índice) elem = max( vet ) [elem , indice] = max( vet )

Menor dos Elementos (ou o menor elemento e seu índice) elem = min( vet ) [elem , indice] = min( vet )

Encontrar Índices dos Elementos que

Satisfaçam Certa Condição vet_indices = find( condição ) <exemplo: vet_indices = find( vet > 0 ) retorna índices dos elementos positivos >

Existem muitas mais. Use o comando “lookfor” para buscar uma outra. Por fim, é importante citar que muitas funções aceitam vetores e matrizes como argumento, aplicando suas operações em todos os elementos. Isso é feito de maneira otimizada, para agilizar cálculos em massa. É o grande diferencial do MatLab.

0 3 6 9

>> vet = [ 0 3 6 9 ] vet = >> sqrt( vet ) ans =

0 1.7321 2.4495 3.0 >> sin( vet ) ans =

0 0.1411 -0.2794 0.4121

3.3 – Matrizes: o Foco do MatLab

A declaração e a notação de matriz são similares às de vetor. Cada linha é composta por elementos entre colchetes (opcionais, porém recomendados para facilitar visualização), e todas elas são postas, por sua vez, num outro par de colchetes, com ponto-e-vírgulas separando-as.

1 2 3
4 5 6
1 2
3 4
5 6

>> matriz = [ [1 2 3 ] ; [4 5 6 ] ] matriz = >> matriz = [ 1 2 ; 3 4 ; 5 6 ] matriz =

Para acessar um elemento, usamos a notação matriz( linha , coluna )

1 2 3
4 5 6
7 8 9
2
7

>> matriz = [ [1 2 3 ] ; [4 5 6 ] ; [7 8 9 ] ] matriz = >> matriz( 1 , 2 ) ans = >> matriz( 3 , 1 ) ans =

Para acessar uma linha / coluna inteira, usamos a notação matriz( linha , : ) / matriz( : , coluna ).

>> matriz( 2 , : ) ans =

3
6
9

4 5 6 >> matriz( : , 3 ) ans = Para calcularmos a matriz transposta, usamos o operador aspas simples ( ' ).

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

>> matriz' ans = >> matriz_linha = [ 1 2 3 4 ] matriz_linha = >> matriz_coluna = matriz_linha' matriz_coluna =

Pode-se modificar elementos da matriz, ou então linhas e colunas inteiras:

>> matriz = [ [1 2 3] ; [4 5 6] ; [7 8 9] ] ; >> matriz( 1 , 2 ) = 0

1 0 3
4 5 6
7 8 9
10 10 10
4 5 6
7 8 9
-2 10 -2

matriz = >> matriz( 1 , : ) = 10 matriz = >> matriz( [ 1 1 ] , [ 1 3 ] ) = -2 matriz = 19

7 8 9
5.5000 5.5000 5.5000
4.0 5.0 6.0
5.5000 5.5000 5.5000

4 5 6 >> matriz( [ 1 3 ] , : ) = 5.5 matriz =

As operações básicas funcionam como foi dito na seção de vetores: adição e subtração com “+” e “-”, sempre; multiplicação e divisão entre elementos com o ponto na frente (“.*” e “./”); multiplicação de matrizes com “*”; divisão de matrizes (uma matriz vezes a inversa da outra) com “/”.

>> matriz_A = [ [ 1 1 ] ; [ 1 2 ] ] ; matriz_B = [ [ 0 1 ] ; [ 1 1 ] ] ; matriz_C = [ [ 1 2 3 ] ; [ 4 5 6 ] ] ; matriz_D = [ [ 1 1 1 ] ; [ 4 4 4 ] ] ; >> matriz_A + matriz_B matriz_C + matriz_D

(Parte 1 de 4)

Comentários