Guia MatLab por Jan Krueger Siqueira

Guia MatLab por Jan Krueger Siqueira

(Parte 2 de 4)

1 2
2 3

ans =

2 3 4
8 9 10

ans =

>> matriz_A + matriz_C ??? Error using ==> + Matrix dimensions must agree.

1 2
2 3

>> matriz_A * matriz_B ans =

>> matriz_C * matriz_D ??? Error using ==> * Inner matrix dimensions must agree.

>> matriz_A .* matriz_B matriz_C ./ matriz_D

0 1
1 2

ans = ans =

1.0 1.2500 1.5000
0 1
1 1
As funções aritméticas e algébricas (raiz, seno, logaritmo,) com matrizes
vetores (soma, produto, média,) atuam geralmente nas colunas e retornam um vetor

1.0 2.0 3.0 >> matriz_A / matriz_B ans = atuam em cada um dos seus elementos. Já certas funções apresentadas na seção de de respostas. Consulte a ajuda das funções para descobrir essas diferenças. A seguir, uma tabela de funções úteis para matrizes.

Operação Função

Criar Matriz N x N Identidade matriz = eye( N ) Criar Matriz M x N de Zeros matriz = zeros( M , N )

Criar Matriz M x N de 1s matriz = ones( M , N )

Redimensionar Matriz para M x N matriz2 = reshape( matriz1 , M , N )

Rodar Matriz em k*90º matriz2 = rot90( matriz1 , k )

Espelhar Matriz da Esquerda para Direita matriz2 = fliplr( matriz1 ) Espelhar Matriz de Cima para Baixo matriz2 = flipud( matriz1 )

Veja que “zeros” e “ones” podem ser usadas para vetores também; basta passar o parâmetro M = 1. A função “fliplr” espelha o vetor, e a “flipud” não o modifica em nada. Confira outras funções para matrizes em 4.4 – Álgebra Linear.

3.4 – Matrizes Multidimensionais

Em algumas aplicações, é interessante trabalhar com matrizes de dimensão 3 ou superior. Para tal, fazemos uma declaração em etapas. Veja o exemplo da declaração de uma matriz tridimensional 2 x 2 x 2:

1 2
3 4
1 2
3 4

>> matriz3D = [ 1 2 ; 3 4 ] matriz3D = >> matriz3D( : , : , 2 ) = [ 5 6 ; 7 8 ] matriz3D(:,:,1) =

5 6
7 8

matriz3D(:,:,2) = 21

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

4.1 – Aritmética e Álgebra Básicas

Não preciso explicar muito aqui. Olhe a tabela e use as funções:

Operação Função Potenciação x ^ n

Radiciação (Raiz Quadrada) sqrt( x )

Exponenciação (potência do número neperiano) exp( x )

Logaritmo Neperiano ( ln ) log( x )

Logaritmo Decimal log10( x ) Logaritmo na Base 2 log2( x )

Módulo (para números complexos também) abs( x )

Fatorial (n!) factorial( n )

Combinação de N, K a K nchoosek( N , K )

Módulo do Resto da Divisão de A por B mod( A , B )

Arredondamento(para Cima, para Baixo ou para o Mais Próximo) ceil( x ) floor( x ) round( x )

Não encontrou exatamente a função que queria? Algumas manhas então:

• para calcular a raiz “n” de “x”, faça “x ^ ( 1 / n )” • para calcular o logaritmo de “x” na base “n”, faça “log( x ) / log( n )”

4.2 – Trigonométricas

As funções a seguir trabalham com ângulos em RADIANOS.

(em radianos) Direta Inversa (Arco-)

Seno sin( x ) asin( x )

Co-Seno cos( x ) acos( x ) Tangente tan( x ) atan( x )

As funções a seguir trabalham com ângulos em GRAUS (degrees).

(em graus) Direta Inversa (Arco-)

Seno sind( x ) asind( x )

Co-Seno cosd( x ) acosd( x ) Tangente tand( x ) atand( x )

Lembrando que as funções inversas retornam valores de ângulo entre –π/2 e π/2 radianos / -90º e + 90º. Muito cuidado quando for usá-las para não errar o quadrante desejado! Por fim, as funções hiperbólicas.

Direta Inversa (Arco-)

Seno Hiperbólico sinh( x ) asinh( x )

Co-Seno Hiperbólico cosh( x ) acosh( x ) Tangente Hiperbólica tanh( x ) atanh( x )

4.3 – Equações e Polinômios

Embora o MatLab não trabalhe com literais, ele pode sim ser útil em equações e polinômios. Repare que não usamos expressões como "x2 – 3*x + 4", mas sim os coeficientes dessa equação: [ 1 –3 4 ]. Confira a tabela abaixo:

Operação Função

Resolver Equação Polinomial (Encontrar as Raízes) vet_raizes = roots( vet_coef ) < coeficientes do polinômio em ordem decrescente de grau no vetor vet_coef >

Montar Polinômio a Partir das Raízes vet_coef = poly( vet_raizes )

Encontrar Melhor Polinômio

(Mínimos Quadrados) vet_coef = polyfit( vet_x , vet_y , N ) < cria polinômio de grau N que melhor se aproxima dos pontos (x,y) >

Aplicar "x" num Polinômio y = polyval( vet_coef , x )

A dupla polyfit e polyval seriam bem úteis nos laboratórios de física, onde plotamos os pontos experimentais e buscamos no "olhômetro" a melhor reta formada por eles. Bastaria usar "vet_coef = polyfit( pontos_x , pontos_y , 1 )" para obter os dois coeficientes da reta. Daí usaríamos a polyval para obter os pontos dessa reta e plotá-los (exemplo: "plot( [-10 : 10] , polyval( vet_coef , [-10 : 10 ] ) )" ).

CUIDADO: polinômios do tipo devem ser escritos na forma desenvolvida (no caso, ) e então se passam os coeficientes (no caso, [ 1 0 4 -5 0 ])! O vetor [ 1 4 -5 ] representaria o polinômio !

Confira o exemplo 2 do capítulo 9 para ver uma aplicação dessas funções. Por fim, vale lembrar novamente que o MatLab trabalha com números complexos, de forma que toda a equação polinomial terá solução (mesmo que aproximada).

4.4 – Álgebra Linear

E, como não poderia deixar de ser, temos uma coletânea de funções de Álgebra Linear para matrizes. Confira algumas na tabela abaixo.

Operação Função

Determinante determinante = det( matriz ) Inversa matriz_inversa = inv( matriz )

Resolver Sistema Linear (A*X = B) matriz_x = linsolve( A , B ) < A é matriz quadrada e B é matriz coluna >

< x é matriz coluna com as soluções >

AutoValores / Auto Vetores (eigenvalues / eigenvectors) matriz_autoval = eig( matriz ) < retorna autovalores numa matriz coluna >

[ mat_autoval , mat_autovet ] = eig( matriz ) < retorna autovalores numa matriz diagonal e autovetores em colunas numa outra matriz >

Decomposição LU [ L , U ] = lu( matriz ) Decomposição QR [ Q , R ] = qr( matriz ) exemplo: resolvendo sistemas de equações

>> A = [ 5 2 ; 3 -1 ] B = [ 9 ; 1 ]

5 2
3 -1
9
1
1
2

B = >> matriz_x = linsolve( A , B ) matriz_x =

Temos também um pouco de Cálculo Funcional (operações sobre matrizes N x N, usadas geralmente para resolver sistemas diferenciais).

Operação Função

Raiz Quadrada de Matriz matriz2 = sqrtm( matriz1 ) Exponencial de Matriz matriz2 = expm( matriz1 ) Logaritmo de Matriz matriz2 = logm( matriz1 )

Trigonométricas de Matriz matriz2 = funm( matriz1 , @SIN ) matriz2 = funm( matriz1 , @COS ) matriz2 = funm( matriz1 , @SINH ) matriz2 = funm( matriz1 , @COSH )

4.5 – Cálculo Diferencial e Integral

Primeiramente convém lembrar mais uma vez que o MatLab é uma excelente ferramenta para números. Portanto começaremos com as funções que fazem o Cálculo Numérico.

Operação Função

Derivada Numérica vet_derivada = diff( vet_funcao ) / valor_passo

Integral Definida Numérica (quadrature) valorIntegral = quad( funcao , tempoIni , tempoFim )

Resolução Numérica de Equação ou

Sistema Diferencial de 1ª. Ordem [vet_tempo vet_y] = ode45( funcao , [ tempoIni tempoFim ] , vet_condIni ) <onde y’ = função>

Calma que a gente explica com exemplos. A função “diff” apenas retorna as subtrações de cada elemento do vetor com o elemento anterior. Lembrando que a definição da derivada é

t tyttytdtdy t ∆ podemos calculá-la com o resultado da função “diff” dividido pelo intervalo dum infinitesimal – um valor suficientemente pequeno.

exemplo: derivada de y = cos( t ) * t, do instante 0 a 5s

>> dt = 0.001 ; >> vet_t = 0 : dt : 5 ;

>> vet_y = cos( vet_t ) .* vet_t ;

>> vet_derivada = diff( vet_y ) / dt ;

A função “quad” usa um método de Simpson alternativo e recebe um parâmetro função que pode ser passado por string ou numa referencia a alguma função já existente em arquivo “.m”.

exemplo: calcular a integral da função anterior no mesmo intervalo de tempo

>> quad( 'cos( t ) .* t' , 0 , 5 ) ans = -5.5110

Resolver equações ou sistemas diferenciais já é um pouco mais complicado. Comecemos com um exemplo simples. Para resolver a equação e obter os valores de y de 0 a 5s, precisamos antes de tudo isolar o termo de primeira ordem. Isto é, escrever

Agora precisamos criar uma função auxiliar no Editor de Texto – ele será abordado com mais calma no capítulo 6. Vá em “File > New > M File” e digite o seguinte:

retorno = ( cos( tempo ) - y ) / 2 ;

function retorno = funcao ( tempo , y )

Salve o arquivo como “funcao.m”. Daí digitamos o seguinte comando:

>> tempoInicial = 0 ; >> tempoFinal = 5 ;

>> condicaoInicial = 10 ;

>> [ vet_tempo , vet_y ] = ode45( @funcao , [ tempoInicial tempoFinal ] , condicaoInicial ) ;

Para equações de ordem superior, o segredo é transformá-la num sistema de equações de 1ª ordem. Vejamos o exemplo.

Reescrevendo para a forma de um sistema (fazemos y’(t) = x(t) e, portanto, y’’(t) = x’(t)) e já isolando os termos de 1ª ordem, teríamos o seguinte.

Repetimos o que fizemos no caso anterior: criamos uma função auxiliar no

Editor de Texto, acrescentando alguns detalhes. Veja que o segundo parâmetro da função agora é um vetor com as variáveis x e y – estabeleceremos que o primeiro elemento será relativo a x(t) e o segundo a y(t).

vet_retorno = zeros( 2 , 1 ) ;
vet_retorno( 1 ) = cos( tempo ) - 5 * vet_var( 1 ) - 6 *

function vet_retorno = funcao ( tempo , vet_var ) vet_var( 2 ) ;

vet_retorno( 2 ) = vet_var( 1 ) ;

Salve o arquivo como “funcao.m”. Daí digitamos o seguinte comando:

>> tempoInicial = 0 ; >> tempoFinal = 5 ;

>> vet_condicaoInicial = [ 0 10 ] ;

>> [ vet_tempo , vet_var ] = ode45( @funcao , [ tempoInicial tempoFinal ] , vet_condicaoInicial ) ;

Os valores de x e y estarão respectivamente em vet_var( : , 1 ) e vet_var( : , 2 ). O MatLab vem com uma ferramenta bem mais interessante para a resolução de sistemas diferenciais: o Simulink. No entanto, este guia não tratará do assunto, já que ele é abordado em outras matérias de engenharia.

Além do cálculo numérico, existe uma biblioteca de funções que trabalha com símbolos e literais, o que permite obter derivada e integral indefinidas e resolver equações diferenciais. Entretanto ressalta-se novamente que, para essa finalidade, o uso do Maple é recomendado.

Operação Função

Declarar Símbolo Literal syms nomeSimbolo

Calcular Derivada de uma Expressão (ou derivada parcial) (ou derivada de ordem N) diff( expressao ) diff( expressao , variavel ) diff( expressão, N )

Calcular Integral de uma Expressão (ou integral com respeito a uma variável) (ou integral definida de A a B) int( expressao ) int( expressao , variavel ) int( expressão, A , B )

Resolver Equação Diferencial dsolve( equacao ) dsolve( equacao , condicoesIniciais ) exemplo 1: calcular derivada segunda e integral de 21xt+ com respeito a x

>> syms x ; >> syms t ;

>> symb_expressao = t / ( 1 + x^2 ) symb_expressao = t/(1+x^2)

>> diff( symb_expressao , x , 2 ) ans = 8*t/(1+x^2)^3*x^2-2*t/(1+x^2)^2

>> int( symb_expressao , x ) ans = t*atan(x)

>> symb_y = dsolve( 'Dy = -a*y' , 'y(0) = 1' ) symb_y = exp(-a*t)

4.6 – Sinais e Sistemas

Se você pegou este guia apenas porque tem que fazer um trabalho de ELE 1030

– Sinais e Sistemas, esta é a sua chance! Só espero que outras partes desse guia tenham sido lidas também, porque senão não vai adiantar de muita coisa.

Conforme dito anteriormente, o MatLab não é muito forte com expressões literais, mas sim com as numéricas. Então todas as transformadas e funções de transferência serão aplicadas para um conjunto de pontos finitos, e não para outras funções ou sistemas.

A tabela abaixo resume as funções mais interessantes. Exemplos com elas virão na seqüência.

Operação Função

Montar Função de Transferência

H = tf( vet_coef_num , vet_coef_denom ) < numerador e do denominador com polinômios de s>

Resposta ao Degrau step( H ) step( H , vet_tempo )

[vet_Y vet_tempo] = step( H )

Resposta ao Impulso impulse( H ) impulse( H , vet_tempo ) [vet_Y vet_tempo] = impulse( H )

Resposta a Entradas Genéricas lsim( H , vet_X , vet_tempo ) vet_Y = lsim ( H , vet_X , vet_tempo )

Diagrama de Bode bode( H )

Transformada Discreta de Fourier (Fast Fourier Transform) vet_XF = fft( vet_X )

<a primeira metade de vet_XF corresponde às freqüências positivas> exemplo 1: circuito RC série

sRCs RCV

A partir da função de transferência encontrada via análise do circuito, obteremos a resposta da tensão no capacitor para entradas impulso, degrau e exponencial decrescente na fonte.

>> Hc = tf( [ 5 ] , [ 1 5 ] )

Transfer function: 5 ----- s + 5

>> impulse( Hc ) ; >> step( Hc ) ;

>> vet_tempo = [ 0 : 0.001 : 3.5 ] ;

>> lsim( Hc , exp( -1 * vet_tempo ) , vet_tempo ) ;

Os gráficos gerados são esses acima. Confira que as curvas condizem com as expressões teóricas (fica como exercício a demonstração).

exemplo 2: análise de uma função de transferência genérica

++= s ssssH

Para obtermos o diagrama de Bode, temos que montar a função de transferência primeiro, como no exemplo anterior. Entretanto, os polinômios do numerador e denominador não estão desenvolvidos (temos a forma fatorada, ao invés disso). A fim de evitar dois trabalhos de distributivas, basta usar a função “poly” apresentada em 4.3, que retorna os coeficientes do polinômio dadas as raízes (cuidado: as raízes duplas devem ser passadas duas vezes!).

>> vet_raizesNumerador = [ 0 1 1 10000 ] ; >> vet_raizesDenominador = [ 10 100 100 1000 ] ;

>> vet_coefPolinomioNumerador = 250 * poly( vet_raizesNumerador ) ;

>> vet_coefPolinomioDenominador = poly( vet_raizesDenominador ) ;

>> H = tf( vet_coefPolinomioNumerador , vet_coefPolinomioDenominador )

Transfer function: 250 s^4 - 2.501e006 s^3 + 5e006 s^2 - 2.5e006 s ------------------------------------------------ s^4 - 1210 s^3 + 20 s^2 - 1.21e007 s + 1e008

>> bode( H ) ;

exemplo 3: módulo da transformada de fourier de rect( t ):

>> vet_y = [zeros( 1 , 100 ) ones( 1 , 10 ) zeros( 1 , 100 )] ; >> vet_Y = fft( vet_y ) ;

>> vet_moduloY = abs( vet_Y ) ;

>> plot( vet_moduloY( 1 : 105 ) ) ;

Completando a análise de Sinais e Sistemas, apresentamos uma das várias opções de filtros existentes no MatLab.

Operação Função

Construir Filtro de Ordem N e Freqüência de Corte Wc (ou passa-banda entre W1 e W2)

[ vet_coefNum vet_coefDenom = butter( N , Wc , ‘low’) [ vet_coefNum vet_coefDenom = butter( N , Wc , ‘high’)

[ vet_coefNum vet_coefDenom = butter( N , [W1 W2] )

Aplicar Filtro num Sinal vet_y = filter( vet_coefNum , vet_coefDenom , vet_x )

4.7 – Outras Funções

Algumas opções para fatorações e números primos:

Operação Função

Fatorar um Número vet_fatores = factor( numero )

Mínimo Múltiplo Comum – MMC (Least Common Multiple – LCM) mmc = lcm( num1, num2 ) vet_mmc = lcm( vet1 , vet2 ) matriz_mmc = lcm( matriz1 , matriz2 )

Máximo Divisor Comum – MDC (Greatest Common Divider – GCD) mdc = gcd( num1, num2 ) vet_mdc = gcd( vet1 , vet2 ) matriz_mdc = gcd( matriz1 , matriz2 )

Checar se um número ou os elementos de um vetor ou matriz são primos (retorno: 0 = não é primo, 1 = é primo) condicao = isprime( numero ) vet_condicoes = isprime( vet ) mat_condicoes = isprime( matriz )

Obter Números Primos Menores ou Iguais a N vet_primos = primes( N )

OBS: as funções de MMC e MDC fazem a operação sobre 2 números de cada vez (no caso de vetores, sobre o 1º elemento de um com o 1º elemento do outro, e assim sucessivamente, retornando um vetor de MMC / MDC). Para fazer com 3 ou mais números juntos, chame a função mais de uma vez (exemplo: MMC entre 4, 5 e 12 Æ mmc = lcm( lcm( 4 , 5 ) , 12 ) ). Agora, algumas opções para gerar números aleatórios:

Operação Função

Gerar Matriz M x N com Elementos em

Distribuição Uniforme entre 0 e 1 matriz = rand( M , N )

Gerar Matriz M x N com Elementos em Distribuição Normal (Gaussiana) com média 0 e σ2 = 1 matriz = randn( M , N )

numero = random( string_Distrib ,)

Gerar Números numa Distribuição Qualquer < consulte help random para maiores detalhes >

(Parte 2 de 4)

Comentários