Você está na página 1de 46

Prof. MSc.

David Roza José


david.jose@luzerna.ifc.edu.br 1/46
Métodos Adaptativos
e Sistemas Rígidos
O intuito destas aulas é introduzir métodos mais avançados para a resolução de
problemas de valor inicial.
Objetivos:
– Compreender como os métodos Runge-Kutta Fehlberg utilizam os métodos de
RK de diferentes ordens para estimar o erro e adequar o tamanho de passo;
– Conhecer, saber ajustar e passar parâmetros para as funções do MATLAB de
resolução de EDOs;
– Compreender a diferença entre métodos de passo único e múltiplos passos de
resolução de EDOs;
– Compreender o significado de rigidez e qual sua implicação na resolução de
EDO’s.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 2/46
Métodos RK Adaptativos

Até o momento vimos métodos que empregam um tamanho constante de passo. Porém
para um número significativo de problemas, isto pode representar uma limitação séria.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 3/46
Métodos RK Adaptativos

A ideia então é ter um controle adaptativo do tamanho de passo. A implementação de


tais métodos necessita que uma estimativa do erro local de truncamento seja obtida
para cada passo. Esta estimativa serve então para aumentar ou diminuir o tamanho de
passo.
Que fique claro que além da solução de EDO’s, os métodos aqui descritos também
servem para se avaliar integrais definidas. A avaliação da integral definida:

é equivalente a resolver a equação diferencial abaixo para y(b) dado que a condição
inicial é y(a)=0.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 4/46
Métodos RK Adaptativos

Existem duas técnicas básicas para se incorporar o controle adaptativo do tamanho de


passo em métodos de passo único. O primeiro envolve reduzir o tamanho de passo à
metade: calcula-se uma vez para um tamanho de passo h, e depois duas vezes para um
tamanho de passo h/2. A diferença entre os dois resultados é uma estimativa do erro
local de truncamento. O tamanho do passo pode então ser ajustado baseado nesta
estimativa de erro.
O segundo é conhecido como método RK embutido, tal que o erro de truncamento é
estimado como a diferença entre duas estimativas utilizando métodos RK de diferentes
ordens. Este normalmente é mais utilizado por ser mais eficiente que a redução do passo
à metade.
Os métodos embutidos foram desenvolvidos por Fehlberg, por isso são normalmente
chamados de métodos RK-Fehlberg.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 5/46
Métodos RK Adaptativos

Num primeiro momento a ideia de se utilizar dois métodos de ordens diferentes pode
parecer computacionalmente oneroso. Uma predição de quarta ordem e outra de quinta
totalizariam uma quantidade de 10 avaliações de função por passo.
Fehlberg evitou este contratempo ao desenvolver um método RK de quinta ordem que
utiliza a maioria das mesmas avaliações de função que seriam necessárias ao método de
quarta ordem. Assim, o método resulta numa estimativa de erro baseada em somente
seis avaliações de função.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 6/46
MATLAB

Desde o método original desenvolvido por Fehlberg, outros métodos superiores foram
desenvolvidos. Vários deles estão disponíveis no MATLAB, todos para sistemas não
rígidos.
ode23 – Esta função utiliza o algoritmo BS23 (Bogacki e Shampine, 1989; Shampine,
1994), que utiliza simultaneamente fórmulas RK de segunda e terceira ordem para
resolver a EDO e fazer a estimativa de erro para ajustar o tamanho do passo. As fórmulas
são:

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 7/46
MATLAB

A estimativa de erro é dada por:

Tal que

Aparentemente teríamos quatro avaliações de função, mas perceba que o k 1 do próximo


passo é o k4 deste passo. Assim este método fornece uma estimativa do próximo passo e
do erro baseados em 3 avaliações de função, ao invés de cinco que normalmente
resultaria da aplicação de um método RK de segunda ordem (duas avaliações) e um
método RK de terceira ordem (três avaliações). Após cada passo, o erro é conferido para
verificar se está dentro da tolerância desejada. Caso sim, o valor para y i+1 é aceito, e k4
torna-se k1 para o próximo passo. Caso contrário, o tamanho de passo é reduzido até que
o critério da estimativa de erro seja satisfeito.
Prof. MSc. David Roza José
david.jose@luzerna.ifc.edu.br 8/46
MATLAB

ode45 – Esta função utiliza o algoritmo desenvolvido por Dormand e Prince, 1980, que
utiliza simultaneamente um método RK de quarta e quinta ordem (45) para resolver uma
EDO e efetuar a estimativa de erro para o ajuste do tamanho do passo. A recomendação
do MATLAB é de sempre utilizar esta função como uma primeira tentativa para a maioria
dos problemas.
ode113 – Esta função utiliza o método de ordem variável de Adams-Bashforth-Moulton.
É útil para baixas tolerâncias de erro e para EDOs computacionalmente custosas. É um
método de passos múltiplos, que será explicado em breve.
Todas as funções apresentadas podem ser chamadas da maneira genérica:
[t, y] = ode45(fun, tspan, y0)
Tal que y é o vetor solução, sendo cada coluna uma das variáveis dependentes, e cada
linha corresponde a um instante de tempo no vetor coluna t. fun é o nome da função
que retorna um vetor coluna representando o lado direito da igualdade da EDO, e tspan
especifica o intervalo de integração e y0 contém os valores iniciais.
Prof. MSc. David Roza José
david.jose@luzerna.ifc.edu.br 9/46
MATLAB

O vetor tspan pode ser formulado de duas maneiras:


tspan = [ti tf];
A integral é realizada de ti até tf. A segunda maneira é utilizada para se obter soluções
em tempos específicos t0, t1, …, tn (sempre monotônico)
tspan = [t0 t1 ... tn];
Um exemplo de como utilizar o MATLAB para resolver uma única EDO, tomando por base
a equação que temos tratado nas últimas aulas. A integraremos de t=0 até t=4, com a
condição inicial de y(0)=2.

dydt = @(t,y) 4*exp(0.8*t)-0.5*y;


[t,y] = ode45(dydt,[0 4],2);
y(length(t))

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 10/46
MATLAB – Exemplo 1

Utilizaremos o MATLAB para mostrar como resolver um sistema de equações,


integrando-as de t=0 até t=20, tendo como condições iniciais y1=2 e y2=1 em t=0.

Estas são equações do tipo predador-presa.


Precisamos, num primeiro momento, criar uma função que calcule o valor do lado direito
das EDO’s (que calcule o valor da derivada, da inclinação). Podemos fazer isso criando um
arquivo .m, ou passando como função anônima.
Arquivo .m
function yp = predprey(t,y)
yp = [1.2*y(1)-0.6*y(1)*y(2);-0.8*y(2)+0.3*y(1)*y(2)];
end

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 11/46
MATLAB

E a solução seria invocada como


tspan = [0 20];
y0 = [2, 1];
[t,y] = ode45(@predprey, tspan, y0);
Para se utilizar como função anônima:
tspan = [0 20];
y0 = [2, 1];
pp1 = @(t,y) [1.2*y(1)-0.6*y(1)*y(2);-0.8*y(2)+0.3*y(1)*y(2)];
[t1,y1] = ode45(pp1, tspan, y0);
E podemos gerar uma figura no domínio do tempo e um de fase.
plot(t1,y1);
figure
plot(y1(:,1),y1(:,2));

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 12/46
MATLAB

O MATLAB costuma usar parâmetros padrão para controlar vários aspectos da


integração. Podemos alterar diversas opções através de parâmetros adicionais na
chamada da função de solução da EDO:
[t, y] = ode45( fun, tspan, y0, opc, p1, p2, …)
Tal que opc é uma estrutura de dados criada com a função odeset que controla diversos
parâmetros do solver, e p1, p2, …, são parâmetros que podem ser passados para a
função que está sendo resolvida.
A sintaxe geral da função odeset tem a seguinte forma:
opc = odeset('par1', val1, 'par2', val2, ... )

Uma lista completa de todos os parâmetros pode ser obtida ao se digitar odeset no
console.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 13/46
MATLAB

Alguns parâmetros comuns são dados por:


'RelTol' Tolerância relativa
'AbsTol' Tolerância absoluta
'InitialStep' Determina qual o tamanho de passo inicial
'MaxStep' Determina qual o maior tamanho de passo que pode ser utilizado.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 14/46
MATLAB – Exemplo 2

Utilizaremos o solver ode23 para resolver uma EDO de t=0 até t=4, tal que y(0)=0.5, com
um erro relativo padrão (10-3) e outro mais rigoroso (10-4).

Verificar o arquivo exemplo2.m.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 15/46
Eventos

As funções de solução de EDO do MATLAB são normalmente implementadas para um


intervalo de integração prescrito, ou seja: são utilizados para se obter a solução de um
instante inicial até um instante final. Entretanto existem problemas onde não sabemos o
tempo final.
O problema do saltador de bungee-jump é um deles: vamos supor que o saltador,
inadvertidamente, salte sem a corda que o segura. O tempo final, neste caso,
corresponde ao instante do impacto do saltador no chão – e não é uma informação que
possuímos. Neste caso o objetivo de se resolver a EDO é determinar quando o saltador
atinge o chão.
A opção events do MATLAB serve para resolver tais problemas. Ela resolve uma EDO até
que uma das variáveis dependentes atinja zero (entre outras opções).

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 16/46
MATLAB – Exemplo 3

Resolveremos o problema do saltador de Bungee-Jump, que tem o seguinte conjunto de


EDOs:

Deve-se expressar o sistema de EDOs como uma função num arquivo .m


function dydt=freefall(t,y,cd,m)
% y(1) = x e y(2) = v
grav=9.81;
dydt=[y(2); grav-cd/m*y(2)*abs(y(2))];
end

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 17/46
MATLAB – Exemplo 3

Para este problema desenvolvemos uma função para o evento, chamada de endevent,
que pode ser escrita como:
function [detect,stopint,direction]=endevent(t,y,varargin)
% Localiza quando a altura passa de zero e interrompe a integração.
detect=y(1); % Detecta altura = 0
stopint=1; % Para a integração
direction=0; % Direção não importa
end
Esta função poderia ter qualquer nome, mas deve conter os campos detect, stopint e
direction. Esses campos especificam opções para o MATLAB efetuar a operação. detect
carrega qual variável deve ser monitorada até que atinja o valor zero; caso desejássemos
uma altura diferente (por exemplo, 5 metros) escreveríamos detect = y(1) -5;. stopint
define que a integração deve ser parada; e direction tem o valor zero caso qualquer zero
deva ser detectado, +1 caso somente os zeros onde a função é crescente devam ser
detectados e -1 caso somente zeros onde a função é decrescente devam ser detectados.
Prof. MSc. David Roza José
david.jose@luzerna.ifc.edu.br 18/46
MATLAB – Exemplo 3

Por fim, necessitamos de um script para gerar a solução e chamar o solver com as opções
adequadas.
opts=odeset('events',@endevent);
y0=[-200 -20];
[t,y,te,ye]=ode45(@freefall,[0 inf],y0,opts,0.25,68.1);
te,ye
plot(t,-y(:,1),'-',t,y(:,2),'--','LineWidth',2)
grid on
legend('Altura (m)','Velocidade (m/s)')
xlabel('tempo (s)');
ylabel('x (m) and v (m/s)')

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 19/46
Métodos de Passos Múltiplos

Os métodos de passo único descritos anteriormente utilizam informação em um único


ponto ti para prever o valor da variável dependente yi+1 num ponto futuro ti+1. Métodos
alternativos, chamados de métodos de passos múltiplos, são baseados na observação
de que, uma vez que o cálculo se inicia, informações valiosas dos pontos anteriores estão
disponíveis.
A curvatura das linhas unindo os valores prévios fornecem informação a respeito da
trajetória da solução. Métodos de passos múltiplos exploram estas informações para
resolver EDOs.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 20/46
Métodos de Passos Múltiplos

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 21/46
Método Não Auto-Iniciado de Heun

O método de Heun utiliza o método de Euler como um preditor:

E a regra trapezoidal como um corretor:

Assim, o preditor e o corretor possuem erros de truncamento local de O(h2) e O(h3),


respectivamente. Isto sugere que o preditor é o “elo fraco” por possuir o maior erro. Esta
fraqueza é significativa porque a eficiência do corretor iterativo depende da precisão da
previsão inicial. Assim, uma maneira de melhorar o método de Heun é desenvolver um
preditor cujo erro local de truncamento seja O(h3). Isto pode ser feito ao se utilizar o
método de Euler e a inclinação em yi, mais a informação do ponto anterior yi-1, tal que:

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 22/46
Método Não Auto-Iniciado de Heun

Esta fórmula atinge precisão de O(h3) ao custo de empregar um tamanho de passo maior,
2h. Além disso a equação não é auto-iniciada pois envolve um valor anterior da variável
dependente yi-1. Tal valor não estaria disponível num problema típico de valor inicial. Por
causa disso, o método é chamado de não auto-iniciado. Através deste método, a
estimativa da inclinação é feita no meio do intervalo – ao invés de ser no início – e tal
centralização melhora o erro local do preditor para O(h3).

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 23/46
Método Não Auto-Iniciado de Heun

Assim, o método pode ser resumido através da equação preditora e corretora como:

tal que os índices superiores indicam que o corretor é aplicado iterativamente de j=1 até
m para se obter soluções refinadas. As iterações são finalizadas baseadas numa
estimativa do erro aproximado.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 24/46
Exemplo - Método Não Auto-Iniciado
de Heun
Utilizar o Método Não Auto-Iniciado de Heun para integrar a equação abaixo de t=0 até
t=4, com um tamanho unitário de passo. A condição inicial é y(0)=2. A informação
adicional necessária é que y(-1)=-0.3929953.

O preditor é utilizado para extrapolar linearmente de t=-1 até t=+1.

Note que y1 refere-se a t1=-1s; y2 refere-se a t2=0s; y3 refere-se a t1=1s; y4 refere-se a t4=-
2s;e assim sucessivamente.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 25/46
Exemplo - Método Não Auto-Iniciado
de Heun
Utiliza-se o corretor iterativamente para calcula o valor de yi+1:

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 26/46
Exemplo - Método Não Auto-Iniciado
de Heun
Para a segunda iteração:

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 27/46
Exemplo - Método Não Auto-Iniciado
de Heun
O método é aplicado continuamente até que o erro aproximado seja menor que o valor
estimado. Ao se convergir o resultado para y1, aplica-se novamente o preditor para y2 e
utiliza-se o corretor até atingir a convergência, e assim sucessivamente. Com
e_a=0.00001, temos:

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 28/46
Estimativa de Erro

Além de fornecer mais eficiência, o método não auto-iniciado de Heun também pode ser
utilizado para estimar o erro de truncamento. Assim como os métodos adaptativos, a
estimativa de erro pode fornecer um critério para a mudança do tamanho de passo.
Uma estimativa do erro local de truncamento para este método é dada por:

tal que y0i+1 é o valor do preditor, e ymi+1 é o valor do corretor.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 29/46
Exemplo - Estimativa de Erro

Utilizaremos dados do problema anterior para estimar o erro local de truncamento. O


preditor do primeiro passo e o corretor convergido forneceram:

Para o segundo passo:

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 30/46
Exemplo - Estimativa de Erro

Comparando-se, então, os erros de truncamento com os erros exatos – ou seja, com a


diferença entre o corretor convergido de cada passo de tempo e a solução exata, temos:

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 31/46
Rigidez

A rigidez é um problema que pode surgir na solução de equações diferenciais ordinárias.


Um sistema rígido é aquele que envolve componentes que mudam rapidamente com
outros que mudam lentamente. Em alguns casos os componentes que variam
rapidamente são transientes efêmeros, após isso a solução torna-se dominada por
componentes que variam lentamente. Apesar do fenômeno transiente existir por um
curto período do intervalo de integração, eles podem ditar o tamanho do passo para
toda a solução.
Tanto um sistema como uma única EDO podem ser rígidos. Um exemplo é:

caso consideremos que y(0)=0, a solução analítica torna-se:

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 32/46
Rigidez

A solução é inicialmente dominada pelo termo exponencial rápido (exp(-1000t)). Após


um curto período de tempo ( t < 0.005 ), o transiente “some”, e a solução torna-se
dominada pelo termo exponencial lento (exp(-t)).
Um entendimento do tamanho de passo necessário para estabilidade de tal solução
pode ser vista observando-se a parte homogênea da EDO:

Vimos que a estabilidade depende claramente do tamanho de passo h.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 33/46
Rigidez

Para a parte transiente rápida, o critério de estabilidade é que hmin=0.002. Nota-se que
apesar deste critério manter a estabilidade, ele não garante que a solução será precisa.
Um tamanho de passo ainda menor seria necessário para tal.
O transiente rápido, apesar de ocupar uma pequena fração do intervalo de integração,
controla o tamanho máximo de passo.
Mostrar rk4ordem alterando o tamanho do passo para solução da EDO.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 34/46
Rigidez

Ao invés de se utilizar métodos explícitos – onde existem diversas condições para


estabilidade; pode-se utilizar um método implícito.
O método implícito possui esta nomenclatura porque as incógnitas aparecem em ambos
os lados da equação. Uma forma implícita do método de Euler pode ser desenvolvido ao
se avaliar a inclinação num tempo futuro:

Esta abordagem, chamada de método de Euler para trás, resulta em:

Assim, independentemente do tamanho do passo h, o método é incondicionalmente


estável.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 35/46
Exemplo – Euler Implícito e Explícito

Utilizaremos o método de Euler para resolver a equação a seguir com y(0)=0. Para o
método explícito, h=0.0005 e h=0.0015 para integrar entre t=0 e t=0.006. Para o método
implícito, h=0.05 para t=0 e t=0.4.

Para o método de Euler explícito, a equação de recorrência torna-se:

E os resultados podem ser observados no próximo slide:

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 36/46
Exemplo – Euler Implícito e Explícito

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 37/46
Exemplo – Euler Implícito e Explícito

No método explícito, temos que:

Pelo fato da função ser linear, podemos isolar yi+1 (o quê nem sempre é possível fazer), e
assim obter um formato explícito para o mesmo:

No próximo slide pode ser observado o comportamento do método para um h=0.05.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 38/46
Exemplo – Euler Implícito e Explícito

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 39/46
Rigidez

Sistemas de EDOs também podem ser rígidos. Um exemplo é dado por:

Para as condições iniciais de y1(0)=52.29 e y2(0)=83.82, a solução exata é:

Os expoentes são negativos e diferem em cerca de duas ordens de magnitude. Assim


como para o exemplo de uma equação, expoentes grandes que acabam implicando na
rigidez.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 40/46
Rigidez

Um método de Euler implícito para o sistema pode ser formulado como:

Rearranjando os termos obtém-se:

Ou seja, o problema acaba consistindo na resolução de um sistema linear para cada


passo de tempo. Para EDOs não lineares a solução torna-se ainda mais complexa, pois
envolve a resolução de um sistema não linear de equações (Matriz Jacobiana? ^^).
Assim, apesar de se estabilidade através dos métodos implícitos, paga-se um preço na
forma de uma complexidade excedente.
Prof. MSc. David Roza José
david.jose@luzerna.ifc.edu.br 41/46
MATLAB

O MATLAB possui diversas funções para resolver sistemas de EDOs rígidas. São elas:
ode15s. Aplica um método de ordem variável baseado em diferenciação numérica. É um
solver de passos múltiplos que oferece precisão média a baixa.
ode23s. Baseada na fórmula de Rosenbrock de ordem 2. Por ser um método de passo
único, pode ser mais eficiente que ode15s para tolerâncias grosseiras.
ode23t. Implementa a regra trapezoidal com um interpolante “livre”. É utilizada para
problemas moderadamente rígidos com baixa precisão onde a solução não pode
apresentar amortecimento numérico.
ode23tb. Aplica um método implícito RK, podendo ser mais eficiente que ode15s para
tolerâncias grosseiras.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 42/46
Exemplo – ODEs Rígidas

A equação de van der Pol é um modelo de um circuito eletrônico que surgiu na época
das válvulas. A solução desta equação torna-se progressivamente rígida conforme mu
torna-se maior. Para y1(0)=dy1/dt=1, utilizaremos o MATLAB para resolver: (a) mu=1, com
o ode45 de t=0 até t=20. (b) para mu=1000, utilizar ode23s para resolver de t=0 até
t=6000.

O primeiro passo é converter esta EDO de segunda ordem em um par de EDOs de


primeira ordem através de:

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 43/46
Exemplo – EDOs Rígidas

Criamos, então, uma função anônima para passar as EDO’s


yp = @(t,y,mu) [y(2); mu*(1-y(1)^2)*y(2)-y(1)];
O solver pode então ser chamado através da função solicitada:
[t, y] = ode45(yp, [0 20], [1 1], [], 1);
plot(t,y(:,1),'-',t,y(:,2),'--');
legend('y1','y2');
grid on
Tentaremos também resolver com mu=1000;
[t, y] = ode45(yp, [0 6000], [1 1], [], 1000);
plot(t,y(:,1));
grid on

(w8 until eternity)

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 44/46
Exemplo – EDOs Rígidas

Porém, o solver ode23s não enfrenta os mesmos problemas:


[t, y] = ode23s(yp, [0 6000], [1 1], [], 1000);
plot(t,y(:,1));
grid on

Sugestão de leitura:
Estudo de Caso: O Chafariz Intermitente de Pliny (pp628)

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 45/46
Informações

Exercícios pp628
23.2 23.3 23.15 23.19
Programar o algoritmo BS23 e utilizar para a resolução do exercício 23.2.
Programar o algoritmo de Heun não auto-iniciado e utilizar para a resolução do exercício
23.3.
Para os problemas 23.15 e 23.19, utilizar um dos dois algoritmos anteriores.

Prof. MSc. David Roza José


david.jose@luzerna.ifc.edu.br 46/46