Escolar Documentos
Profissional Documentos
Cultura Documentos
CURSO DE
MATLAB
APLICADO À
ENGENHARIA
2
1. APRESENTAÇÃO
"Codifique sempre como se o cara que for dar manutenção seja um psicopata
violento que sabe onde você mora."
Martin Golding
INTRODUÇÃO
Observação: para essa apostila fiz todos os comentários baseados no MatLab versão 2009.
WORKSPACE
CURRENT VARIÁVEIS
COMMAND WINDOW
DIRECTORY
HISTÓRICO
Command Window: esse é o principal elemento da janela do MatLab, é nesta parte onde
digitamos os comandos para a execução dos cálculos.
Current Directory: esse componente apresenta o diretório atual, será muito usado quando
trabalharmos com várias funções e chamadas de rotinas. Lembre-se de sempre setar o diretório que irá
realizar o seu trabalho, caso você não faça isso o MatLab irá sugerir a mudança de diretório para você
na execução de sua rotina.
Command History: essa janela apresenta os últimos comandos que foram inseridos no
Command Window.
ATENÇÃO: caso você não esteja visualizando algum destes componentes, NÃO SE
DESESPERE, vá ao menu Desktop do MatLab e apenas clique nos componentes que queira exibir.
Bom, depois de conhecer muito bem os componentes que montam a janela, vamos ao que
interessa.
2. MATRIZES
Primeiramente, lembre-se que para o MatLab trata todos os valores inseridos como matrizes,
independentemente do tamanho. Ou seja, um escalar é considerado uma matriz 1𝑥1, um vetor é
considerado uma matriz 1𝑥𝑛 (vetor linha) ou 𝑛𝑥1 (vetor coluna), e por fim, uma matriz é da ordem 𝑛𝑥𝑚.
INSERÇÃO DE DADOS
cos(2 ∗ 𝑝𝑖 ∗ 60)
ESCALAR
Caso você queira gravar os dados em uma variável, basta usar o sinal de =. Como segue no
exemplo abaixo:
𝑎 = 2 ∗ 𝑠𝑞𝑟𝑡(5);
Repare que no exemplo acima, foi usado o sinal de ; no final da instrução, lembrando que esse
sinal de pontuação apenas serve para que “a resposta” não seja mostrada no Command Window, o
MatLab fará internamente o processamento do cálculo. ATENÇÃO, ISSO É MUITO IMPORTANTE,
usamos o sinal de ponto e virgula para que o programa processe de forma rápida os nossos cálculos,
imagine que você irá executar uma rotina que precisa fazer cálculos matriciais de uma determinada
ordem grande e que seja executado de forma repetitiva, se o programa se preocupar em mostrar todos
os passos da iteração irá levar muito tempo, portanto, use o PONTO E VÍRGULA em TODOS os casos
dentro de uma rotina.
VETOR
Para criar um vetor no MatLab, basta usar os colchetes [] associados a espaço (vetor linha), ou
ponto e vírgula (vetor coluna), como segue no exemplo abaixo:
𝑣𝑒𝑡(𝑝𝑜𝑠𝑖çã𝑜) → 𝑒𝑙𝑒𝑚𝑒𝑛𝑡𝑜
𝑣𝑒𝑡(2) → 92
MATRIZES
𝑚𝑎𝑡𝑟𝑖𝑧(2,3) → 6
2 3
𝑚𝑎𝑡𝑟𝑖𝑧([12], [23]) →
5 6
OPERADORES
A+B : soma
A-B : subtração
A*B : multiplicação
A^B : potência
OPERADOR “:”
Esse é O operador no MatLab e será muito usado por todos vocês para fazer inúmeras funções,
basicamente ele significa ATÉ. Exemplos gerais de uso:
Outro exemplo para acesso de matrizes: 𝑚𝑎𝑡𝑟𝑖𝑧([1080: 𝑒𝑛𝑑], : ) pega todos os elementos de
todas as colunas da linha 1080 até o final da matriz.
OPERADOR “.”
O operador ponto (.), faz operações elemento a elemento em um vetor. Isso será muito usado
para a resolução de rotinas numéricas. O operador é colocado sempre antes do sinal de multiplicação
ou divisão, ou ainda potência. Exemplo, imagine que você possui uma impedância que varia com a
frequência e você precisa obter o valor da indutância, basta portanto dividir o vetor impedância pelo
vetor de frequência associado à 2𝜋 e retirar a parte imaginária. Veremos isso mais adiante.
Mensagens comuns:
Inner matrix dimensions must agree. as matrizes não são do mesmo tamanho
Undefined function or variable 'x'. não existe um valor x, PORQUE não foi definido
Vocês já repararam que a maioria dos erros é porque as benditas das matrizes não são do mesmo
tamanho, para evitar esse problema iremos usar dois comandos para verificar o tamanho dos vetores
ou matrizes.
Basicamente o que eu vou falar aqui NÃO é importante, porque vocês tem esses acessos direto
pela janela de Current Directory, então se quiser pular isso, fique a vontade.
dir ou ls: lista o conteúdo do diretório (que já está sendo apresentado na janela do Current
Directory.
which: localiza o arquivo (o que não é nada útil, a não ser que você precise do endereço dele).
𝑝𝑖 𝜋
𝑖𝑜𝑢𝑗 √−1
𝑒𝑝𝑠 2.2204e-016
𝑖𝑛𝑓 Infinito
𝑛𝑎𝑛 Não é um número. Ex. 0/0
Use também notações científicas com o "𝑒". Ex.: 1𝑒3 = 1000; 1𝑒 − 3 = 0.001.
OBSERVAÇÕES:
FORMATOS
Podemos trabalhar com diferentes formatos para visualizar com a precisão necessária os nossos
resultados. Abaixo uma descrição dos formatos mais usados:
format bank: formato de moeda, 2 casas após a vírgula (bom para porcentagem)
FUNÇÕES BÁSICAS
A seguir serão apresentadas algumas funções matemáticas básicas, dado um determinado valor
x, tem-se:
sqrt(x): calcula a raiz quadrada de x. Pode ser calculada também através de x^(1/2).
OBSERVAÇÃO: lembre-se que x deve ser uma entrada em radianos nos cálculos
trigonométricos, portanto faça a conversão necessária, ou, caso queira usar em graus, use o “d” na frente
das expressões, ex.: sind(x).
Para mais detalhes sobre funções acesse help elfun. Esse comando lista as funções básicas para
diversos tipos de cálculos no MatLab, como trigonometria, exponencial, complexos e funções de
arredondamento.
OBSERVAÇÃO: se tem dúvida de qualquer comando, digite help comando, é a melhor forma
de aprender no MatLab, não entendeu ainda como funciona? Procure no Google um exemplo.
‘: mostra a transposta de uma matriz REAL. Para matrizes complexas use o comando transp(x).
𝑟𝑎𝑛𝑑(𝑛, 𝑚): cria uma matriz randômica (aleatória) de 𝑛 linhas por 𝑚 colunas.
sort(A): coloca os elementos da matriz em ordem crescente por coluna, para linha use sort(A,2).
TEXTO
A inserção de texto se dá pelo uso de apóstrofes. Ex.: ‘oi‘. O texto se comporta como uma matriz,
portanto é possível aplicar a transposta, fazer concatenações, substituições de elementos e assim por
diante.
COMANDO CELL
Permite armazenar diferentes tipos de dados (matrizes, textos, escalares, vetores, ...) em um
único nome. Ex.: 𝑐𝑒𝑙𝑢𝑙𝑎 = {𝑒𝑦𝑒(3)‘𝑡𝑒𝑥𝑡𝑜’; 𝑝𝑖[0: 1𝑒 − 3: 5]};
3. PROGRAMAÇÃO
Irei explicar nesse capítulo quais são os comandos básicos de programação em qualquer
linguagem, isso é, estruturas de decisão (if … else), estruturas de repetição (for, while). Se você já
conhece isso, parabéns você tem noção de programação, portanto, pule esse capítulo.
Todos os programas, rotinas, procedimentos, ou o nome que você quiser dar pro seu código
serão escritos na janela do script, para que posteriormente esse código possa ser editado. Para isso vá
ao menu File->New->Blank M-file, ou clique no botão novo ( ). O arquivo chama-se M-file porque
a extensão dele será .m. Você deverá ter uma tela parecida com essa.
Nessa janela algumas palavras aparecerão com cores diferentes, vamos entende-las.
Comentários: verde
Erro: vermelho
ESTRUTURA DE DECISÃO
A estrutura de decisão está relacionada a análise de uma condição, se essa condição for
verdadeira ela executa uma resposta, caso seja necessário, se for falsa executa outra resposta.
idade=15;
se idade<18
‘acesso negado’
caso contrário
‘acesso permitido’
Fim
Toda estrutura no MatLab deve apresentar um fim, representado pelo comando end.
idade=15;
if idade<18
‘acesso negado’
else
‘acesso permitido’
End
Simples e fácil, basta na hora de montar seu programa pensar na lógica do que você deseja
visualizar na resposta. Segue abaixo código de mais um exemplo, que verifica se o número é par ou
ímpar.
numero = 28;
if mod(numero,2)==0
‘O número é par’
else
‘O número é ímpar’
End
Operadores Lógicos
== Igual
~= Diferente
< Menor
> Maior
<= Menor ou igual
>= Maior ou igual
~ Not
& E (and)
| Ou (or)
SWITCH
switch valor_teste
case 10
tipo =’Numero 10’;
case 100,200,300
tipo = ‘Numero 100, 200 ou 300’;
case ‘Alfa’
tipo = ‘Texto Alfa’
case {‘Beta’, ‘Gama’, ‘Delta’}
tipo = ‘Texto Beta, Gama ou Delta’;
otherwise
tipo = ‘valor_teste não reconhecido’;
end
ESTRUTURAS DE REPETIÇÃO
As estruturas de repetição servem para fazer cálculos repetitivos. Os comandos usados são for
quando se conhece o número de iterações que se deseja realizar ou while quando se conhece apenas o
critério de parada. Inicialmente será apresentado o comando for.
aux = 0;
for i=1:10
aux=aux+2*i;
end
for i=1:3
for j=1:3
matriz(i,j)=2*i+j^3;
end
end
3 10 29
𝑚𝑎𝑡𝑟𝑖𝑧 = 5 12 31
7 14 33
n=5;
a=eye(n);
a(:,1)=1;
for i=3:n
for j=2:i
a(i,j)=a(i-1,j-1)+a(i-1,j);
end
end
Agora trabalharemos com o comando while, lembre-se que esse comando executará o laço até
o momento em que sua condição for satisfeita.
while <condição>
Exp. 1;
Exp. n;
End
num=542;
div=27;
while mod(num,div)~=0
num=num+1;
end
num %colocar essa variável nessa posição mostra o valor dela, repare que
%está sem o ;
4. PROGRAMANDO NO M-FILE
OBSERVAÇÃO IMPORTANTE: para executar as rotinas, você deve sempre salvá-las, o nome
da rotina não deve conter espaços, caracteres especiais ou começar com números.
Iremos criar algumas rotinas nesse capítulo, mas antes, quero deixar claro aqui o que se tornará
obrigatório no início de todas as rotinas que não são dependentes de outras. Todas as rotinas deverão
conter em seu cabeçalho os seguintes comandos:
Todos os programas deverão conter comentários sobre o que você está fazendo, ou porque criou
determinada variável, lembre-se que não será só você que irá usar seu programa, e mesmo que for, vá
por mim, você não lembrará o que você fez no mês passado se não deixar um recado anotado. Portanto
todo o código deverá ser comentado, para isso use o símbolo de porcentagem (%), seguido do
comentário a ser feito.
A primeira rotina a ser trabalhada será a determinação da convergência de uma série. Dada a
série abaixo, determine se ela é convergente ou não.
∞
1
𝑓(𝑥) = ∑
𝑛!
𝑛=1
Solução:
clc
clear all
close all
A seguir teremos outro exemplo considerando a aplicação de um vetor, sabe-se que 𝑓(𝑥) existe
no intervalor −2 < 𝑥 < 2.
∞
4 (−1)𝑛+1 nπx
𝑓(𝑥) = ∑ sen ( )
𝜋 𝑛 2
𝑛=0
Solução:
clc
clear all
close all
%define a variação de x
x=-2:1e-2:2;
%número de elementos que eu quero para ver se a função converge ou não
n=10;
%criando uma variável para inicializar o somatório
f=0;
for i=1:n
f=f+4/pi*(-1)^(i+1)/i.*sin(i*pi*x/2);
end
plot(x,f)
i=rand(1,10);
v=rand(1,10);
r1=v./i;
for j=1:10
r2(j)=v(j)/i(j);
end
r1>r2
5. DEBUG
: colocar um breakpoint (ponto de parada) na rotina, essa ação pode ser feito clicando na
parte cinza do script antes da linha de comando, uma bola cinza aparecerá indicando que um ponto de
parada (breakpoint) foi colocado, quando o código for executado, o cursor parará nesse ponto e a bola
ficará vermelha.
: caso você esteja chamando uma rotina ou função dentro da rotina que está sendo executada,
esse botão entra no arquivo que está sendo chamado.
: esse botão executa o programa até o próximo breakpoint, ou, caso não exista outro, executa
o programa até o final.
OBSERVAÇÃO: caso sua rotina tenha entrado em um loop infinito, você pode “quebrar” a
execução da rotina na janela do Command Window através do comando CTRL C.
Os comandos para se trabalhar com arquivos são aqueles usados para carregar dados e salvar
esses dados em scripts, por exemplo, dado o código abaixo:
for j = 1:3,
for k = j:3
str = ['Zext' int2str(j) '_' int2str(k) '.m'];
fid(j,k) = fopen(str,'w');
if j==k
str = ['%% Imp. externa da fase ' int2str(j) ' \n clear x\n x = [\n'];
fprintf(fid(j,k),str);
else
str = ['%% Ze entre ' int2str(j) ' e ' int2str(k) ' \n clear x\n x = [\n'];
fprintf(fid(j,k),str);
end
end
end
No código acima, a variável str armazena o nome do arquivo, a função int2str converte um
número inteiro em texto (string), repare na extensão ‘.m’ no final do arquivo.
A matriz fid abre todos os arquivos a partir do comando fopen no modo de escrita ‘w’ (write). O
comando fprintf(fid(j,k),str) armazena em cada um dos arquivos o texto colocado dentro da variável do
tipo string str.
for j = 1:length(freq),
for k = 1:3
for m = k:3
z = i*2*pi*freq(j)*indut(k,m);
fprintf(fid(k,m), '%30.20f %30.20f\n',real(z),imag(z));
end
end
end
for j = 1:3
for k = j:3
fprintf(fid(j,k), ']; \n');
str = ['ze' int2str(j) '_' int2str(k) ' = x(:,1) + i*x(:,2);'];
fprintf(fid(j,k), str);
end
end
fclose('all');
No primeiro laço for observa-se que os valores de impedância são calculados para todos os
valores de frequência, e armazenados em cada um dos arquivos fid correspondente, repare que nesse
caso o comando fprintf trabalha da seguinte forma, primeiro é informado o arquivo onde será escrito os
valores, depois é informado o tipo de valor a ser inserido, como os cálculos retornam valores de ponto
flutuante (números com vírgula) é usado o recurso %f. Para que os dados sejam apresentados de forma
espaçada, coloca-se os valores %30.20f, onde terá um espaço de 30 caracteres para a parte inteira e 20
para a parte decimal (apenas para efeito visual da apresentação dos resultados). como foram inseridos
dois valores de %f, informa-se no final quais serão as variáveis que ocuparão esses espaços separadas
por vírgula.
%c Caractere
%s String (cadeia de caracteres)
%d Decimal
%f Ponto flutuante
%e Exponencial
%x Hexa minúsculo
%X Hexa maiúsculo
%o Octal
\b Backspace
\n Pula linha
\r Retorno de linha
\t Tab horizontal
\\ Barra invertida \
\” Aspas duplas
%% Porcentagem %
Por fim, o último laço escreve um ] no final do arquivo, define um nome para a função, e a
última linha fecha todos os arquivos abertos fclose(‘all’);.
Esses arquivos são chamados de scripts, pois não executam função alguma, apenas armazenam
os valores para serem usados por outras rotinas.
Existem inúmeras outras funções para leitura/escrita em arquivos. Essa apostila restringe-se
apenas a esse exemplo básico.
𝐴 = 𝑠𝑝𝑟𝑖𝑛𝑡𝑓(′𝑅𝑒𝑠𝑢𝑙𝑡𝑎𝑑𝑜: %𝑓 ′ , 𝑣𝑎𝑙𝑜𝑟)
𝐵 = 𝑠𝑠𝑐𝑎𝑛𝑓(𝑠𝑡𝑟𝑖𝑛𝑔, 𝑓𝑜𝑟𝑚𝑎𝑡𝑜)
Além de cálculo numérico, o MatLab também permite efetuar cálculo simbólico. Para esse
efeito, existe uma toolbox de matemática simbólica (“Symbolic Math Toolbox”).
Com esta toolbox podem-se efetuar cálculos de diferentes naturezas, designadamente: cálculo
propriamente dito (diferenciação, integração, determinação de limites, somatórios, série de Taylor, etc.);
álgebra linear (inversa de uma matriz, determinantes, valores próprios, etc.); simplificação de
expressões algébricas; obtenção de soluções analíticas de equações algébricas e diferenciais;
Transformadas de Laplace, Z e de Fourier, etc.
Para indicar ao MatLab que uma dada variável (ou expressão) deve ser encarada como objeto
simbólico usa-se o comando 𝑠𝑦𝑚.
>> a=sqrt(2)
a =
1.4142
>> b=sqrt(sym(2))
b =
2^(1/2)
Neste último caso, foi indicado ao MatLab que ele devia considerar o número 2 como uma
constante simbólica pelo que ele devolve o resultado sem efetuar qualquer cálculo numérico (b será
encarado em todos os cálculos posteriores como uma constante simbólica). Caso seja necessário, pode-
se a qualquer momento converter b para o valor numérico correspondente:
>> double(b)
ans =
1.4142
>> sym(2)/sym(3)+sym(1)/sym(5)
ans =
13/15
>> 2/3+1/5
ans =
0.8667
Frequentemente, temos necessidade de dizer ao MatLab que diversas variáveis devem ser
consideradas como simbólicas. Nesse caso, torna-se mais fácil e prático usar o comando 𝑠𝑦𝑚𝑠 em vez
de 𝑠𝑦𝑚. Como exemplo, vamos assumir que se pretende estudar a função quadrática f, dada pela
expressão 𝑎 ∗ 𝑥^2 + 𝑏 ∗ 𝑥 + 𝑐. Neste caso, devemos em primeiro lugar indicar ao MatLab que a, b, c e x
devem ser tratadas como variáveis simbólicas e só depois definir a função f:
>> syms a b c x
>> f=sym('a*x^2+b*x+c') % em alternativa pode-se fazer f=a*x^2+b*x+c
f =
a*x^2+b*x+c
Pode-se agora manipular f da forma desejada, tendo a garantia que o MatLab vai tratar todas
as variáveis como simbólicas.
SUBSTITUINDO VALORES
Uma vez definida f, pode-se agora criar uma nova função em que a sua expressão designatória
é igual à da função f após substituirmos a, b e c por 4, 5 e 8, respectivamente. Essa operação poderá ser
efetuada usando o comando subs:
>> g=subs(f,[a,b,c],[4,5,8])
g =
4*x^2+5*x+8
ENCONTRANDO A VARIÁVEL
O comando 𝑓𝑖𝑛𝑑𝑠𝑦𝑚 permite ver quais as variáveis simbólicas presentes numa dada expressão.
Por exemplo, em f existem 4 variáveis simbólicas mas em g existe apenas uma (x):
>> findsym(g)
ans =
x
RESOLVENDO EQUAÇÕES
O comando 𝑠𝑜𝑙𝑣𝑒 é bastante útil, pois permite resolver equações (ou sistemas de equações)
algébricas. Como exemplo, pretende-se achar as soluções da equação 𝑥^2 − 10 ∗ 𝑥 + 21 = 0. Pode-se
então fazer:
>> solve('x^2-10*x+21')
ans =
73
>> equacaosegundograu='a*x^2+b*x+c=0‘;
>> solve(equacaosegundograu)
ans =
1/2/a*(-b+(b^2-4*a*c)^(1/2))
1/2/a*(-b-(b^2-4*a*c)^(1/2))
>> B=solve(equacaosegundograu,'a=1','b=-3','x=10') % calcula o valor de c que
%fará com que a condição seja verdadeira
B =
a: [1x1 sym]
b: [1x1 sym]
c: [1x1 sym]
x: [1x1 sym]
>> B.c % vê qual o valor de c armazenado na estrutura B
ans =
-70
Podemos ver alguns dos resultados anteriores com um aspecto mais amigável usando o
comando pretty. Um exemplo:
>> h=solve(equacaosegundograu);
>> pretty(h)
DERIVADA
>> f=sym('3*x^3+4*x^2-5');
>> diff(f)
ans =
9*x^2+8*x
% ===== Código alternativo =========
>> syms x
>> f=3*x^3+4*x^2-5
f =
3*x^3+4*x^2-5
>> diff(f)
ans =
9*x^2+8*x
INTEGRAL
>> syms a b c x
>> h=a*x^2+b*x+c;
>> int(h,b) % calcula a primitiva de h considerando que b é a variável independente
ans =
a*x^2*b+1/2*b^2*x+c*b
>> f=sym(sin(x))
f =
sin(x)
>> int(f,0,pi)
ans =
2
SÉRIE DE TAYLOR
Pode-se ainda decompor uma dada função em série de Taylor (ou Maclaurin), usando o
comando taylor. Alguns exemplos:
>> syms x
>> g=exp(x*sin(x))
g =
exp(x*sin(x))
>> t=taylor(g,12,2); % decompõe g em série de Taylor, obtendo os 12 primeiros termos não
% nulos, em torno do ponto x=2.
>> syms x
>> f=1/(5+4*cos(x));
>> M=taylor(f,8) % obtém os termos da série de Maclaurin até (mas não incluindo) o de ordem
8
M =
1/9+2/81*x^2+5/1458*x^4+49/131220*x^6
EQUAÇÕES DIFERENCIAIS
Para resolver equações diferenciais de qualquer ordem, usa-se o comando 𝑑𝑠𝑜𝑙𝑣𝑒. Alguns
exemplos:
Nos exemplos anteriores, a letra ‘D’ indica ao MatLab que se trata da primeira derivada (por
padrão a variável independente é t). Colocando um número inteiro após D dá indicação ao MatLab de
uma derivada de ordem superior. Como exemplo, vamos admitir que se pretende resolver a equação
diferencial d(3)y/dx3=y, com as condições iniciais y(0)=1; y’(0)=-1; y’’(0)=pi. A solução desta equação
pode ser obtida da seguinte forma:
>> y=dsolve('D3y=y','y(0)=1','Dy(0)=-1','D2y(0)=pi','x')
y =
1/3*pi*exp(x)-1/3*(1+pi)*3^(1/2)*exp(-1/2*x)*sin(1/2*3^(1/2)*x)+(-
1/3*pi+1)*exp(-1/2*x)*cos(1/2*3^(1/2)*x)
FATORAÇÃO
Neste contexto, dois comandos muito úteis são 𝑒𝑥𝑝𝑎𝑛𝑑 e 𝑓𝑎𝑐𝑡𝑜𝑟. Alguns exemplos da sua
utilidade:
>> syms x
>> f=(x-3)^3+(x+1)^2-3
f =
(x-3)^3+(x+1)^2-3
>> expand(f)
ans =
x^3-8*x^2+29*x-29
>> factor(x^3+x^2-21*x-45)
ans =
(x-5)*(x+3)^2
symintro : Introdução
symcalcdemo : Cálculo
Nesse capítulo trabalharemos com a criação de funções usando os recursos aprendidos nos
capítulos anteriores.
OBSERVAÇÃO IMPORTANTE: ao criar uma função, o nome do arquivo deverá ter o mesmo
nome da função.
Uma função nada mais é do que uma rotina com a entrada de parâmetros e retorno de uma
resposta. Por exemplo, vamos fazer a função média, como segue no exemplo abaixo:
media.m
function m = media(n)
soma=0;
for i=1:length(n)
soma=n(i)+soma;
end
m=soma/length(n);
O exemplo que será usado é o método da seção áurea para a definição do ponto de mínimo de
uma função, dado seu intervalo. O objetivo desse exemplo não é a explicação do método e sim a
explicação das funções do MatLab que estarão sendo usadas. A descrição das funções será feita abaixo.
Repare que em uma função, não se trabalha com o comandos de limpar as variáveis como na
inicialização de uma rotina, (clear all). Salve esse arquivo com o nome de aurea.m.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Método da Seção Aurea %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%aurea(fun, intervalo, l)
%fun = função (colocar entre aspas simples e em termos de x)
%intervalo = [a b], onde a é o início e b é o final do intervalo
%l é o intervalo máximo de tolerância permitido
%Fecha tudo
close all;
%Intervalo
ak = intervalo(1);
bk = intervalo(2);
int = bk-ak;
%Verificação de erros
if bk <= ak
disp('Erro: b deve ser maior do que a')
end
if(l <= 0)
disp('Erro: l deve ser positivo')
end
%Fator de convergencia
alpha = 0.618;
%Valores de lambda e mi
lambda = ak+(1-alpha)*int;
mi = ak + alpha*int;
%Contador k
k=1;
while int>=l
%Encontra o valor de f(lambda) | A função subs, substitui a funça f,
em
%termos de x pelo valor desejado
f_lambda = feval(f,lambda);
f_mi = feval(f,mi);
%Caso f(lambda)>f(mi)
if f_lambda>f_mi
ak=lambda;
lambda=mi;
int=bk-ak;
mi=ak+alpha*int;
else
bk=mi;
mi=lambda;
int=bk-ak;
lambda=ak+(1-alpha)*int;
end
k=k+1;
end
O comando 𝑖𝑛𝑙𝑖𝑛𝑒 converte uma string (texto) em uma função que poderá ser analisada pelo
MatLab, essa função poderá ser derivada, integrada, entre outros procedimentos que podem ser
executados com análise de funções.
Como já visto o comando 𝑓𝑝𝑟𝑖𝑛𝑡𝑓 imprime, nesse caso, na tela os dados mostrados entre aspas
simples, apenas para que o usuário verifique as iterações que o programa executa.
Verifique no laço 𝑤ℎ𝑖𝑙𝑒 o programa será executado até o momento em que o intervalo for maior
que o valor definido para o erro na diferença do intervalo.
O comando 𝑓𝑒𝑣𝑎𝑙 é responsável por resolver a função para determinado valor, como mostrado
no código acima, deve-se definir qual é a função e qual o valor que a mesma receberá para que ele faça
as devidas substituições.
A estrutura de decisão serve para analisar qual será o valor que deverá ser alterado. Todos as
iterações serão apresentadas ao usuário por causa do comando 𝑓𝑝𝑟𝑖𝑛𝑡𝑓.
Por fim, o programa também terá armazenado o intervalo onde se encontra o ponto de mínimo,
e esse valor será mostrado na tela com o uso da ferramenta 𝑓𝑝𝑟𝑖𝑛𝑡𝑓.
Como exercício, sugere-se que você pratique buscando outras modelagens para a definição do
ponto de mínimo de uma função, como, por exemplo, o método da bisseção ou método de Newton.
Colocarei mais um exemplo para que se entenda como usar os procedimentos de função
considerando mais de uma variável. O método apresentado a seguir, é baseado no Método de Newton
Modificado.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Método de Newton %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%fun é a função (deve ser escrita entre aspas simples
%xi é o valor inicial para x, [x1;x2]
%l é o intervalo de tolerância máximo permitido
function f = newton_modificado(fun,xi,l)
%Limpa a tela
clc;
%Fecha tudo
close all;
%Definição da função
f = inline(fun);
f_x = feval(f, xk(1), xk(2));
%Gradiente
G = [diff(fun,'x1');diff(fun,'x2')];
G = inline(G);
G_x = feval(G, xk(1), xk(2));
%norma do gradiente
norma_G = norm(G_x);
%Hessiana
f11 = diff(fun,'x1',2);
f12 = diff(diff(fun,'x1'),'x2');
f21 = diff(diff(fun,'x2'),'x1');
f22 = diff(fun,'x2',2);
dk = -(G_x/norma_G);
k = 1;
syms alphak
if metodo==1
alpha_k = aurea(f_x,[ak bk],e,0);
end
if metodo==2
alpha_k = bissecao(f_x,[ak bk],e,0);
end
if metodo==3
alpha_k = newton(f_x,1,e,0);
end
%Atualiza xk
xk = xk + alpha_k*dk;
%Gradiente
G_x = feval(G, xk(1), xk(2));
%norma
norma_G = norm(G_x);
dk = -(G_x/norma_G);
if k==kmax
break
end
k = k+1;
end
fprintf('\n')
disp('MÉTODO DE NEWTON')
k = k-1;
while norma_G > l
k = k+1;
%Função
f_x = feval(f, xk(1), xk(2));
%Gradiente
G_x = feval(G, xk(1), xk(2));
%norma do gradiente
norma_G = norm(G_x);
%Hessiana
H_x = feval(H,xk(1));
inv_H = inv(H_x);
F = -inv_H*G_x;
xk = xk + F;
end
9. GRÁFICOS
Chegamos ao capítulo de gráficos, esse capítulo tratará com muitos detalhes o gerenciamento
de gráficos, portanto, se ficar um pouco extenso, deixo a você a continuação da leitura dele em casa.
O primeiro comando para a criação de um gráfico é o 𝑝𝑙𝑜𝑡, esse é o mais simples de todos e
provavelmente todos já estão acostumados a trabalhar com ele.
Você pode plotar tanto uma função com o comando 𝑝𝑙𝑜𝑡(𝑓) ou pode definir a variação no eixo
𝑥 para essa função 𝑝𝑙𝑜𝑡(𝑥, 𝑓).
Outra forma de se trabalhar com o recurso de gráficos, é plotar várias funções em um mesmo
gráfico, isso pode ser feito de algumas formas. A mais simples é colocar tudo na mesma linha, como
segue no exemplo abaixo:
Outra forma de colocar todas essas funções no mesmo gráfico, é criar um vetor e armazenar
todas as funções, como no exemplo abaixo:
𝑝𝑙𝑜𝑡(𝑥, 𝑓𝑢𝑛𝑐𝑎𝑜)
Outra forma ainda de se plotar várias funções em um mesmo gráfico é usar o comando ℎ𝑜𝑙𝑑,
como segue no exemplo abaixo.
𝑝𝑙𝑜𝑡(𝑥, 𝑓1)
ℎ𝑜𝑙𝑑
𝑝𝑙𝑜𝑡(𝑥, 𝑓2)
A mudança dos atributos (cor, espessura, tipo da linha) também pode ser realizadas por meio
do comando 𝑝𝑙𝑜𝑡.
𝑝𝑙𝑜𝑡(𝑥, 𝑦, 𝑠)
O uso desses recursos permite automatizar a produção de um gráfico por meio de um código.
Outros recursos que também podem ser usados são:
Caso você queira colocar dois gráficos na mesma janela ocupando telas diferentes, pode-se usar
o comando 𝑠𝑢𝑏𝑝𝑙𝑜𝑡. Ele funciona como uma matriz, onde define-se o tamanho 𝑛𝑥𝑚 e a posição que
deseja-se colocar. Exemplo:
subplot(2,1,1)
subplot(212)
Repare que no exemplo anterior, tanto faz, o uso ou não de vírgulas.
Todos os comandos podem ser alterados também de forma simples, usando o recurso de
𝑝𝑙𝑜𝑡𝑡𝑜𝑜𝑙𝑠. Esse recurso é acessado na janela do gráfico no último botão da caixa de ferramentas ( ).
60
0pr1/0
50 0pr1/pr1
DIFERENÇA RELATIVA (%)
40
30
20
10
0
1 2 3 4 5 6 7 8
10 10 10 10 10 10 10 10
FREQUÊNCIA [Hz]
Esse recurso permite definir o uso do título e dos rótulos, para isso clique no gráfico (na parte
branca), e observe as propriedades que aparecem abaixo:
Tem-se as opções:
Axis está relacionado com eixo, portanto, tem-se X Axis, Y Axis e Z Axis, basicamente define-se
o rótulo do eixo na propriedade Label, pode-se definir também o intervalo do eixo, caso queira voltar
ao normal, pode deixar marcada a propriedade Auto.
A escala dos eixos pode ser linear ou logarítmica, caso você queira plotar um gráfico direto na
escala logarítmica, deverá usar as seguintes funções:
Ao definir-se o eixo dos títulos você poderá alterar a fonte, selecione o texto desejado e altere a
fonte, tamanho e estilo (negrito, itálico).
OBSERVAÇÃO: Caso a barra de propriedades não esteja aparecendo você poderá consultar o
menu View.
O painel Figure Palette permite que o usuário defina comandos de 𝑠𝑢𝑏𝑝𝑙𝑜𝑡, verifique quais as
variáveis presentes no gráfico e também use recursos gráficos para inserir no texto.
Basicamente, nesse painel, a opção interessante é o Text Box, escolha essa opção, clique na tela
na posição desejada, digite o texto desejado. Caso você queira colocar um texto do alfabeto grego, use o
comando com “\”. Ex.: \alpha, \beta, \epsilon, …. Basicamente, use a formatação LaTex, ou seja, para
sobrescrito use (^), subscrito (_). Esse texto, também possui propriedades de fonte, e você poderá
remover a caixa que fica em volta dele por meio da barra de propriedades.
Para colocar a legenda no gráfico, basta clicar com o botão direito do mouse na parte branca do
gráfico e escolher a opção Show Legend, a legenda pode ser editada dando duplo clique sobre o texto
que apareceu.
plotyy: permite criar duas curvas no mesmo gráfico com escalas Y diferentes. Ex.:
𝑥 = 0: 0.1: 10;
𝑠𝑢𝑏𝑝𝑙𝑜𝑡(1,2,1)
𝑝𝑙𝑜𝑡(𝑥, sin(𝑥) , 𝑥, exp(𝑥))
𝑠𝑢𝑏𝑝𝑙𝑜𝑡(122)
𝑝𝑙𝑜𝑡𝑦𝑦(𝑥, sin(𝑥) , 𝑥, exp(𝑥))
EIXOS
𝑎𝑥𝑖𝑠([𝑋𝑚𝑖𝑛𝑋𝑚𝑎𝑥𝑌𝑚𝑖𝑛𝑌𝑚𝑎𝑥])
𝑔𝑟𝑖𝑑: determina se o gráfico terá ou não uma grade, pode-se usar junto à on ou off. Caso não
seja especificado ele colocará a grade ou removerá dependendo do modo que esteja setado. O padrão é
a grade no modo off.
𝑔𝑟𝑖𝑑(′𝑜𝑛′ )
𝑏𝑜𝑥: por padrão existe uma caixa que fica em volta do gráfico, e ela irá aparecer, caso deseje
apagar essa caixa, basta usar o comando 𝑏𝑜𝑥.
𝑎𝑥𝑒𝑠(′𝑝𝑜𝑠𝑖ç𝑎𝑜′ , [𝑋𝑖𝑛𝑖𝑐𝑌𝑖𝑛𝑖𝑐𝑖𝐷𝑥𝐷𝑦])
EXPORTANDO GRÁFICOS
Para exportar gráficos, pode-se usar o comando de impressão 𝑝𝑟𝑖𝑛𝑡. Este comando irá imprimir
o gráfico para um arquivo de imagem.
Dispositivo é o tipo de saída, existem vários dispositivos, consulte o help, usaremos aqui o
comando –djpeg.
Opções está relacionada com as opções de impressão, nesse caso usaremos –r300, relacionado à
resolução de 300dpi.
HANDLE
Esse meio de trabalho é muito usado em programação orientada à objeto e está relacionada com
o acesso das propriedades de cada item em um gráfico. É um pouco complicada a utilização deles, mas
explicarei algumas formas de acesso a eles aqui.
ℎ𝑓 = 𝑓𝑖𝑔𝑢𝑟𝑒(1)
a variável ℎ𝑓 armazena o ℎ𝑎𝑛𝑑𝑙𝑒 da janela figura 1. Vamos criar dois eixos na figura.
para colocar gráficos em cada um dos eixos, basta setar o eixo corrente. Exemplo:
𝑎𝑥𝑒𝑠(ℎ𝑎1)
𝑥 = −2 ∗ 𝑝𝑖: 0.1: 2 ∗ 𝑝𝑖;
𝑝𝑙𝑜𝑡(𝑥, sin(𝑥))
𝑎𝑥𝑒𝑠(ℎ𝑎2)
[𝑎𝑚] = 𝑖𝑚𝑟𝑒𝑎𝑑(′𝑖𝑚𝑎𝑔𝑒𝑚. 𝑏𝑚𝑝′ );
𝑖𝑚𝑎𝑔𝑒(𝑎)
Repare que no segundo exemplo, deve existir uma imagem dentro da pasta. A seguir vamos
verificar outros exemplos de acesso ao ℎ𝑎𝑛𝑑𝑙𝑒.
graficos_handle.m
function graficos_handle ( )
hf1=figure(1);
ha=axes(‘Position’,[0.1 0.1 0.8 0.8]);
axis([0 10 0 10]);
%cria um retângulo
hr=rectangle(‘Position’,[6 1 3 2]);
%cria textos
ht1=text(1.5,3.5,’Line’);
ht2=text(7,1.5,’Rectangle’);
ht3=text(2,9.5,’Patch’);
As propriedades dos objetos podem ser alteradas após a criação deles usando as funções abaixo:
Exemplos:
x=-2*pi:0.1:2*pi;
plot(x,sin(x))
h=findobj(‘Type’,’line’) %obtem handle da curva
c=get(h,’linestyle’) %obtem tipo de estilo de linha
set(h,’linestyle’,’.’)%configura o novo estilo de linha
grafico_ex.m
function grafico_ex ( )
x=-2:0.2:2;
y=-5:0.2:5;
[X,Y]=meshgrid(x,y);
Z=exp(sin(X)).*cos(Y);
surf(Z)
light(‘Position’,[0 0 2]); %cria luz nessa posição
h = gca;
set(h,’cameraposition’,[100 300 30]); %reposiciona a câmera
tempo=1:12;
chuva=[3 4 8 5 7 4 3 8 5 7 6 2];
plot(tempo,chuva)
ha=gca;
meses = {'Jan' 'Fev' 'Mar' 'Abr' 'Mai' 'Jun' 'Jul' 'Ago' 'Set' 'Out' 'Nov' 'Dez'};
set(ha,’Xtick’,tempo);
set(ha,’XtickLabel’,meses);
shg %mostra a figura
ang=0:0.5:2*pi;
raio = linspace(0,2,13);
subplot(131)
polar(ang,raio)
title(‘POLAR’)
subplot(132)
[x,y]=pol2cart(ang,raio);
compass(x,y);
title(‘COMPASS’)
subplot(133)
feather(x,y)
title(‘FEATHER’)
Pode-se usar ainda os commandos 𝑒𝑧𝑝𝑙𝑜𝑡 para graficar funções no plano cartesiano e, também,
𝑒𝑧𝑝𝑜𝑙𝑎𝑟 para o plano polar.
subplot(231)
ezplot('x*cos(x)')
subplot(232)
ezplot('1/exp(x)')
subplot(233)
ezplot('x^2-2*x+1-10*sin(x)')
subplot(234)
ezpolar('cos(t)')
subplot(235)
ezpolar('sin(t)+cos(t)')
subplot(236)
ezpolar('t*(sin(t)+cos(t))')
GRÁFICOS 3D
𝑚𝑒𝑠ℎ𝑔𝑟𝑖𝑑: dados dois vetores, x e y, contendo as coordenadas dos eixos X e Y, retorna duas
matrizes, MX e MY, contendo a malha de coordenadas necessária para a geração de superfícies.
Outros comandos:
Para plotar gráficos 3D com o uso de funções basta acrescentar 𝑒𝑧 antes dos comandos.
Muito bem, já vimos em capítulos anteriores que podemos pedir para que o usuário digite um
valor por meio da função 𝑖𝑛𝑝𝑢𝑡. Veremos nesse capítulo como criar outras formas de iteração com o
usuário.
Uma forma de verificar se o usuário entrou com algum dado é usar a função 𝑖𝑠𝑒𝑚𝑝𝑡𝑦(𝑣𝑎𝑟).
CAIXA DE DIÁLOGO
msg={‘Largura:’ ‘Altura:’};
titulo=’Dimensões do Retângulo`;
numlinhas=[1 2]’;
valpredef={‘500’ ‘100’};
dados=inputdlg(msg,titulo,numlinhas,valpredef);
𝑎𝑥𝑙𝑖𝑚𝑑𝑙𝑔(′𝐷𝑒𝑓𝑖𝑛𝑎𝑜𝑠𝑒𝑖𝑥𝑜𝑠 ′ )
LISTAS
>>prompt=’mapeamento de cores’;
>>lista={‘autumn’ ‘bone’ ‘cool’ ‘default’};
>>[Ind,ok]=listdlg(‘promptstring’,prompt,’liststring’,lista);
‘SelectMode’: ‘multiple’/’single’
𝑝𝑎𝑔𝑒𝑑𝑙𝑔: Exibe uma caixa de diálogo de posicionamento de página para figura correspondente
ao handle fornecido.
𝑝𝑎𝑔𝑒𝑑𝑙𝑔(𝑔𝑐𝑓)
ARQUIVOS
>>tipo={‘*.mat’;’*.fig’};
>>titulo=’grava arquivo’;
>>[nome,caminho]=uiputfile(tipo,titulo);
𝑢𝑖𝑠𝑎𝑣𝑒: caixa de dialogo que permite armazenar um arquivo. Equivale a opção Save Workspace.
>>f=uisetfont(gca,’Fonte de texto’)
𝑢𝑖𝑖𝑚𝑝𝑜𝑟𝑡: caixa de diálogo para importar dados. Equivale a opção Import Date.
function interface01 ( )
h = waitbar(0,’Em execução, por favor, aguarde...’);
for i=1:50
waitbar(i/50,h);
z=rand(10);
contour(z);
end
close(h)
11. TRANSFORMADAS
Esse capítulo trata das transformadas de Laplace, Z e Fourier, poderia ter sido inserido junto ao
capítulo de Símbolos, porém, preferi colocá-lo a parte. O objetivo desse capítulo é apenas mostrar o uso
das transformadas e não explicar a parte de cálculo das mesmas.
TRANSFORMADA DE LAPLACE
>>l=laplace(sin(t))
>>pretty(l)
>>l=ilaplace(1/(t^2+1))
>> f=5*exp(-5*t)
f =
5*exp(-5*t)
>> laplace(f) % calcula a Transformada de Laplace de f
ans =
5/(s+5)
>> g=t^2+5*t-6;
>> laplace(g) % calcula a Transformada de Laplace de g
ans =
2/s^3+5/s^2-6/s
>> syms s
>> ilaplace(1/sqrt(s)) % calcula a Transformada de Laplace Inversa
ans =
1/(pi*t)^(1/2)
>> h=(2*s+2)/(s^2+7*s+12) % define h
h =
(2*s+2)/(s^2+7*s+12)
>> ilaplace(h) % calcula a Transformada de Laplace Inversa de h(s)
ans =
-4*exp(-3*t)+6*exp(-4*t)
TRANSFORMADA DE FOURIER
>>f=fourier(exp(-x^2),x,t)
>>pretty(f)
>>f1=ifourier(exp(-x^2),x,t)
>>pretty(f1)
>> syms x
>> f=exp(-x^2)
f =
exp(-x^2)
>> fourier(f)
ans =
pi^(1/2)*exp(-1/4*w^2)
>> h=x*exp(-abs(x))
h =
x*exp(-abs(x))
>> fourier(h)
ans =
-4*i/(1+w^2)^2*w
TRANSFORMADA Z
𝑍[𝑓] = ∑ 𝑓(𝑛)𝑧 −𝑛
𝑛=0
>> syms n
>> f=n^4
f =
n^4
>> sol=ztrans(f)
sol =
z*(z^3+11*z^2+11*z+1)/(z-1)^5
>> pretty(sol)
>>ztrans(t^2)
>>z1=iztrans((1+z)/(z-1)^3)
Esse capítulo abordará algumas funções para se trabalhar com o uso de ferramentas para
controle analógico e digital, não será um aprofundamento sobre a matéria, mas apenas alguns recursos
que poderão servir para conhecimento da área.
As funções abordadas aqui são muito simples e exigem apenas o conhecimento da transformada
de Laplace e Z.
FUNÇÃO DE TRANSFERÊNCIA
1
𝐹(𝑠) =
𝑠+1
Tem-se que 𝑛 = [1], e 𝑑 = [11]. Portanto, para a montagem da função usa-se o comando 𝑡𝑓
(transfer function).
𝑣𝑎𝑟 = 𝑡𝑓(𝑛, 𝑑)
A seguir, pode-se aplicar algumas funções básicas para o estudo do comportamento da função
de transferência.
𝑠𝑡𝑒𝑝(𝑣𝑎𝑟)
𝑖𝑚𝑝𝑢𝑙𝑠𝑒(𝑣𝑎𝑟)
𝑐2𝑑(𝑠𝑦𝑠, 𝑡𝑑, 𝑚𝑒𝑡𝑜𝑑𝑜): converte uma função do domínio contínuo para o domínio discreto.
Esse capítulo abordará algumas funções que considerei interessantes para serem discutidas:
𝑣𝑝𝑎(𝑉, 𝑑): valor numérico de cada elemento fornecido utilizando a precisão numérica solicitada.
𝑣𝑝𝑎(𝑝𝑖, 3)
𝑣𝑝𝑎(𝑝𝑖, 20)
𝑚3 = 𝑣𝑝𝑎(𝑖𝑛𝑣([12; 57], 2)
𝑚𝑛 = 𝑑𝑜𝑢𝑏𝑙𝑒(𝑚3)
𝑤ℎ𝑜𝑚3𝑚𝑛
ARREDONDAMENTO
TRANSFORMAÇÃO DE COORDENADAS
𝑏𝑎𝑠𝑒2𝑑𝑒𝑐(6,4)
ANÁLISE MATRICIAL
14. SIMULINK
Simulink é uma ferramenta do MatLab responsável pela simulação a partir do uso de blocos, é
uma ferramenta muito simples, prática e útil. A seguir veremos algumas formas de se trabalhar com
ele. Primeiramente, para acessar o programa, digite “simulink” (sem aspas) no Command Window.
O bloco Constante (Constant) produz um sinal uniforme. A magnitude pode ser escolhida
com um duplo clique sobre o bloco.
O bloco Degrau (Step) produz uma função degrau. Pode-se configurar o instante em que se
aplica o degrau, assim como sua magnitude antes e depois da transição.
O bloco de Onda Senoidal (Sine Wave) gera uma senóide com os seguintes parâmetros a
serem configurados: amplitude, fase e frequência da onda senoidal.
O Gerador de Sinais (Signal Generator) pode produzir ondas senoidais, quadradas, dente de
serra ou sinais aleatórios.
DIAGRAMA DE BLOCOS
BLOCOS DE SAÍDA
Scope: O osciloscópio produz gráficos a partir de dados do modelo. Não existem parâmetros a
serem configurados.
Display: O bloco Display produz uma amostragem digital do valor de sua entrada.
To File: Pode-se ainda armazenar os dados em arquivos doMATLAB para usos posteriores.
Deve-se definir o nome do arquivo a ser criado.
To Workspace: Pode-se ainda enviar os dados para a área de trabalho do MATLAB utilizando
o bloco To Workspace Block. Deve-se definir o nome da matriz.
Stop Simulation: O bloco de parada (Stop Simulation) causa a parada da simulação quando a
sua entrada for diferente de zero.
EXEMPLOS
CONTROLE
No Simulink, nos blocos de Continuos existem comandos que serão usados para representar o
controle contínuo. Inicialmente, vamos fazer alguns exemplos simples.
Sem Retroalimentação
Com Retroalimentação
FIM
Ahhhhhh … que pena!!! Chegamos ao final do nosso estudo sobre recursos avançados do
MatLab. Espero que todos tenham gostado do curso, caso tenha dúvidas podem entrar em contato por
e-mail: rcmonzani@gmail.com.