• O que é o MATLAB?
Actualizado em 03-10-03 1
• Utilizando o MATLAB
Actualizado em 03-10-03 2
Não se devem dar aos M-files criados pelo utilizador nomes de
M-files do MATLAB pois incorre-se no grave risco de vir a
existir um conflito.
>> (6+8)/(4+3)
>> 6+8/(4+3)
>> 6+8/4+3
>> 9+(6*2)/(3*4)
>>9+6*2/(3*4)
>> 9+6*2/3*4
• Nomes de variáveis
Actualizado em 03-10-03 3
>> x=7.231
>> y1=x+1/x
>> y2=x-1/x
>> dif = y12 − y 2 2
• O comando clear
• Comentários
• Supressão de output ;
Actualizado em 03-10-03 4
• Mais do que uma instrução por linha ,
R: m = 0.6000, b = 2.2000.
R: x0 = -3.6667.
Actualizado em 03-10-03 5
• Parar um procedimento
• Criação de M-files
clear all
x1=3, y1=4, x2=8, y2=7
Actualizado em 03-10-03 6
% m - declive da recta que une os dois pontos: y=mx+b
m=(y2-y1)/(x2-x1)
% ordenada na origem – b
b=y1-m*x1
x0=-b/m
clear all
a=1; b=-3; c=2;
rdelta=sqrt(b^2-4*a*c)
x1=(-b-rdelta)/(2*a)
x2=(-b+rdelta)/(2*a)
Actualizado em 03-10-03 7
Terá que dar valores aos parâmetros a,b,c, mas como ainda não
sabe fazer input pelo teclado, terá que os colocar no próprio
programa.
Para alterar um M-File já criado basta abrir o Menu File -> Open ->
<nome do M-file> ou duplo click sobre o nome do ficheiro no
"Current Directory".
Actualizado em 03-10-03 8
clear all
a=1; b=-3; c=2;
rdelta=sqrt(b^2-4*a*c);
x1=(-b-rdelta)/(2*a);
x2=(-b+rdelta)/(2*a);
fprintf(' Raizes do polinómio %5.2f x^2 + %5.2f
x+%5.2f \n',a,b,c)
fprintf(' x1= %5.2f + %5.2f i \n',real(x1), imag(x1))
fprintf(' x2= %5.2f + %5.2f i \n',real(x2), imag(x2))
x=[2 3 4 5]
ou y=[2,3,4,5]
Actualizado em 03-10-03 9
2º Se os elementos do array forem valores igualmente
espaçados, usa-se a notação seguinte:
z1=[-3:2:20]
z2=2.5+1.5*[0:0.04:1]
w=linspace(2.5,4.0,10)
R: Columns 1 through 8
2.5000 2.6667 2.8333 3.0000 3.1667 3.3333 3.5000
3.6667
Columns 9 through 10
3.8333 4.0000
x1=[x z1]
A=rand(1,9)
Actualizado em 03-10-03 10
Se quisermos operar sobre um determinado elemento do vector, por
exemplo o 5º, fazemos o seguinte:
y1=2*A(5)
clear all
x=[0:pi/6:pi]
y=sin(x)
z1=1-2*y.^2 %Calcula o quadrado de cada componente
z2=cos(2*x)
z=z1./z2 %Divide os vectores componente a componente
R:
x = 0 0.5236 1.0472 1.5708 2.0944 2.6180 3.1416
y = 0 0.5000 0.8660 1.0000 0.8660 0.5000 0.0000
z1 = 1.0000 0.5000 -0.5000 -1.0000 -0.5000 0.5000
1.0000
z2 = 1.0000 0.5000 -0.5000 -1.0000 -0.5000 0.5000
1.0000
z = 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000
1.0000
Actualizado em 03-10-03 11
Porque é que os elementos de z são todos iguais a 1?
sin x sin x
2) Verifique que lim = 1 , calculando para x=0.1,
x →0 x x
0.01, ..., 0.00000001.
clear all
format long
x=0.1.^[1:8]
y=sin(x)./x
R:
0.99833416646828 0.99998333341667 0.99999983333334
0.99999999833333 0.99999999998333 0.99999999999983
1.00000000000000.
clear all
x=linspace(0,2*pi,11);
y=sin(x);
plot(x,y)
Actualizado em 03-10-03 12
R:
clear all
t=linspace(0,4*pi,201);
y1=cos(t); y2=cos(2*t); y3=y1+y2; y4=y1-y2;
plot(t,y1,t,y2,t,y3,t,y4)
Actualizado em 03-10-03 13
R:
clear all
t=linspace(0,4*pi,201);
y1=cos(t); y2=cos(2*t); y3=y1+y2; y4=y1-y2;
axis([0 4*pi –2 2]) % Define os limites dos eixos
hold on %Não desenha logo o gráfico. Espera até definirmos...
%tudo o que pretendermos.Quando encontra hold off
desenha
plot(t,y1,'b –',t,y2,'g:',t,y3,'r',t,y4,'s') %Desenha linhas,
... %cores e padrões b-blue,g-green,r-red,s-desenha ...
%quadrados, k-preto.
legend('y1=cost','y2=cos(3t)','y3=y1+y2','y4=y1-y2')
xlabel('x')
ylabel('y')
title('Oscilação')
plot([0 4*pi],[0,0],'k') % desenha o eixo a preto
hold off
Actualizado em 03-10-03 14
xe x
6) Faça o gráfico da seguinte função y = para
x 2 − π2
− 3 ≤ x ≤ 2 , com passo 0.02.
R:
clear all
t=[-3:0.02:2];
y=t.*exp(t)./(t.^2-pi^2)
% axis([3 2 -3 3]) % Define os limites dos eixos
hold on % Evita que apareçam janelas intermédias com o graf
plot(t,y)
xlabel('x')
ylabel('y')
title('y=xexp(x)/(x^2-pi^2)')
%plot([-3 2],[0,0],'k')
hold off
Actualizado em 03-10-03 15
7) Faça o gráfico de y = sin 9 x + sin 10.5x + sin 12x para
− π ≤ x ≤ π , usando 601 pontos.
clear all
t=linspace(-pi,pi,601);
y1=cos(9*t); y2=cos(10.5*t); y3=sin(12*t); y4=y1+y2+y3;
axis([-1.5*pi 1.5*pi -3 3]) % Define os limites dos eixos
hold on % Evita que apareçam janelas intermédias com o graf
plot(t,y4,'b -')
xlabel('x')
ylabel('y')
title('y=sin(9x)+sin(10.5x)+sin(12x)')
plot([-pi pi],[0,0],'k')
hold off
R:
clear all
axis([0 4 0 4]), axis square
Actualizado em 03-10-03 16
hold on
x1=linspace(0,2,101);
y1=x1.^2;
plot(x1,y1,'g:')
x2=linspace(0,4,101);
y2=sqrt(x2);
plot(x2,y2,'r:')
plot([0 4],[0,4],'k:') %linha tracejada preta y=x de (0,0) a (4,4)
text(1.5,3.5,'y=x^2')
text(3.1,1.7,'y=sqrt(x)')
text(3.3,3.1,'y=x')
grid on
title('Funçao e sua inversa - reflexao')
hold off
Actualizado em 03-10-03 17
9) Faça o gráfico de y = 10e −t sin t , para 0 ≤ t ≤ 2π , dê-lhe o
nome de expozoom e utilize o zoom in para achar o seu máximo.
R: Aprox. 3.22
• Ciclos for
20 1
1) Suponha que pretende calcular ∑ , usando um ciclo for.
n 2
n =1
Então poderá usar o seguinte programa, a que poderá dar o nome
loop1:
clear all
s=0;
for n=1:1:20
s=s+1/n^2;
end
sum=s
R: sum = 1.5962
Actualizado em 03-10-03 18
• Ciclos while
clear all
format long %Escreve os números com mais casas decimais
s=0;
s1=0;
s2=1000;
n=0;
while (abs(s2-s1))>=0.00000005
n=n+1;
s=s+1/n^2;
s1=s2;
s2=s;
end
niter=n
sum=s2
erro=abs(s2-s1)
R: niter = 4473
sum = 1.64471052823287
Actualizado em 03-10-03 19
• if-else-end e if-elseif-else-end
ou
if expressão
comandos ...
else
comandos ...
end
ou
if expressão 1
comandos ...
elseif expressão 2
comandos
else
comandos
end
R:
clear all
despesa=100
if despesa>200
despesa=despesa*(1-0.1);
elseif despesa>100
despesa=despesa*(1-0.05);
else
despesa=despesa*(1-0.01);
Actualizado em 03-10-03 20
end
format bank %Utiliza 2 decimais
paga=despesa
5) Suponha agora que tem sempre muitos clientes e que quer ter o
programa sempre a postos para a introdução de uma despesa
diferente de zero (se for zero o programa termina).
R:
clear all
despesa=input(' Valor da despesa: ')
while despesa~=0
if despesa>200
despesa=despesa*(1-0.1);
elseif despesa>100
despesa=despesa*(1-0.05);
else
Actualizado em 03-10-03 21
despesa=despesa*(1-0.01);
end
format bank %Utiliza 2 decimais
paga=despesa
despesa=input(' Valor da despesa (para terminar 0): ')
end
R:
clear all
x=59650
for m=1:sqrt(x)
n=sqrt(x-m^2)
if n==round(n)
numeros=[m,n]
end
end
x = 59650.00
Numeros: m^2+n^2=x
59 237
95 225
123 211
211 123
225 95
237 59
Actualizado em 03-10-03 22
Aqui vai uma sugestão de alteração do programa decompos:
clear all
npar=0 % contador de pares m,n
x=input(' Número a decompor como m^2+n^2 : ')
fprintf(' Numeros: m^2+n^2=x \n')
for m=1:sqrt(x)
n=sqrt(x-m^2);
if n==round(n)
npar=npar+1
fprintf(' %5.0f %5.0f \n',m,n)
if m^2+n^2 ~=x
fprintf(' m^2+n^2 = %5.0f \n',m^2+n^2)
end
end
end
if npar==0
fprintf(' NAO FOI ENCONTRADO O PAR PRETENDIDO \n')
end
R: x = 59650.00
Numeros: m^2+n^2=x
59 237
95 225
123 211
211 123
225 95
237 59
• Function M-files
Actualizado em 03-10-03 23
algumas funções é bastante complexa, pelo que o melhor é criá-la à
parte.
No MATLAB as M-functions são compiladas em vez de simplesmente
interpretadas, o que torna a sua execução mais rápida.
x − cos (x )
1) Construa a seguinte função: fun1(x ) =
2+x2
Actualizado em 03-10-03 24
2) Construa agora um programa para desenhar esta função e
chame-lhe plfun1.
clear all
fplot(@fun1,[-10,10])
hold on
plot([-10 10],[0 0], 'k')
hold off
x_intersec=fzero(@fun1,[0 1])
[xmin,ymin]=fminbnd(@fun1,-3,3)
• Polinómios
Actualizado em 03-10-03 25
1) Considere o seguinte polinómio:
p (x ) = 3 x 5 − 4 x 4 + 7 x 2 − 9 x + 3
Calcule as derivadas de p e de q.
Multiplique p por q.
clear all
p=[3 -4 0 7 -9 3], q=[4 5 -6], qp=[0 0 0 4 5 -6]
newp=p+2*qp
praizes=roots(p)
qraizes=roots(q)
p1=poly(praizes)
q1=poly(qraizes)
y=polyval(p,2.31)
pderiv=polyder(p)
Actualizado em 03-10-03 26
qderiv=polyder(q)
pq=conv(p,q)
[quoc,resto]=deconv(p,q)
hold on
x=linspace(-1.7,2,300);
grid on
plot(x,polyval(p,x))
hold off
R:
newp =
Columns 1 through 6
3.00 -4.00 0 15.00 1.00 -9.00
praizes =
-1.37
0.58
0.58
1.00
0.53
qraizes =
-2.00
0.75
p1 =
Columns 1 through 6
1.00 -1.33 -0.00 2.33 -3.00 1.00
q1 =
1.00 1.25 -1.50
y=
102.99
pderiv =
15.00 -16.00 0 14.00 -9.00
qderiv =
8.00 5.00
Actualizado em 03-10-03 27
pq =
Columns 1 through 8
quoc =
0.75 -1.94 3.55 -5.59
resto =
Columns 1 through 5
0 0 0 0 40.23 -30.54
Actualizado em 03-10-03 28
xlabel('x') %write a label in the x axes
legend('arcsen(x)') %write a legend inside the graph
grid %insert grid lines in the plot
set(p1, 'Linewidth',1.5,...
'linestyle','-',...
'color','b') %define line properties
subplot(2,2,2)
p2=plot(x,z);
xlim([-1.1 1.1]);
ylim([-0.2 pi+0.2]);
xlabel('x')
legend('arccos(x)')
grid
set(p2, 'Linewidth',1.5,...
'linestyle','-',...
'color','r')
subplot(2,1,2)
p3=plot(x1,t);
xlabel('x')
legend('arctg(x)')
grid
set(p3, 'Linewidth',2,...
'linestyle','-',...
'color','k')
Que conclui?
Bom trabalho
Actualizado em 03-10-03 29