Академический Документы
Профессиональный Документы
Культура Документы
numrico e grficos.
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
2.1
Estudo de polinmios
polinomio = [ 1 1 -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 ]
2.1.2
Existem duas formas de calcular o valor de um polinmio: escrevendo directamente o polinmio ou usando a funo polyval. Da primeira forma procede-se como se indica. Seja o polinmio f(x) = x4 - 3x3 - 2 x2 + 3 O valor de f(x=4) pode-se calcular como
>> >> >>
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
2.1
Estudo de polinmios
>> >>
>> >>
Portanto quando x um escalar polyval devolve um escalar, quando w um vector devolve um vector. 1.1.3 - Operaes aritmticas A adio consiste em somar simplesmente dois vectores. Por exemplo pretende-se somar os dois seguintes vectores f(x) = x4 - 3 x2 - x + 2 g(x) = 4 x3 - 2 x2 + 5 x - 16 A sua soma s(x) = f(x) + g(x) calculada como se indica,
>> >> >> >>
f = [ 1 g = [ 0
0 -3 -1 4 -2
2 ]
5 -16 ]
s = f + g s = [ 1 4 -5 4 -14 ]
52
2.1
Estudo de polinmios
A multiplicao de um polinmio por um escalar obtm-se simplesmente pela multiplicao de um vector (que define o polinmio) por um escalar. Seja o polinmio s(x) = 3*f(x), em que f(x) o polinmio definido acima ento,
>> >> >>
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 g = [ 5
2 ]
-16 ]
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
>> >> >>
A funo deconv calcula o quociente (q) e o resto (r) da diviso dos polinmios. Neste caso, q(x) = 0.2 x + 0.44 r = 9.04
53
2.1
Estudo de polinmios
Note-se que vlida a relao f(x) = q(x) * g(x) + r x2 - x + 2 = ( 0.2 x + 0.44 ) (5 x - 16) + 9.04 1.1.4 - Razes de um Polinmio Existe frequentemente a necessidade de calcular as razes de uma polinmio. Recorrendo ao Matlab fcil realizar esta tarefa, mesmo que o polinmio seja de ordem elevada. A funo roots para esse fim utilizada. Considere-se, por exemplo, o seguinte polinmio de segunda ordem f(x) = x2 + x 6
>> >> >>
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 ]
possvel em Matlab determinar automaticamente um polinmio que tem determinadas razes conhecidas priori. A funo que o permite a poly. Por exemplo sabe-se que as razes de um polinmio so x=-3 e x=2. possvel determinar um polinmio que tem essas razes fazendo.
>>
f = poly ([ -3 [
2 ]) 54
2.1
Estudo de polinmios
>>
f = [ 1
-6 ]
Por outras palavras o polinmio resultando f(x) = x2 + x - 6 Mais um exemplo. As razes de um polinmio so -2, 0, 3 e -32 i, portanto trs razes reais e duas complexas. Eis como se pode calcular um polinmio que tenha tais razes.
>> >> >>
raizes = [ -2
-3+2*i
-3-2*i ]
1 (x - 2)2 + 0.05
Pretende-se determinar o seu mnimo e determinar a seus zeros, isto , os pontos x* tais que y(x*)=0. Usando um ficheiro ASCII, comea por se definir a funo em questo, por exemplo com o nome de funcao1.m
function y = funcao1(x)
55
2.2
Estudo de funes
y= 1./( (x-1).^2 + 0.1) + 1./( (x-2).^2 + 0.05) - 1; end
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)
assim possvel determinar o mnimo da funo funcao.m no intervalo compreendido entre x[xini..xfin]. Considerando os dois seguintes intervalos: [ -2, 5] e [ 1, 2] faz-se
>> >> >> >>
56
2.2
Estudo de funes
As duas primeiras linhas permitem determinar os x mnimos em questo e as duas ltimas o valores de y correspondentes. Os valores obtidos foram
xmin1 = -1.9999 ymin1= -0.8278 xmin2 = 1.4629 ymin2 = 5.1363
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)
resultados
obtidos
nos
dois
20
15
10
-5 -2
-1
57
3 2 -1 x 2 y -1 3 1 -1 -1 z
10 = 5 -1
A X = B Existem duas formas de solucionar o problema Diviso esquerda X = A\B Inversa X = A-1 B
Diviso esquerda
>> >> >>
Inversa
>> >> >>
58
2.4
-2 5 -1
= B
ento a sua soluo pode ser dada por uma diviso direita X = B/A Seja o seguinte exemplo
3 2 -1 2 [ x y z ] -1 3 1 -1 -1
Diviso direita
>> >> >>
= [ 10
-1 ]
15.0
2.3.3 - Exemplos
Eis alguns exemplos, e respectiva soluo, de sistemas de equaes lineares: x x x + 2y - z = 1 - 2y + z = 2 + y - z = -1 (x,y,z) = (1.5, 2, 4.5 ) + 2y + z = 1
Soluo:
x 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
x + y + z = 10 - x - y - z = 5 x +
Soluo:
2y
= -1
Note-se que rank(A)=2, ou seja, no existe um nmero de equaes linearmente independentes igual ao nmero de incgnitas e portanto o sistema no tem soluo (a primeira linha o simtrico da segunda).
59
2.4
2y - z = 5 y +z = 1 (x,y,z) = ..
Soluo:
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.
Calcula o valor de um polinmio y=f(x) dado o valor de x Determine uma interpolao cbica Determina dimenso Determina dimenso uma uma interpolao interpolao linear linear a a uma duas
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.
60
2.4
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) 0 1 2 3 4 5 6 7 8 9 10 ltura (y) 0 0.7 2.4 3.1 4.2 4.8 5.7 5.9 6.2 6.4 6.4
4 6 T e m p o (m in uto s)
10
O objectivo da interpolao estimar o valor da ltura da gua em pontos intermdios daqueles que se conhece o valor correcto da ltura da gua. Pretende-se, por exemplo, estimar o valor da ltura da gua no instante 3.5 minutos. Na anlise terica do problema, estudada no captulo 2, foi explicado como a interpolao linear poderia ser usada para resolver o problema. Porque a interpolao linear aproxima-se esse valor por uma funo linear, ou seja, uma recta. Assim fcil de entender graficamente o resultado da interpolao de todos os pontos: rectas que unem cada um dos pontos adjacentes, como se mostra na figura seguinte:
61
2.4
4 6 T em p o (m inu tos)
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. 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 )
Como argumentos de entrada a tabela de dados e o valor de x a a interpolar, como varivel de sada y=f(x). Neste caso particular pretende-se o valor no instante 3.5, ento
>>
62
2.4
y1 =3.65
Para obter a interpolao no para um ponto (escalar) mas para um conjunto de pontos (vector) procede-se da mesma forma:
>> >>
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) 0 1 2 3 4 5 6 7 8 9 10 ltura (y) 0 0.7 2.4 3.1 4.2 4.8 5.7 5.9 6.2 6.4 6.4 Temp. base 10 10.6 10.9 11.1 11.7 11.6 11.5 11.2 11.6 11.4 11.4 Temp. Sup. 10 10.7 10.4 11.1 12.2 12.8 12.7 12.9 12.6 12.7 12.7
E vo lu ca o d a a ltura e te m p eratu ra s da ag ua 14 12 10
O - tem pera tura na base
4 2 0
4 6 T em p o (m inu tos)
10
Comea por se definir o conjunto de dados, notando que existem agora quatro colunas Matlab: Ferramenta de simulao computacional e clculo numrico 63
2.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';
Interpolao a duas dimenses Novamente para o exemplo do tanque de nveis, foram recolhidos valores para a ltura do nvel da gua considerando varivel o dimetro da torneira (de 1 a 1.4 centmetros). Esses resultados mostram-se na tabela e figura seguintes
Tempo (s) 0 1 2 3 4 5 6 7 8 9 10 1.0 0 0.7 2.4 3.1 4.2 4.8 5.7 5.9 6.2 6.4 6.4 1.1 0 4.0 4.2 4.1 4.8 5.2 5.4 6.1 6.5 6.7 6.8 1.2 0 3.3 2.4 3.5 4.5 5.2 5.5 6.5 6.9 7.4 7.5 1.3 0 3.7 5.2 6.1 6.2 7.2 7.7 7.9 8.2 8.2 8.1 1.4 0 3.8 5.0 5.8 6.3 7.4 7.7 8.0 8.3 8.4 8.3
64
2.4
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,:) dados( 3,:) dados( 4,:) dados( 5,:) dados( 6,:) dados( 7,:) dados( 8,:) dados( 9,:) dados(10,:) dados(11,:) dados(12,:) = [ 0 1.0 1.1 1.2 1.3 1.4 ] ; = [ 0 0 0 0 0 0 ] ;
= [ 1 0.7 4.0 3.3 3.7 3.8 ] ; = [ 2 2.4 4.2 2.4 5.2 5.0 ] ; = [ 3 3.1 4.1 3.5 6.1 5.8 ] ; = [ 4 4.2 4.8 4.5 6.2 6.3 ] ; = [ 5 4.8 5.2 5.2 7.2 7.4 ] ; = [ 6 5.7 5.4 5.5 7.7 7.7 ] ; = [ 7 5.9 6.1 6.5 7.9 8.0 ] ; = [ 8 6.2 6.5 6.9 8.2 8.3 ] ; = [ 9 6.4 6.7 7.4 8.2 8.4 ] ; = [10 6.4 6.8 7.5 8.1 8.3 ] ;
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
>>
65
2.4
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, (dimetro). neste caso o tempo e a capacidade da torneira
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:
Inte rp ola cao da altu ra a g ua 7 6 5 4 3
Interpola o cb ic a
2 1 0 -1 0 2
4 6 T em p o (m inu tos)
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; y = [0 0.7 2.4 3.1 4.2 4.8 5.7 5.9 6.2 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.
66
2.4
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):
>> >>
Ou seja a recta resultante y = 0.6664 x + 0.8318 Graficamente o resultado pode ser obtido como se segue
>> >>
67
2.4
Aproximao Polinomial Usando a funo polyfit possvel aproximar o conjunto de pontos por um polinmio de qualquer ordem. A sintaxe
>>
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 segunda, terceira, quarta e quinta ordem. Segunda ordem: n=2
>> >>
para
polinmios
de
68
2.4
1.2540 -0.1580 ]
A proxim a ca o d a a ltu ra ag u a
Figura 2.11
coef = polyfit(t,y,4); coef = [ 0.0010 -0.0232 0.0925 0.9918 -0.0825 ] + 0.9918 x -0.0825 69
2.4
Interpolao Usando a Funo Calculada na Aproximao A determinao de uma funo que aproxime um conjunto de pontos pode ser usada para o clculo de valores intermdios, tal como a interpolao. Ora, uma vez calculado o polinmio que aproxima o conjunto de pontos inicial, depois possvel interpolar o valor para um outro ponto qualquer recorrendo funo determinada.
70
2.4
Por exemplo, pretende-se interpolar um valor para a altura da gua no instante 3.5. Uma possvel soluo usar esta ltimo aproximao (quinta ordem) e calcular o valor da funo em 3.5, fazendo
>>
coef =[ -0.0003 [
0.0075 -0.0791
0.2913
0.7506 -
0.0517 ]
>> >>
Calcula o integral sobre uma curva (Mtodo de Simpson) ndice dos valores no nulos de um vector
diz
respeito
regra
trapezoidal
segunda
de
. . . + 2 f(xn-1) +
h = 3 (
+ 4 f(xn-1) + f(xn) )
em que h o passo de integrao. O Matlab implementa a regra de Simpson disponibilizando a funo quad para esse efeito. Matlab: Ferramenta de simulao computacional e clculo numrico 71
2.5
seguinte
funo,
referida
na
parte
y=
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
Os parmetros so: sqrt especifica o nome da funo, 0 - valor inicial 5 - valor final de integrao. Funes definidas pelo utilizador Acontece que na prtica desejado calcular o integral de funes definidas pelo prprio utilizador (no exemplo anterior a funo existe disponvel no Matlab). Por considere a seguinte funo y = f(x) = x2 + 5*sin(x) - cos(2*x) + 1 A seguir mostra-se o seu grfico no intervalo [ -1 .. 5 ]
72
2.5
Pretende-se calcular a rea abaixo da figura no intervalo dada pela rea da figura abaixo
25 20 15 10 5 0 -5 -1
[1 .. 4],
Primeiro deve-se definir a funo desejada criando uma funo num ficheiro *.m (assunto abordado na parte de Matlab). O seguinte cdigo ento criado e armazenado num ficheiro de nome funcao.m
function y = funcao(x) y= x.^2 + 5*sin(x) - cos(2*x)+ 1; end
2.5
Derivada Seja a funo definida pelo seguinte polinmio (rever parte terica) f(x) Graficamente
600 400 200
f(x)
= x5 - 3 x4 - 11 x3 + 27 x2 + 10 x -24
-3
-2
-1
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)
74
2.5
-0.17
3.35
-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 = 0 - no houve variao de sinal - a derivada nula num (ou nos dois) dos pontos
devolve os ndices do vector X cujos elementos so superiores a 10. Assim os pontos crticos no exemplo em estudo so obtidos como se indica a seguir Matlab: Ferramenta de simulao computacional e clculo numrico 75
2.5
xd = x(2:length(x)); produto = dy(1:length(dy)-1).*dy(2:length(dy)); pcriticos = xd( find (produto<0)) pcriticos = [ -2.31 -0.17 1.53 3.35 ]
Os pontos crticos obtidos podem ser confirmados pela observao da figura anterior.
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) A primeira implementa o mtodo de Runge-Kutta de segunda-terceira ordem e a segunda o mtodo de Runge-Kutta de quarta-quinta ordem. Uma vez que as duas funes possuem o mesmo nmero de argumentos, explica-se apenas o funcionamento de uma delas. A outra equivalente diferindo apenas no mtodo implementado. A sintaxe da funo ode23 a seguinte [ x, y ] = ode23( derivada, inicio, fim, y0)
Sadas
x y
Entradas
derivada - nome do ficheiro *.m onde deve ser definida equao diferencial incio - ponto inicial a partir do qual se calcula a soluo fim - ponto final para o qual se calcula a soluo Matlab: Ferramenta de simulao computacional e clculo numrico
76
2.6
2.6.2 - Exemplo 1
Considere-se a seguinte equao diferencial y= 2x + 2
Sabe-se que analiticamente a soluo desta equao x2 + 2 x + yo sendo y0 a chamada condio inicial, isto y(0)=f( x(0) ). y(x) = 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)
Em Matlab
dy = 2*x + 2;
2. Uma vez definida a condio inicial, por exemplo y0=1, e o intervalo desejado [0..2] faz-se
>> >>
x2 + 2 x + 1
ya = x.^2 + 2*x + 1;
77
2.6
2.6.3 - Exemplo 2
Considere-se agora a equao diferencial y= Usando o Matlab procede-se Constri-se uma funo
function dy=deriva(x,y)
como
dy = 3*y + exp(2*x);
xo=3;
>>[x,y]=ode23('deriva',0,1,xo);
ya=4*exp(3*x)-exp(2*x);
78
2.6
79