Relatório do projecto computacional grupo 72
-
Upload
rafael-lucas -
Category
Documents
-
view
42 -
download
1
Transcript of Relatório do projecto computacional grupo 72
Relatório do Projecto - Matemática Computacional
Relatório do Projecto Computacional
Disciplina: Matemática Computacional
Curso: Mestrado Integrado em Engenharia Mecânica
Ano lectivo 2013/2014
Grupo: 72
Nome: Rafael Lucas, Nº 75521
Nome: Luís Brazão, Nº 76081
Nome: Pedro Alves, Nº 74064
Enunciado
MN-41Recorrendo ao conceito de diferenças finitas, desenvolva uma
implementação computacional em MatLab pelo método de Euler
progressivo, para a solução do problema de pequenas oscilações de um
pequeno cilindro que roda no interior de outro maior (sem escorregar). Este
movimento rege-se pela equação diferencial d2 (theta) /dt2+g/ (3/2* (R-r))
*theta=0. Considerando um raio do maior cilindro de 0.75m e o raio do
menor de r=0.10m, constante g=9.8 ms-2. Considere theta o ângulo entre a
linha de centros dos cilindros e a vertical que passa no centro do maior
cilindro. Determine o período das oscilações. Apresente gráficos da posição
e velocidade angular versus da aproximação obtida em função da variável
tempo t para três períodos. Estude a convergência com o incremento de
tempo utilizado.
Assinaturas:
________________________ ________________________ ________________________
Relatório do Projecto - Matemática Computacional
Mestrado Integrado em Engenharia Mecânica - 2013/14 1
1. Breve introdução teórica
O Método de Euler é um dos métodos numéricos usados para integrar equações
diferenciais ordinárias (EDO’s). Estas equações envolvem uma função (geralmente
designada por y) de uma só variável (usualmente t), e um número finito de derivadas
dessa função.
O Método de Euler é usado nestas equações, no entanto é necessário completá-las com
uma condição inicial (y(t0) = y0) de modo a obtermos uma solução. Este problema é
conhecido como Problema de Valor Inicial (PVI), o qual pode ser apresentado da seguinte
forma:
{𝑦′ = 𝑓(𝑡, 𝑦(𝑡))
𝑦(𝑡0) = 𝑦0 (1)
O problema consiste em determinar a partir de (1) a relação entre a variável t e a função
y. As equações deste tipo podem ser usadas como modelos matemáticos numa grande
variedade de problemas com inúmeras aplicações. No nosso caso, relaciona a posição
angular e a velocidade angular com o tempo, para o problema indicado no enunciado.
Os métodos analíticos, permitem encontrar explicitamente a função y(t). No entanto, no
caso de a função ser muito “complexa”, esses métodos revelam-se ineficazes. Portanto,
existe a necessidade de recorrer a métodos numéricos, como o método de Euler, o qual
oferece soluções aproximadas ao invés das soluções exactas. Assim, os métodos
numéricos dão-nos valores de y correspondentes apenas a um conjunto finito de valores
de t e a solução é obtida como uma tabela de valores, em vez de através de uma função
contínua. Ao utilizar este método na resolução de EDO’s obtemos soluções aproximadas
num conjunto de pontos tn do intervalo I = [t0,T]. Deste modo, em vez da solução exacta,
ficamos a conhecer os valores aproximados, logo diz-se que o problema foi discretizado.
O processo de discretização pode ser apresentado da seguinte forma: Seja I = [t0,T] o
intervalo de integração, vamos considerar uma sucessão de nós de discretização de I, tn =
t0 + nh (n=0,1,..,N), com h>0, e N o máximo do inteiro tal que tn = T. Essa sucessão tn
define subintervalos de I : In = [tn, tn+1]. Em geral, define-se ℎ = tn+1 - tn , e designa-se
por tamanho do passo. No método em questão, assume-se que para uma pequena
distância ∆t (=h) a partir de um ponto inicial t0, a função 𝑓(𝑡, 𝑦(𝑡)) é uma constante igual
a 𝑓(𝑡0, 𝑦0). Ao admitirmos que 𝑓(𝑡, 𝑦(𝑡)) = 𝑓(𝑡0, 𝑦0) para todos os valores de t0 e t1= t0
+ h, então a alteração ∆y em y corresponde à pequena alteração ∆t em t e é dada,
aproximadamente, por: ∆𝑦
∆𝑡= 𝑓(𝑡0, 𝑦0)
(2)
Ao representarmos y1 por y0 + ∆y, da equação anterior resulta que:
𝑦(1) = 𝑦(0) + ℎ ∗ 𝑓(𝑡0, 𝑦0) (3)
A condição inicial fornece os valores de t0 e y0, e então pode-se calcular o valor de y1 e
todos os valores seguintes, ficando assim a solução geral segundo o método de Euler
(progressivo):
yi+1 = yi + h * f(ti,y(ti)) , i = 0,1..,N-1 (4)
onde f(ti,yi) = y’(ti).
Este método designa-se progressivo porque permite calcular yi+1 explicitamente a partir
de yi. O processo de cálculo prossegue, intervalo a intervalo, a partir de t0, até um ponto
final desejado.
Relatório do Projecto - Matemática Computacional
Mestrado Integrado em Engenharia Mecânica - 2013/14 2
Neste trabalho recorremos ao software Matlab para a implementação deste método.
2. Algoritmos do método
Para a implementação do método de Euler em MATLAB, utilizaram-se neste trabalho os
algoritmos a seguir indicados.
A1. Algoritmo para a entrada de dados:
Ler l (tempo de análise)
Ler h (tamanho do passo da malha)
Ler ang(1) (condição inicial, valor inicial da posição angular)
Ler vel(1) (condição inicial, valor inicial da velocidade angular (primeira derivada
da posição angular(ang’ = vel)
A2. Algoritmo para a implementação do método de Euler:
Criar um vector t, com os diferentes valores de ti (ti = t0 + i*h).
Ciclo de i = 1,2,., r -1 (Seja r o tamanho do vector t)
angi+1 = angi + h * veli
veli+1 = veli - p*h* angi
Fim do ciclo
A3. Algoritmo para o cálculo da solução exacta da equação diferencial dada no
enunciado:
Seja pos a solução exacta da posição angular e omega a solução exacta da velocidade
angular. (A expressão da solução exacta foi calculada analiticamente).
c = ang(1)
m = 3.1704
d = vel(1)/m
pos(1) = ang(1)
omega(1) = vel(1)
Ciclo de i=1,2,.., r-1
posi+1 = c*cos(m*ti+1) + d*sen(m*ti+1)
omegai+1 = -m*c*sen(m*ti+1) + m*d* cos(m*ti+1)
Fim do ciclo
A4. Algoritmo para o cálculo do erro global de discretização (da posição e da velocidade
angulares):
Ciclo de i=1,2,.., k (Seja k o tamanho do vector pos)
erroposi = |angi – posi|
Fim do ciclo
Ciclo de i=1,2,..,k (Seja k o tamanho do vector pos(igual ao tamanho do vector
omega)
erromegai = |veli – omegai|
Fim do ciclo
A5. Algoritmo para o cálculo do majorante do erro de truncatura para cada passo (da
posição e velocidade angular):
(Para implementar este algoritmo, resolvemos analiticamente a segunda e terceira
derivada de pos)
errotruncang1 = 0
Ciclo i = 1,2,.., r-1
ymaxi = máximo do módulo da função: -(3.1704^2)*c*cos(m*x) -
(3.1704^2)*d*sin(m*x)), para cada intervalo [ti,ti+1].
errotruncangi+1 = ((h)/2)* ymaxi
Fim do ciclo
Relatório do Projecto - Matemática Computacional
Mestrado Integrado em Engenharia Mecânica - 2013/14 3
Acima apenas está explicado o algoritmo para o caso da posição angular, pois o
procedimento para a velocidade angular é idêntico.
A6. Algoritmo para o cálculo dos períodos das ondas sinusoidais da velocidade e da
posição angular (da solução exacta e da solução numérica) e para o cálculo do erro dos
períodos:
(Neste caso usou-se uma interpolação linear para calcular o período)
indices = vector de zeros com tamanho g(tamanho do vector t)
Ciclo de i=1,2,..,g
se posi > 0 e posi+1 < 0
indicesi = 1
indicesi+1 = 1
fim
fim do ciclo
d = vector que guarda as posições onde o vector índices tem valor 1
(Interpolação linear :)
ta = (-posd1/(posd2-posd1))*(td2-td1) + td1
ta2 = (-posd3/(posd4-posd3))*(td4-td3) + t(d3)
periodopos = ta2 – ta
O cálculo do resto dos períodos é idêntico a este, só difere nas variáveis.
3. Aspectos da implementação dos algoritmos
Na implementação do algoritmo A1, o programa pede ao utilizador para introduzir as
variáveis necessárias para se implementar o método em questão: o tempo de análise, o
tamanho do passo da malha, o valor inicial da posição angular e da velocidade angular.
O programa guarda estes dados respectivamente nas variáveis: l, h, ang(1) e vel(1).
O algoritmo A2 é utilizado para implementar o método de Euler nas condições indicadas
pelo utilizador. Usou-se um ciclo (for) que calcula a solução aproximada através do
método de Euler progressivo da posição angular (ang) e da velocidade angular (vel) em
função do tempo, em cada ponto ti. Note-se que o valor da posição e velocidade angular
no instante incial (t0), são dados pelo utilizador e são respectivamente ang(1) e vel(1).
No algoritmo A3, é calculada a solução analítica da equação diferencial de segundo grau
dada no enunciado para cada ponto ti. Para tal usou-se também um ciclo (for) que calcula
a solução exacta da posição (pos) e velocidade angular (omega) em cada ponto ti. Note-
se que o valor da posição e da velocidade angular t0 são inseridos pelo utilizador no
algoritmo A1, pois trata-se de um problema de valor inicial. Assim, tem-se:
ang(1)=pos(1) e vel(1)=omega(1).
O algoritmo A4 é usado para calcular o erro global de discretização em cada ponto i. Para
tal usámos dois ciclos: o primeiro calcula o erro em cada ponto i da posição angular, para
tal calculamos o valor absoluto da subtracção do valor aproximado (ang) ao valor exacto
(pos) em cada ponto. O segundo ciclo, procede da mesma maneira, mas para a velocidade
angular, cujo valor aproximado é vel e o valor exacto é omega.
No algoritmo A5 calcula-se o majorante do erro de truncatura para casa passo associado
ao método de Euler na determinação da posição e velocidade angular. O erro de truncatura
pode ser majorado da seguinte forma: Tn+1 = h*sup| 𝑓′(𝑡, 𝑦(𝑡))|, (usando a notação da
secção 1), onde t está entre os valores ti e ti+1. Para calcularmos o supremo do módulo de
Relatório do Projecto - Matemática Computacional
Mestrado Integrado em Engenharia Mecânica - 2013/14 4
𝑓′(𝑡, 𝑦(𝑡)), recorremos a um ciclo no qual utilizámos a função fminbnd do MATLAB. (A
função 𝑓′(𝑡, 𝑦(𝑡)) foi calculada analiticamente). O ciclo dá-nos o valor do majorante do
erro de truncatura em cada ponto i, sendo que no ponto inicial, o erro de truncatura é zero,
pois no ponto inicial ainda não tinha ocorrido nenhum passo do método de Euler. Para
calcular o majorante do erro de truncatura para casa passo na determinação da velocidade
angular procedeu-se da mesma forma, mas em vez de se utilizar sup| 𝑓′(𝑡, 𝑦(𝑡))|, usou-se
sup| 𝑓′′(𝑡, 𝑦(𝑡))|.
No algoritmo A6 calcula-se o período de cada onda sinusoidal da posição e velocidade
angular, tanto para a solução exacta como para a solução analítica e calcula-se o
respectivo erro efectivo dos períodos. No cálculo dos períodos, usou-se uma interpolação
linear para calcular em que pontos t, o valor da posição e velocidade eram zero. Vamos
só explicar o procedimento para o cálculo do período no caso da onda da posição angular
exacta, pois os outros calculam-se através do mesmo procedimento. Para tal, criou-se um
vector índices de zeros e de tamanho do vector t. De seguida criou-se um ciclo em que se
pos(i) >0 e pos(i+1) <0 , então o vector indices nas posições i e i+1, fica com o valor 1.
De seguida criou-se um vector d que encontra as posições i onde indices(i) = 1 (para tal
utilizou-se a função find. Depois, recorremos a uma interpolação linear, pois o intervalo
entre os pontos i e i+1 é tao pequeno (h) que se aceita esta aproximação. Como o vector
d guarda as posições i e i+1, onde pos(i) > 0 e pos(i+1) < 0, então podemos aplicar uma
interpolação linear utilizando esses pontos (pos(d(i))). Em anexo encontra-se explicada
como se utilizou a interpolação linear.
4. Aplicação do método e discussão de resultados
Para as aplicações de teste deste método considerámos vários valores inseridos pelo
utilizador, de modo a mostrarmos como é feita a implementação do método e fazemos
uma análise dos erros associados ao mesmo.
Para tal, criámos um menu onde o utilizador pode escolher a opção Inserir condições
iniciais. No papel do utilizador, no primeiro caso teste inserimos os seguintes dados:
Tempo de análise – 5s, Intervalo de tempo – 0.01s, Ângulo inicial – pi/10 rad, Velocidade
angular inicial – 0 rad/s. De seguida voltamos ao menu e escolhemos a segunda opção
Calcular solução numérica pelo método de Euler progressivo. Esta opção implementa o
método em questão e calcula a solução numérica para as condições indicadas
inicialmente. Ao escolher a terceira opção obtemos os gráficos da posição e velocidade
angular em função do tempo, tanto para a solução exacta como numérica:
Relatório do Projecto - Matemática Computacional
Mestrado Integrado em Engenharia Mecânica - 2013/14 5
Figura 1 Gráficos da posição angular e velocidade angular em função do tempo
Figura 2 Gráficos do erro global de discretização em função do tempo (escala logarítmica)
Analisando os gráficos, podemos ver que o erro global aumenta ao longo do tempo como
podemos confirmar analisando os gráficos a seguir, escolhendo a quarta opção do menu:
Observamos que o erro global aumenta ao longo do tempo tanto para a posição angular
como para a velocidade angular. No entanto, observa-se que existem certos pontos onde
o erro decresce devido à onda da posição e da velocidade angular ser sinusoidal. De
seguida, criámos um algoritmo para calcular o majorante do erro de truncatura em cada
passo cometido pela aproximação associada ao método de Euler (para a posição e
velocidade angular), o qual cria um gráfico do mesmo em função do tempo:
Relatório do Projecto - Matemática Computacional
Mestrado Integrado em Engenharia Mecânica - 2013/14 6
Figura 3 Gráficos do majorante do erro de truncatura em função do tempo (escala logarítmica)
Este erro dá-nos o erro cometido de passo em passo, ou seja, o erro cometido do ponto i
para o ponto i+1. Observando os gráficos, podemos ver que o majorante do erro de
truncatura tem um majorante para si mesmo, ou seja, o erro cometido de um passo para o
seguinte nunca é maior do que um determinado valor. De seguida, calculamos os períodos
da onda da posição e da velocidade angular (exactas e numéricas), usando uma
interpolação linear, e calculamos o erro efectivo dos períodos, escolhendo a opção 8
seguida da 7, do menu. Ao fazermos isto, é nos apresentado no prompt do Matlab o
seguinte:
O período da onda da posição angular(solução exacta) é: 1.981827 s
O período da onda da posição angular(solução numérica) é: 1.982507 s
O período da onda da velocidade angular(solução exacta) é: 2.299054 s
O período da onda da velocidade angular(solução numérica) é: 1.982506 s
O erro efectivo do período da onda sinusoidal da posição angular entre a solução
exacta e a numérica é: 0.000679
O erro efectivo do período da onda sinusoidal da velocidade angular entre a
solução exacta e a numérica é: 0.316548
Para fazermos uma melhor análise do método de Euler e do erro associado ao mesmo,
considerámos um exemplo de teste em que as condições iniciais são iguais, à excepção
do Intervalo de tempo que em vez de ser 0.01s é 0.0001s, ou seja, o passo efectuado do
ponto i para o i+1 é igual a 0.0001 (que corresponde ao h na equação (4) da secção 1).
Efectuámos o mesmo procedimento do teste anterior, e obtivemos os seguintes resultados:
Relatório do Projecto - Matemática Computacional
Mestrado Integrado em Engenharia Mecânica - 2013/14 7
Figura 4 Gráficos da posição angular e velocidade angular em função do tempo
Como podemos ver ao observar estes gráficos, a solução numérica e a exacta quase que
coincidem em todos os pontos. Comparando com o exemplo anterior, concluímos que ao
considerar um h (tamanho do passo) menor, o erro global e de truncatura também
diminuem. Assim, quando o h tende para zero, o erro associado ao método de Euler
também tende para zero, como podemos observar pelos seguintes gráficos:
Figura 5 Gráficos do erro global de discretização em função do tempo (escala logarítmica)
Relatório do Projecto - Matemática Computacional
Mestrado Integrado em Engenharia Mecânica - 2013/14 8
Figura 6 Gráficos do majorante do erro de truncatura em função do tempo (escala logarítmica)
Calculando os períodos e o erro efectivo como foi feito no primeiro exemplo obtemos o
seguinte:
O período da onda da posição angular(solução exacta) é: 1.981827 s
O período da onda da posição angular(solução numérica) é: 1.981843 s
O período da onda da velocidade angular(solução exacta) é: 2.297272 s
O período da onda da velocidade angular(solução numérica) é: 1.981843 s
O erro efectivo do período da onda sinusoidal da posição angular entre a solução
exacta e a numérica é: 0.000015
O erro efectivo do período da onda sinusoidal da velocidade angular entre a
solução exacta e a numérica é: 0.315430
Como podemos ver também o erro efectivo dos períodos é menor, como seria esperado.
Assim, podemos concluir que o método de Euler é tão mais eficaz quanto menor for a
variável h. No entanto, para valores muito pequenos de h, o esforço computacional
aumenta, diminuindo assim a eficiência desejada na aplicação destes métodos.
Um método numérico diz-se convergente se o erro global de discretização tender para
zero se o incremento de tempo (h) utilizado tender para zero. Podemos concluir
analisando os gráficos atrás apresentados que o erro global tende para zero quando h tende
para zero, assim, o método de Euler diz-se convergente.
5. Referências
[1] Pina, H., “Métodos Numéricos”, Escolar Editora, 2010.
[2] M. Teresa Diogo, Murilo Tomé. “Matemática Computacional- Notas de
Aulas”, secção de folhas do IST, IST, 2009.
Relatório do Projecto - Matemática Computacional
Mestrado Integrado em Engenharia Mecânica - 2013/14 9
[3] Mário Rosa, “Tópicos de análise numérica- métodos numéricos”,
Departamento de matemática, Universidade de Coimbra, 1992
Nota: Para a melhor visualização dos gráficos apresentados ao longo do documento, foi
necessário o incremento de número de páginas do relatório.
Anexo A - Como utilizar o programa
Para o utilizador utilizar o programa desenvolvido por nós, basta escrever “eulermenu”
no prompt do MatLab. Assim, aparece um menu com várias opções. A primeira opção,
“Inserir condições iniciais”, permite ao utilizador inserir os valores das condições
iniciais do problema em questão. A segunda opção, “Calcular solução numérica pelo
método de Euler progressivo”, calcula a solução aproximada da posição e velocidade
angular pelo método de Euler. A terceira opção, “Gráficos da posição e velocidade
angular em função do tempo (exactas e aproximadas)”, cria dois gráficos: o primeiro
relaciona a posição angular com o tempo de análise, tanto a solução exacta como a
solução numérica; o segundo relaciona da mesma forma a velocidade angular com o
tempo. A quarta opção, “Gráficos do erro global de discretização em função do tempo”,
cria dois gráficos, relacionando o erro global de discretização como tempo, para a
posição e velocidade angular. A quinta opção do menu, “Gráficos da posição e
velocidade angular (exactas) com barras de erro de discretização global”, cria dois
gráficos: um da posição angular (exacta) em função do tempo com as barras de erro
global de discretização em cada ponto; o segundo, procede da mesma maneira para a
velocidade angular. A sexta opção, “Gráficos do majorante do erro de truncatura em
função do tempo”, cria também dois gráficos que relacionam o majorante do erro de
truncatura com o tempo, para a posição e velocidade angular. A sétima opção, “Calcular
os períodos das ondas da posição e velocidade angular (exactas e aproximadas)”,
calcula os períodos das ondas da posição e velocidade angular, exactas e aproximadas, e
escreve no prompt do MatLab os respectivos valores. Por fim, a oitava opção, “Calcular
o erro efectivo dos períodos”, calcula o erro efectivo associado aos períodos das ondas
sinusoidais da posição e velocidade angular, exactas aproximadas, escrevendo no
prompt os respectivos valores.
Anexo B – Listagem do código em MatLab
%Menu para a implementação dos algoritmos
choice = menu('Método de Euler Progressivo','Inserir condições iniciais','Calcular solução numérica pelo
método de Euler progressivo','Gráficos da posição e velocidade angular em função do tempo(exactas e
aproximadas)','Gráficos do erro global de discretização em função do tempo','Gráficos da posição e
velocidade angular (exactas) com barras de erro de discretização global','Gráfico do majorante do erro de
truncatura em função do tempo','Calcular os períodos das ondas da posição e velocidade angular (exactas
e aproximadas)','Calcular o erro efectivo dos períodos','Sair');
switch choice
case 1
lerdados
eulermenu
case 2
euler
eulermen
case 3
sol
eulermenu
case 4
erroglobal
eulermenu
Relatório do Projecto - Matemática Computacional
Mestrado Integrado em Engenharia Mecânica - 2013/14 10
case 5
erro
eulermenu
case 6
errotruncatura
eulermenu
case 7
periodosposicao
periodovelocidade
eulermenu
case 8
erroefectivo
eulermenu
case 9
end
%-------------------------------------------------------------------------
%------------------------A1: Ler dados--------------------------------
%-------------------------------------------------------------------------
clear;
clc;
l = input('Tempo de análise(ex: 10) : ');
h = input ('Intervalo de tempo(ex: 0.001) : ');
ang = size(l);
vel = size(l);
ang(1) = input('Ângulo inicial(ex: pi/10) : ');
vel(1) = input('Velocidade inicial(ex: 0) : ');
g = 9.8;
R = 0.75;
r = 0.10;
p = g/((3/2)*(R-r));
%--------------------------------------------------------------------------
%------------A2: Implementação do método de Euler progressivo
%--------------------------------------------------------------------------
t = 0:h:l;
for i = 1:(length(t)-1)
ang(i+1) = ang(i) + vel(i)*h;
vel(i+1) = vel(i) - p*h*ang(i);
end;
%---------------------------------------------------------------------------------------
%------A3 Solução analítica da equação diferencial dada no enunciado-----
%---------------------------------------------------------------------------------------
omega = size(l);
pos = size(l);
pos(1) = ang(1);
omega(1) = vel(1);
c = ang(1);
m = 3.1704;
d = vel(1)/(m);
for i = 1:(length(t)-1)
pos(i+1) = c*cos(m*t(i+1)) + d*sin(m*t(i+1));
omega(i+1) = -m*c*sin(m*t(i+1)) + m*d*cos(m*t(i+1));
end
%-----------------------------------------------------------------------------------------
%------- Gráficos das soluções exactas e aproximadas (posição angular-------
%-------e velocidade angular) em função do tempo-------------------------------
%-----------------------------------------------------------------------------------------
figure(1)
subplot(1,2,1), plot(t,ang,'b',t,pos,'r--');
title('Posição Angular em função do tempo')
xlabel('Tempo,s')
ylabel('Deslocamento Angular, rad')
Relatório do Projecto - Matemática Computacional
Mestrado Integrado em Engenharia Mecânica - 2013/14 11
grid
legend ('Solução aproximada','Solução exacta')
subplot(1,2,2), plot(t,vel,'b',t,omega,'r--');
title('Velocidade Angular em função do tempo')
xlabel('Tempo,s')
ylabel('Velocidade Angular, rad/s')
grid
legend ('Solução aproximada','Solução exacta')
%--------------------------------------------------------------------------
%----------A4 Erro global de discretização da posição angular---
%--------------------------------------------------------------------------
erropos = size(pos);
for i=1:length(pos)
erropos(i) = abs(ang(i)-pos(i));
end
%----------------------------------------------------------------------------
%----------A4 Erro global de discretização da velocidade angular-
%----------------------------------------------------------------------------
erromega = size(omega);
for i=1:length(omega)
erromega(i) = abs(vel(i)-omega(i));
end
%--------------------------------------------------------------------------
%---------Gráficos do erro global de discretização (posição------
%---------e velocidade angular) em função do tempo--------------
%--------------------------------------------------------------------------
figure(2)
subplot(1,2,1), loglog(t,erropos,'r');
title('Erro global de discretização da posição angular em função do tempo')
xlabel('Tempo,s')
ylabel('Erro')
grid
subplot(1,2,2), loglog(t,erromega,'r');
title('Erro global de discretização da velocidade angular em função do tempo')
xlabel('Tempo,s')
ylabel('Erro')
grid
%--------------------------------------------------------------------------
%--------Gráficos da posição e velocidade angular (exactas)-----
%-------em função do tempo com barras de erro (erro de---------
%--------------discretização global)------------------------------------
%--------------------------------------------------------------------------
figure(3)
subplot(1,2,1), errorbar(t,pos,erropos);
title('Gráfico da posição angular (exacta) com barras de erro (erro de disctretização global)')
xlabel('Tempo,s')
ylabel('Posição angular, rad')
subplot(1,2,2), errorbar(t,omega,erromega);
title('Gráfico da velocidade angular (exacta) com barras de erro (erro de disctretização global)')
xlabel('Tempo,s')
ylabel('Velocidade angular, rad')
%--------------------------------------------------------------------------------------
%------A5 Majorante do erro de truncatura (posição angular)----------------
%--------------------------------------------------------------------------------------
errotruncang(1) = 0;
for i = 1:(length(t) - 1)
[xmax(i) ymax(i)] = fminbnd(@(x) -abs(-(m^2)*c*cos(m*x) - (m^2)*d*sin(m*x)),t(i),t(i+1));
ymax = abs([ymax]);
errotruncang(i+1) = ((h)/2)*ymax(i) ;
end
%---------------------------------------------------------------------------------------
%------A5 Majorante do erro de truncatura (velocidade angular)-------------
%---------------------------------------------------------------------------------------
errotruncvel(1) = 0;
Relatório do Projecto - Matemática Computacional
Mestrado Integrado em Engenharia Mecânica - 2013/14 12
for i = 1:(length(t)-1)
[x1max(i) y1max(i)] = fminbnd(@(x) -abs((m^3)*c*sin(m*x) - (m^3)*d*cos(m*x)),t(i),t(i+1));
y1max = abs([y1max]);
errotruncvel(i+1) = ((h)/2) * y1max(i) ;
end
%------------------------------------------------------------------------------------------
%-------Gráficos do majorante do erro de truncatura em função do tempo-----
%--------------(posição e velocidade angular)------------------------------
%--------------------------------------------------------------------------------
figure(4)
subplot(1,2,1), loglog(t,errotruncang,'r');
title('Majorante do erro de truncatura em cada passo da posição angular em função do tempo')
xlabel('Tempo,s')
ylabel('Majorante do erro de truncatura')
grid
subplot(1,2,2), loglog(t,errotruncvel,'r');
title('Majorante do erro de truncatura em cada passo da velocidade angular em função do tempo')
xlabel('Tempo,s')
ylabel('Majorante do erro de truncatura')
grid
%-----------------------------------------------------------------------------------------
%-------A6 Cáclulo do período da onda sinusoidal da posição angular--------
%----------------------(solução exacta)-----------------------------------------------
%-----------------------------------------------------------------------------------------
indices = zeros(1,length(t));
for i = 1:(length(t)-1)
if pos(i) > 0 && pos(i+1)<0
indices(i) = 1;
indices (i+1) =1;
end
end
[d] = find(indices == 1);
ta = (-pos(d(1)))/(pos(d(2))-pos(d(1)))*(t(d(2))-t(d(1))) + t(d(1)) ;
ta2 = (-pos(d(3)))/(pos(d(4))-pos(d(3)))*(t(d(4))-t(d(3))) + t(d(3)) ;
periodopos = ta2 - ta;
fprintf('O período da onda da posição angular(solução exacta) é: %f s \n',periodopos);
%-----------------------------------------------------------------------------------------
%-------A6 Cáclulo do período da onda sinusoidal da posição angular--------
%----------------------(solução numérica)-------------------------------------------
%-----------------------------------------------------------------------------------------
indices1 = zeros(1,length(t));
for i = 1:(length(t)-1)
if ang(i) > 0 && ang(i+1) < 0
indices1(i) = 1;
indices1(i+1) =1;
end
end
[g] = find(indices1 == 1);
z0 = (-ang(g(1)))/(ang(g(2))-ang(g(1)))*(t(g(2))-t(g(1))) + t(g(1)) ;
z1 = (-ang(g(3)))/(ang(g(4))-ang(g(3)))*(t(g(4))-t(g(3))) + t(g(3)) ;
periodoang = z1 - z0;
fprintf('O período da onda da posição angular(solução numérica) é: %f s \n',periodoang)
%-----------------------------------------------------------------------------------------
%-------A6 Cáclulo do período da onda sinusoidal da velocidade angular-----
%----------------------(solução exacta)------------------------------------------------
%------------------------------------------------------------------------------------------
ind = zeros(1,length(t));
for i = 1:(length(t)-1)
Relatório do Projecto - Matemática Computacional
Mestrado Integrado em Engenharia Mecânica - 2013/14 13
if omega(i) > 0 && omega(i+1) < 0
ind(i) = 1;
ind(i+1) = 1;
end
end
[u] = find(ind == 1);
p0 = (-omega(d(1)))/(omega(u(2))-omega(u(1)))*(t(u(2))-t(u(1))) + t(u(1)) ;
p1 = (-omega(u(3)))/(omega(u(4))-omega(u(3)))*(t(u(4))-t(u(3))) + t(u(3)) ;
periodomega = p1 - p0;
fprintf('O período da onda da velocidade angular(solução exacta) é: %f s \n',periodomega);
%--------------------------------------------------------------------------
%-------A6 Cáclulo do período da onda sinusoidal da velocidade angular-----
%----------------------(solução numérica)----------------------------------
%--------------------------------------------------------------------------
ind1 = zeros(1,length(t));
for i = 1:(length(t)-1)
if vel(i) > 0 && vel(i+1) < 0
ind1(i) = 1;
ind1(i+1) = 1;
end
end
[w] = find(ind1 == 1);
v0 = (-vel(w(1)))/(vel(w(2))-vel(w(1)))*(t(w(2))-t(w(1))) + t(w(1)) ;
v1 = (-vel(w(3)))/(vel(w(4))-vel(w(3)))*(t(w(4))-t(w(3))) + t(w(3)) ;
periodovel = v1 - v0;
fprintf('O período da onda da velocidade angular(solução numérica) é: %f s \n',periodovel);
%-----------------------------------------------------------------------------------
%----------------Erro efectivo do período (posição angular)----------------
%-----------------------------------------------------------------------------------
erroperiodopos = abs(periodoang - periodopos);
fprintf('O erro efectivo do período da onda sinusoidal da posição angular entre a solução exacta e a numérica é: %f
\n',erroperiodopos);
%------------------------------------------------------------------------------------
%----------------Erro efectivo do período (velocidade angular)-------------
%------------------------------------------------------------------------------------
erroperiodomega = abs(periodovel -periodomega);
fprintf('O erro efectivo do período da onda sinusoidal da velocidade angular entre a solução exacta e a numérica é: %f
\n',erroperiodomega);
Anexo C – soluções analíticas
Para a implementação do algoritmo A2, calculamos a solução analítica da equação
diferencial dada no enunciado. Assim, a solução para a posição angular é: pos(t) =
c*cos(m*t) + d*sin(m*t) (em função de t), sendo m=3.1704 (constante), c=ang(1) e d=
vel(1)/m.; para a velocidade angular: omega(t) = -m*c*sin(m*t) + m*d*cos(m*t).
Tanto ang(1) como vel(1) são condições iniciais indicadas pelo utilizador.
Na implementação do algoritmo A5 resolvemos também analiticamente a segunda e
terceira derivada de pos. Sendo que pos’’(t) = -(m^2)*c*cos(m*t) - (m^2)*d*sin(m*t) e
pos’’’(t) = (m^3)*c*sin(m*t) - (m^3)*d*cos(m*t). Note-se que c, d e m são os mesmo
que são usados no algoritmo A2.
Anexo D – Interpolação linear
Relatório do Projecto - Matemática Computacional
Mestrado Integrado em Engenharia Mecânica - 2013/14 14
Na implementação do algoritmo A6, utilizámos uma interpolação linear para
calcularmos os períodos. Usámos este método, pois o intervalo entre os pontos i e i+1, é
tão pequeno que o erro associado à interpolação linear é aceitável para o nosso
propósito. A interpolação linear pode definir-se assim: 𝑦𝑎−𝑦1
𝑦2−𝑦1=
𝑡𝑎−𝑡1
𝑡2−𝑡1 , sendo ya e ta os pontos entre y1 e y2, e t1 e t2, respectivamente.
Assim, queremos o ponto ta para o qual ya é igual a zero. Utilizando este método,
conseguimos calcular os períodos