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
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.
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.
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.
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.
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:
MATLAB
A estimativa de erro é dada por:
Tal que
Aparentemente teríamos quatro avaliações de função, mas perceba que o k1 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 yi+1 é aceito, e k4 torna-se k1 para o próximo passo. Caso contrário, o tamanho de passo é reduzido até que
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
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);
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)
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
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.
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
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).
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).
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
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
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)')
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.
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 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).
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
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.
=-Exemplo - Método Não Auto-Iniciado
de Heun
Exemplo - Método Não Auto-Iniciado
de Heun
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:
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 y0
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:
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:
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 é:
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:
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.
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.
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:
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:
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.
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? ^^).
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.
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:
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
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:
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.