Professional Documents
Culture Documents
Aplicao do Matlab
Resoluo de Problemas
Neste captulo mostram-se as potencialidades do Matlab para resolver alguns
problemas concretos.
Destacam-se sobretudo as suas capacidades de clculo numrico e grficos.
! deconv
! polyval
! roots
Razes de um polinmio
! poly
! polyder
Na introduo terica referiram-se como aspectos interessantes sobre este assunto algumas
operaes polinomiais, determinao de razes e clculo de polinmios conhecidas as suas razes.
Aborda-se agora como o uso do Matlab pode ser til nestes casos.
2.1.1 Definio de um polinmio
Um polinmio definido em Matlab custa de um vector, cujos valores so os coeficientes do
polinmio ordenado por ordem decrescente das suas potncias. Por exemplo o polinmio
50
f(x) = x2 + x - 6
definido como,
>>
polinomio = [ 1 1 -6]]
Mais exemplos
f(x) = x2 6
>>
polinomio = [ 1 0 -6]]
f(x) = x3 - x
>>
polinomio = [ 1 0 -1 0 ]
f(x) = x4 - x3 - 2 x2 + 3
>>
polinomio = [ 1 -1 -2 0 3 ]
x = 4;
>>
>>
f4 = 35.0
Pode-se calcular de uma s vez o valor para um conjunto de valores (vector neste caso).
Matlab: Ferramenta de simulao computacional e clculo numrico
51
w = 0:1:10;
>>
x = 4
>>
pol = [ 1 -3 -2 0 3 ]
>>
f4 = polyval( pol, x)
>>
f4 = 35.0
>>
w = 0:1:10;
>>
f = polyval( pol, w)
f = [ 1
0 -3 -1
>>
g = [ 0
4 -2
>>
s = f + g
>>
s = [ 1
4 -5
2 ]
5 -16 ]
4 -14 ]
52
f = [ 1
>>
s = 3*f
>>
s = [ 3
0 -3
-1
2 ]
0 -9
-3
6 ]
Portanto s(x) = 3 x4 - 9 x2 - 3 x + 6
Multiplicao de dois polinmios
A multiplicao de dois polinmios conseguida usando a funo conv. Por exemplo pretendese multiplicar os polinmios f(x) e g(x)
f(x) = x2 - x + 2 g(x) = 5 x - 16
>>
f = [ 1 -1
2 ]
>>
g = [ 5
>>
s = conv( f, g)
>>
s = [ 5
-16 ]
-17 -6 -32
A diviso de dois polinmios conseguida em Matlab usando a funo deconv. Para dividir os
polinmios
f(x) = x2 - x + 2 g(x) = 5 x - 16
faz-se
>>
[q,r]] = deconv(f,g)
>>
q = [ 0.20 0.44]]
>>
r = [ 0.0
0.0
9.04]]
A funo deconv calcula o quociente (q) e o resto (r) da diviso dos polinmios. Neste caso,
Matlab: Ferramenta de simulao computacional e clculo numrico
53
r = 9.04
f = [ 1
1 -6 ]
>>
r = roots(f)
>>
r= -3
2
Existem portanto duas razes, em x=2 e x=-3. Outro exemplo, agora com razes complexas,
f(x) = x2 - 2x +5
>>
f = [ 1
-2 5 ]
>>
r = roots(f)
>>
1.0000 + 2.0000 j
1.0000 - 2.0000 j
54
>>
f = poly ([[ -3
>>
f = [ 1
2 ])
-6 ]
raizes = [ -2
>>
>>
f = poly [ 1
-3+2*i
-49
-3-2*i ]
-78
0 ]
! fzero
! fmins
Considere-se a funo
y =f(x) =
1
1
+
-1
2
2
(x - 2) + 0.05
(x - 1) + 0.1
Pretende-se determinar o seu mnimo e determinar a seus zeros, isto , os pontos x* tais que
y(x*)=0.
55
"
function y = funcao1(x)
y= 1./( (x-1).^2 + 0.1) + 1./( (x-2).^2 + 0.05) - 1;
end
x=-2:0.1:5;
>>
y=funcao1(x);
>>
plot(x,y);
>>
grid
20
15
10
-5
-2
-1
Mnimos
Para determinar de uma funo definida como acima se explicou, existe a funo fmin
>>
min=fmin(funcao,xini,xfin)
min1=fmin(funcao1,-2,5)
>>
min2=fmin(funcao1, 1,2)
56
ymin1=funcao1(min1)
>>
ymin2=funcao1(min2)
Zeros
Para determinar os zeros de uma funo existe a funo fzero
>>
zer=fzero(funcao,xini)
O valor de xini permite especificar uma soluo inicial para o zero da funo. Recorrendo ao
Matlab calcula-se a soluo nas proximidades de x=0.5 e x=2.5
>>
zer1=fzero('funcao1',0.5)
>>
zer2=fzero('funcao1',2.5)
Na figura que se segue mostra-se os resultados obtidos nos dois exemplos anteriores:
mnimos e zeros.
57
15
10
-5
-2
-1
Diviso esquerda
!|
Diviso direita
! inv(A)
Inversa da matriz A
! rank(A)
+2y - z
-x
+3y +2z = 5
-y
-z
= 10
= -1
3 2 -1 x 10
-1 3 2 y = 5
1 -1 -1 z -1
AX=B
Existem duas formas de solucionar o problema
Matlab: Ferramenta de simulao computacional e clculo numrico
58
X = A-1 B
Diviso esquerda
>>
>>
B = [ 10, 5, -1]];
>>
X = A\B
>>
>>
B = [ 10, 5, -1]];
>>
X = inv(A)*B
Inversa
x -2
y = 5
z -1
3 2 -1
x y z ] -1 3 2 = [ 10 5 -1 ]
1 -1 -1
Diviso direita
>>
>>
B = [ 10, 5, -1]];
>>
X = B/A
X = [ x y z ] = [ -3.0 15.0 34.0 ]
2.3.3 - Exemplos
Matlab: Ferramenta de simulao computacional e clculo numrico
59
+ 2y - z
=1
- 2y + z
=2
+ y - z
= -1
Soluo:
+ 2y + z
=1
2x
- y - z
=5
Soluo:
(x,y,z) = ..
No possvel determinar a soluo uma vez que existe um nmero de incgnitas (3)
superior ao de equaes (2). Existe uma infinidade de solues
+y
+ z = 10
-x
- y
-z
=5
+ 2y
- z
= -1
x
Soluo:
+ 2y + z
2x
-+3 y - z
=2
2x
- 2y - z
=5
2x
- y
Soluo:
+z
=1
=1
(x,y,z) = ..
No possvel determinar a soluo uma vez que existe um nmero de incgnitas (3)
inferior ao de nmero de equaes (4). No existe portanto soluo.
! polyval
! spline
60
! table2
2.4.1 - Interpolao
Basicamente a interpolao tem por objectivo estimar o valor entre dois pontos para os
quais se conhecem os valores. Estudam-se duas formas de aproximao: a linear e a cbica
Exemplo
Considere o tanque de gua que se mostra na figura seguinte.
Para estudar o sistema abriu-se a torneira e recolheram-se valores da ltura da gua (y)
durante os primeiros dez minutos, que se mostram na tabela seguinte
Tempo (s)
ltura (y)
0
1
2
3
4
5
6
7
8
9
10
0
0.7
2.4
3.1
4.2
4.8
5.7
5.9
6.2
6.4
6.4
61
4
6
T e m p o (m in uto s)
10
4
6
T em po (m in u to s)
10
O Matlab, alm da interpolao linear, permite solucionar tal problema recorrendo a um mtodo
mais preciso, a cbica. Mais tarde aborda-se novamente este ltimo mtodo.
62
Interpolao Linear
Comea-se por representar os dados segundo uma matriz em que a primeira linha
constituda pelos minutos (t) e a segunda pelos valores da ltura da gua (y) de vectores:
"
t = 0:1:10;
y = [0
0.7
2.4
3.1
4.2
4.8
5.7
5.9
6.2
6.4
6.4
];
dados(:,1)= t;
dados(:,2)= y;
y=table1( dados, x )
>>
y1 =3.65
Para obter a interpolao no para um ponto (escalar) mas para um conjunto de pontos
(vector) procede-se da mesma forma:
>>
x= 0:0.1:10;
>>
y=table1( dados, x )
Exemplo 2
No exemplo anterior os dados so constitudos por duas colunas: o tempo e a ltura da gua.
Suponha-se agora que adicionalmente so recolhidos mais dois dados relativos ao tanque de
gua, a temperatura da gua na base e nvel superior do tanque. A tabela seguinte contm
esses valores:
Tempo (s)
ltura (y)
Temp. base
Temp. Sup.
0
1
2
3
4
0
0.7
2.4
3.1
4.2
10
10.6
10.9
11.1
11.7
10
10.7
10.4
11.1
12.2
63
4.8
5.7
5.9
6.2
6.4
6.4
11.6
11.5
11.2
11.6
11.4
11.4
12.8
12.7
12.9
12.6
12.7
12.7
10
4
2
0
4
6
T em po (m in u to s)
10
Comea por se definir o conjunto de dados, notando que existem agora quatro colunas
"
t = 0:1:10;
y = [0
0.7
2.4
3.1
4.2
4.8
5.7
5.9
6.2
6.4
6.4
];
temp1=[10 10.6 10.9 11.1 11.7 11.6 11.5 11.2 11.6 11.4 11.4 ];
temp2=[10 10.7 10.4 11.1 12.2 12.8 12.7 12.9 12.6 12.7 12.7 ];
dados(:,1)=t';
dados(:,2)=y';
dados(:,3)=temp1';
dados(:,4)=temp2';
Para interpolar valores num dado instante usa-se novamente a funo table1
>>
y1 = table1(dados,3.5);
>>
y1 = [ 3.65
11.40
11.65 ]
64
1.0
1.1
1.2
1.3
1.4
0
1
2
3
4
5
6
7
8
9
10
0
0.7
2.4
3.1
4.2
4.8
5.7
5.9
6.2
6.4
6.4
0
4.0
4.2
4.1
4.8
5.2
5.4
6.1
6.5
6.7
6.8
0
3.3
2.4
3.5
4.5
5.2
5.5
6.5
6.9
7.4
7.5
0
3.7
5.2
6.1
6.2
7.2
7.7
7.9
8.2
8.2
8.1
0
3.8
5.0
5.8
6.3
7.4
7.7
8.0
8.3
8.4
8.3
d5
d4
8
d3
d2
d1
6
5
4
3
2
1
0
10
M in u to s
Com este conjunto de dados pretende-se agora conhecer o valor da ltura da gua num
instante qualquer, tendo em ateno tambm o dimetro da torneira. Para esse efeito existe a
funo table2. Para comear constri-se uma matriz de dados em que cada linha contm os
dados relativos a cada instante:
"
dados( 1,:)
dados( 2,:)
= [ 0 0
dados( 3,:)
] ;
65
dados( 5,:)
dados( 6,:)
dados( 7,:)
dados( 8,:)
dados( 9,:)
dados(10,:)
dados(11,:)
dados(12,:)
Note-se que os dados so organizados por linhas e no por colunas, como no exemplo
anterior. Para interpolar o valor da gua no instante 3.5 e para um dimetro 1.25 faz-se
>>
>>
y = 5.0750
Pode-se entender este processo de interpolao como uma interpolao a duas dimenses,
isto , o valor da varivel a determinar depende de duas variveis, neste caso o tempo e a
capacidade da torneira (dimetro).
Interpolao Cbica
Por vezes a aproximao linear pode no constituir uma soluo satisfatria. O Matlab
implementa um outro tipo de interpolao, em que cada curva entre dois pontos adjacentes
consiste num polinmio de terceira ordem (dai a designao de interpolao cbica). A funo
que permite tal a spline.
Retomando o exemplo da ltura da gua dado no incio o aspecto geral deste ltimo tipo de
aproximao, comparada com a linear seria:
66
2
In te rp olao linear
1
0
-1
4
6
T em po (m in u to s)
10
Admitindo que se quer, tal como anteriormente, estimar o valor da ltura no instante 3.5.
Usando a funo spline tem-se
>>
t = 0:1:10;
>>
>>
y1 = spline( t, y, 3.5 )
>>
y1 =3.6457
6.4 6.4
];
Note-se que no necessrio definir uma matriz de dados como o era no uso da table1. So
usados directamente os valores de t e y.
67
t = 0:1:10;
>>
y = [0 0.7
2.4
3.1
4.2
4.8
5.7
5.9
6.2
6.4
6.4 ];
A funo polyfit permite obter os coeficiente do polinmio (dois, os coeficientes da recta):
>>
coef = polyfit(t,y,1);
>>
coef = [ 0.6664
0.8318
yap = coef(1).*t+coef(2);
>>
plot(t,yap,t,y,'o')
A p ro xim ac ao da altu ra a gu a
8
7
6
5
4
3
2
1
0
4
6
T em po (m in u to s)
10
Aproximao Polinomial
Usando a funo polyfit possvel aproximar o conjunto de pontos por um polinmio de
qualquer ordem. A sintaxe
68
coef = polyfit(t,y,n);
Em que n a ordem do polinmio. Note-se que a funo vlida para aproximaes lineares,
sendo neste caso n=1.
Para o mesmo exemplo apresenta-se a soluo para polinmios de segunda, terceira, quarta e
quinta ordem.
Segunda ordem: n=2
>>
coef = polyfit(t,y,2);
>>
coef = [ -0.0712
1.3785 -0.2364 ]
4
6
T em po (m in u to s)
10
coef = polyfit(t,y,3);
>>
1.2540 -0.1580 ]
69
4
6
T em po (m in u to s)
10
coef = polyfit(t,y,4);
>>
0.0925
0.9918 -0.0825 ]
4
6
T e m p o (m in u to s )
10
coef= polyfit(t,y,5);
>>
70
4
6
T e m p o (m in u to s )
10
0.0075 -0.0791
0.2913
0.7506 -
0.0517 ]
>>
y1 = polyval(coef, 3.5)
>>
y1
= 3.7349
! quad
! find
71
Pretende-se calcular o integral, o mesmo dizer a rea abaixo da funo, entre dois valores
positivos a e b (b>a). Na figura seguinte mostra-se a funo no intervalo [0, 5]
2 .5
1 .5
0 .5
area =quad('sqrt', 0, 5)
>>
area =
7.4535
72
Os parmetros so:
0 - valor inicial
5 - valor final de integrao.
20
15
10
-5
-1
Pretende-se calcular a rea abaixo da figura no intervalo [1 .. 4], dada pela rea da figura
abaixo
25
20
15
10
-5
-1
73
"
function y = funcao(x)
y= x.^2 + 5*sin(x) - cos(2*x)+ 1;
end
area = quad('funcao',1,4)
>>
area
= 29.9297
Derivada
Seja a funo definida pelo seguinte polinmio (rever parte terica)
f(x) = x5 - 3 x4 - 11 x3 + 27 x2 + 10 x -24
Graficamente
600
400
200
f(x)
-200
-400
-600
-4
-3
-2
-1
74
x = -4:0.1:5;
>>
>>
dy = diff(y)./diff(x);
Refira-se que a funo diff no implementa directamente o clculo da derivada mas sim do
clculo das diferenas entre dois valores adjacentes de um vector. Da o clculo da derivada
ser a diviso entre as diferenas de y e as diferenas de x.
dy
y dx
Na figura seguinte mostra-se a funo (y) e respectiva derivada (dy)
600
400
dy
200
y
0
-2.31
-0.17
1.53
3.35
-200
-400
-600
-4
-3
-2
-1
Pontos Crticos
Sabe-se que o conhecimento da derivada permite identificar os valores mximos ou mnimos
de uma funo. Viu-se tambm no captulo 2 como a evoluo da derivada permite concluir da
existncia de pontos crticos.
1. Calcula-se a derivada de uma funo em pontos adjacentes num dado intervalo
2. Se o produto da deriva num ponto x(k) pelo valor no ponto x(k+1) for:
> 0 - no houve variao de sinal
= 0 - a derivada nula num (ou nos dois) dos pontos
< 0 - houve uma variao de sinal
3. Os valores <0 permitem portanto identificar pontos crticos
75
Em Matlab este raciocnio possvel de implementar usando a funo find . A funo find
permite determinar, para um determinado vector, quais os ndices dos seus elementos no
nulos.
Por exemplo
>>
xd = x(2:length(x));
>>
produto = dy(1:length(dy)-1).*dy(2:length(dy));
>>
>>
pcriticos = [ -2.31
-0.17
1.53
3.35 ]
Os pontos crticos obtidos podem ser confirmados pela observao da figura anterior.
! ode45
2.6.1 - Introduo
Em Matlab existem duas funes, ode23 e ode45, capazes de calcular numericamente a
soluo de uma equao diferencial do tipo:
Equao diferencial
y= g(x,y)
Soluo
y=f(x)
76
Sadas
x
y
- coordenadas
- valores correspondente para y=f(x)
Entradas
derivada
incio
fim
y0
2.6.2 - Exemplo 1
Considere-se a seguinte equao diferencial
y= 2x + 2
Sabe-se que analiticamente a soluo desta equao
y(x) = x2 + 2 x + yo
sendo y0 a chamada condio inicial, isto y(0)=f( x(0) ). Em Matlab este problema pode-se
resolver da seguinte forma:
1. Define-se a funo derivada, construindo um ficheiro *.m, por exemplo, de nome
deriva.m com o contedo:
"
function
dy=deriva(x,y)
dy = 2*x + 2;
2. Uma vez definida a condio inicial, por exemplo y0=1, e o intervalo desejado [0..2]
faz-se
>>
yo= 1;
>>
[x,y]= ode23('deriva',0,2,yo);
Na figura que se segue mostra-se o valor calculado usando a funo ode23 (mtodo de RungeKutta) e o valor analtico exacto (ya) calculado usando a soluo
Matlab: Ferramenta de simulao computacional e clculo numrico
77
>>
E q u a c a o D ife re n c ia l
9
8
7
6
y
5
4
3
2
1
0 .5
1
x
1 .5
2.6.3 - Exemplo 2
Considere-se agora a equao diferencial
y= 4y + e2x
Usando o Matlab procede-se como se referiu no exemplo anterior. Constri-se uma funo
"
function
dy=deriva(x,y)
dy = 3*y + exp(2*x);
xo=3;
>>[x,y]=ode23('deriva',0,1,xo);
78
ya=4*exp(3*x)-exp(2*x);
%--
y(0) = 3
40
30
20
10
0
0.2
0 .4
0 .6
0.8
79