Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
é equivalente a resolver a equação diferencial abaixo para y(b) dado que a condição
inicial é y(a)=0.
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.
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:
Tal que
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
Uma lista completa de todos os parâmetros pode ser obtida ao se digitar odeset no
console.
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).
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)')
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).
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.
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.
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:
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.
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.
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:
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.
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.
Sugestão de leitura:
Estudo de Caso: O Chafariz Intermitente de Pliny (pp628)
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.