método de euler progressivo

15
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: ________________________ ________________________ ________________________

Upload: rafael-lucas

Post on 23-Jul-2015

288 views

Category:

Education


4 download

TRANSCRIPT

Page 1: Método de Euler Progressivo

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:

________________________ ________________________ ________________________

Page 2: Método de Euler Progressivo

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.

Page 3: Método de Euler Progressivo

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

Page 4: Método de Euler Progressivo

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

Page 5: Método de Euler Progressivo

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:

Page 6: Método de Euler Progressivo

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:

Page 7: Método de Euler Progressivo

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:

Page 8: Método de Euler Progressivo

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)

Page 9: Método de Euler Progressivo

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.

Page 10: Método de Euler Progressivo

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

Page 11: Método de Euler Progressivo

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')

Page 12: Método de Euler Progressivo

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;

Page 13: Método de Euler Progressivo

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)

Page 14: Método de Euler Progressivo

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

Page 15: Método de Euler Progressivo

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