Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Fsica Computacional A
DFAT/
FiscompFA
Estagirios:
2004/1 a 2005/2 Luciana Conceio Iecker Lima
2010/1
Magali dos Santos Leodato
2009/1 a 2010/2 Filipe da Fonseca Cordovil
Monitores:
2001/1
2002/2
2003/1 a 2003/2
2003/1 a 2003/2
2003/1 a 2005/2
2004/1 a 2005/2
2006/1 a 2007/2
2006/1 a 2007/2
2008/1 a 2008/2
2008/1 a 2009/2
2011/1 a
1. Introduo
O mtodo de Euler o mtodo numrico mais simples que pode ser usado para resolver uma equao
diferencial ordinria de primeira ordem ( Equao Diferencial Ordinria EDO).
Uma equao diferencial ordinria uma equao que envolve s uma varivel independente. Por exemplo, a
equao diferencial que descreve o movimento de um pndulo simples de massa m e comprimento l
2
d g
sen =0
2
l
dt
d
g
= sen
2
l
dt
ou
que uma equao diferencial ordinria de primeira ordem pois a nica varivel independente o tempo.
As equaes
dy
=x8
dx
d2 y
dy
3 2y=0
2
dx
dx
d3 y
d2 y
dy
2
=cos x
3
2
dx
dx
dx
dy
x y=3
dx
2
d2y
dy
z
z
z x
=0
x
y
2 z 2 z
2 = x 2 y no so, pois possuem duas variveis independentes x e y.
2
x y
enquanto as equaes
Tipo
podem ser ordinrias ou parciais. Ordinrias quando as funes forem somente funes de uma
varivel, por exemplo: y= f x . Parciais quando as funes forem funes de mais de uma
varivel independente: z = f x , y
Ordem
pode ser de 1a, 2a , 3a, , ensima ordem, dependendo da derivada de maior ordem presente na
2
equao. A equao
d
g
= sen uma equao diferencial ordinria de segunda ordem
2
l
dt
Linearidade
Ser linear quando as incgnitas e suas derivadas aparecem de forma linear na equao e no
dy
y=3 uma equao diferencial ordinria de primeira
dx
Equaes diferenciais ordinrias de primeira ordem so equaes que podem ser escritas assim:
ou ento
F t , y , y ' =0
ou
dy
= f t , y
dt
F x , y , y '=0
ou
dy
= f x , y
dx
2. Mtodo de Euler
Vrios problemas encontrados na fsica envolvem equaes diferenciais ordinrias de primeira ordem, por
exemplo:
movimento de projtil
movimento harmnico
so exemplos clssicos.
O mtodo de Euler (mtodo de Euler padro; mtodo de Euler progressivo; Forward Euler method ) para uma equao
diferencial ordinria de primeira ordem pode ser apresentado assim:
Considere a equao diferencial
dy
= f x , y onde x e y so as variveis independentes e dependentes e
dx
f x , y a funo derivada.
A funo derivada pode ser determinada usando-se as diferenas finitas, ento:
y i1 y i
y y
dy
y
= lim
= lim
=lim i1 i
dx x 0 x x 0 x i1 xi h 0
h
onde se fez x= h=x i1xi
dy y i1 y i
dx
h
portanto, considerando a derivada como sendo representada pela sua expresso aproximada pode-se escrever:
f x , y =
y i1 y i
h
y i1= yi h f x i , yi
Esta forma de chegar ao novo valor de y, o valor y i1 , conhecido o valor anterior, y i , chamada de
mtodo de Euler (Euler padro ou Euler progressivo).
No problema do valor inicial (Problema do Valor Inicial PVI)
dy
= f x , y
dx
y x 0 = y 0 valores iniciais:
x0, y0
y i1= y ih f x i , y i
00 atividades exemplos
Atividade 01
Entregar em meio magntico:
1.
programa:
euler1_prog
fxxa1.f03
2.
mdulos:
fc_constantes.f03
m_rotinas.f03
m1func.f03
3.
scripts:
euler1.plt
4.
arquivos:
euler1-h05.dados
euler1-h02.dados
euler1-h005.dados
euler.gif
Exemplo/Acrscimo/Ajuste:
Exemplifica o uso do mtodo de Euler progressivo para a soluo de equao diferencial ordinria com valor inicial especificado
Observao:
As solues, exata e as numricas so colocadas num mesmo grfico para evidenciar o erro nos valores da soluo,
conforme h vai aumentando
Fazer:
a1.1) Gere os arquivos de dados euler1-h05.dados, euler1-h02.dados e euler1-h005.dados contendo a soluo do problema
do valor inicial:
dy
=cos 4x x 2
dx
y x 0 = y 0=2
1
1
y=2 x 3 sin 4x
3
4
dv
=g
dt
gravidade vale g=9.8067 m/s2. Calcule v como funo da velocidade para um corpo com (a) saindo do repouso e (b) com
velocidade inicial diferente de zero, no intervalo de t=o at t=10s. Construa o grfico com a soluo numrica e a soluo
analtica.
a1.3) um corpo move-se segundo a equao
dx
=v x
dt
dI
=aI bI 2
dt
corresponde ao nmero de nascimentos e -bI2 o nmero de mortes. Solucione o problema (a) com b=0 e (b) com a=10 e b=3
program euler1_prog
!
!------------------------------------------------------------------------! Propsito: Constri tabela de valores (x,y) soluo da equao
!
diferencial ordinria de 1a ordem com valor inicial y0
! utilizando o mtodo de Euler (Euler progressivo)
!------------------------------------------------------------------------! Arquivo:fxxa1.f03
!
Autor: Anibal L. Pereira
14/02/2009
!Revises:
!------------------------------------------------------------------------use fc_constantes
use fc_rotinas
use fc_m1func
implicit none
integer::i,
& !contador
npassos
! nmero de passos inteiros
real::x0,y0,
& ! valor inicial
a,b,
& ! intervalo - ponto inicial e ponto final
h,
& ! incremento h
delta
! incremento mais prximo de h
real,allocatable,dimension(:)::xt,yt
!pontos da tabela
!--------------------------------------------------! Entrada pontos da tabela
!--------------------------------------------------print*, "===================================="
print*, "Entre com o valor inicial x(0) e y(0)"
print*, "===================================="
read*, x0,y0
print*, "===================================="
print*, "Entre com o valor intervalo: A B "
print*, "===================================="
read*, a,b
_______________________________________________________________________________________
arquivo: fc_constantes.f03
Utilize os mdulos existentes:
_______________________________________________________________________________________
arquivo: fc_rotinas.f03
module fc_rotinas
!------------------------------------------------------------------------------!Propsito:
! Guarda funes e sub-rotinas
!------------------------------------------------------------------------------!USO:
! Coloque no seu programa fonte as declaraes
!
use fc_constantes
!
use fc_rotinas
!
!COMPILAO:
! (1) deste mdulo fiscomp_rotinas
!
f03 -c fc_constantes.o fc_rotinas
!
! (2) para usar o mdulo com o programa <prog.f03>
!
f03 -o <prog> fc_constantes.o fc_rotinas.o <prog.f03>
!------------------------------------------------------------------------------! Arquivo: fc_rotinas.f03
!
Autor: Anibal L. Pereira 23/01/2009
!Revises: Anibal L. Pereira 11/02/2009
!Revises: Anibal L. Pereira 16/04/2010
!
!------------------------------------------------------------------------use fc_constantes
implicit none
!------------------------------------------------------------------------! Interfaes
(funes e sub-rotinas sobrecarregadas)
!-------------------------------------------------------------------------
interface copia_matriz
module procedure
copia_matriz_i, copia_matriz_r, copia_matriz_d
end interface
interface swap
module procedure
end interface
interface incremento
module procedure
end interface
interface entra_linha_matriz
module procedure
entra_linha_matriz_t, entra_linha_matriz_a
end interface
!------------------------------------------------------------------------! Funes
!------------------------------------------------------------------------public:: derivada
!------------------------------------------------------------------------! Sub-rotinas
!------------------------------------------------------------------------public:: gauss,
& !gauss elimination AX=B
entra_linha_matriz,
& !entra linha de uma matriz
!rotina sobrecarregada
!1)entra_linha_matriz_t(mat)
!
entra linha da matriz pelo teclado
!2)entra_linha_matriz_a(mat,arq)
!
entra linha da matriz via arquivo
inversa_matriz,
& !inversa matriz - mtodo eliminao Gauss
copia_matriz,
& !copia matriz em outra matriz
!rotina sobrecarregada
!1)copia_matriz(src,dest,n_cop,n_ncop)
!
copia matriz de valores inteiros
!2)copia_matriz(src,dest,n_cop,n_ncop)
!
copia matriz de valores reais, sp
!3)copia_matriz(src,dest,n_cop,n_ncop)
!
copia matriz de valores reais, dp
swap,
& !troca valores
!rotina sobrecarregada
!1)swap(a,b)
!
troca valores inteiros
!2)swap(a,b)
!
troca valores reais, sp
!3)swap(a,b)
!
troca valores de vetor reais, sp
!4)swap(a,b)
!
troca valores complexos, sp
!5)swap(a,b)
!
troca valores de vetor complexo, sp
incremento,
& !calcula incremento e gera vetor de pontos
!rotina sobrecarregada
!1)incremento(a,b,incr,ninterv,incrp)
!
retorna nmero de intervalos inteiro para a-b e incremento
!(ou incremento prximo)
!2)incremento(a,b,vet)
!
Retorna um vetor com 100 pontos no intervalo a-b
!3)incremento(a,b,incrp,vet)
!
Retorna um vetor com os N pontos gerados pelo incremento em a-b
interp_lagrange,
& !interpolao polinomial de Lagrange
interp_newton,
& !interpolao polinomial diferenas divididas
interp_polinomial,
& !interpolao polinomial diferenas divididas
! similar ao (Numerical Recipes)
dif_finita_asc,
& !constri tabela de diferenas finitas ascendente
dif_divididas_asc,
& !constri tabela de diferenas divididas ascendente
! incrementos desiguais
bissecao,
& !zero de funo pelo mtodo da bisseo
newton_raphson,
& !zero de funo pelo mtodo de Newton-Raphson
integ_trapezio,
& !integral definida entre a e b pelo mtodo trapzio
simpson_1_3,
& !integral definida entre a e b pelo mtodo simpson 1/3
der1,
& !derivada primeira da funo usando diferena central
!ok
!ok
!ok
!ok
!ok
!ok
!ok
!ok
!ok
!ok
!ok
!ok
!ok
!ok
!ok
der2,
fit_poli,
euler1_tab,
euler2_tab,
euler_mod_tab
! 3-pontos
& !derivada segunda da funo usando diferena central
! 3-pontos
& !ajuste mnimos quadrados
& !tabela com soluo EDO 1a ordem
! PVI - Euler progressivo
& !tabela com soluo EDO 2a ordem
! PVI - Euler progressivo
!tabela com soluo EDO 1a ordem
! PVI - Euler modificado
contains
!!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!!@@@@@@@@@@@@@@@@@@@@
SUB-ROTINAS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!@@@@@@@@@
!-----------------------------------------------------------------------------subroutine copia_matriz_i(src,dest,n_cop,n_ncop)
!-----------------------------------------------------------------------------!Propsito:
! Copia matriz do tipo inteiro de qualquer tamanho
! Adaptao de sub-rotina do numerical recipes
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
26/01/2009
!Revises:
!-----------------------------------------------------------------------------!DEPENDNCIA:
![
mdulos]: nenhum
![
funes]: nenhuma
![sub-rotinas]: nenhuma
!-----------------------------------------------------------------------------!Argumentos:
! copia_matriz_i(src,dest,n_cop,n_ncop)
!
! src
!
(in) matriz inteira
!
matriz original
! dest
!
(out) matriz inteira
!
matriz copiada
! n_cop
!
(out) inteiro
!
nmero de elementos copiados
! n_ncop
!
(out) inteiro
!
nmero de elementos no copiados
!-----------------------------------------------------------------------------integer,intent(in) ,dimension(:)::src ! fonte
integer,intent(out),dimension(:)::dest ! copia
integer,intent(out)::n_cop,
& ! nmero de dados copiados
n_ncop
! nmero de dados no copiados
n_cop = min(size(src),size(dest))
n_ncop = size(src)- n_cop
dest(1:n_cop) = src(1:n_cop)
end subroutine copia_matriz_i
!@@@@@@@@@
!-----------------------------------------------------------------------------subroutine copia_matriz_r(src,dest,n_cop,n_ncop)
!-----------------------------------------------------------------------------!Propsito:
! Copia matriz do tipo real de preciso simples de qualquer tamanho
! Adaptao de sub-rotina do numerical recipes
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
26/01/2009
!Revises:
!-----------------------------------------------------------------------------!DEPENDNCIA:
7
!ok
!ok
!ok
!ok
!ok
!ok
![
mdulos]: nenhum
![
funes]: nenhuma
![sub-rotinas]: nenhuma
!-----------------------------------------------------------------------------!Argumentos:
! copia_matriz_r(src,dest,n_cop,n_ncop)
!
! src
!
(in) matriz real
!
matriz original
! dest
!
(out) matriz real
!
matriz copiada
! n_cop
!
(out) inteiro
!
nmero de elementos copiados
! n_ncop
!
(out) inteiro
!
nmero de elementos no copiados
!-----------------------------------------------------------------------------real,intent(in) ,dimension(:)::src ! fonte
real,intent(out),dimension(:)::dest ! copia
integer,intent(out)::n_cop,
& ! nmero de dados copiados
n_ncop
! nmero de dados no copiados
n_cop = min(size(src),size(dest))
n_ncop = size(src)- n_cop
dest(1:n_cop) = src(1:n_cop)
end subroutine copia_matriz_r
!@@@@@@@@@
!-----------------------------------------------------------------------------subroutine copia_matriz_d(src,dest,n_cop,n_ncop)
!-----------------------------------------------------------------------------!Propsito:
! Copia matriz do tipo real de preciso dupla de qualquer tamanho
! Adaptao de sub-rotina do numerical recipes
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
26/01/2009
!Revises:
!-----------------------------------------------------------------------------!DEPENDNCIA:
![
mdulos]: nenhum
![
funes]: nenhuma
![sub-rotinas]: nenhuma
!-----------------------------------------------------------------------------!Argumentos:
! copia_matriz_d(src,dest,n_cop,n_ncop)
!
! src
!
(in) matriz real,dp
!
matriz original
! dest
!
(out) matriz real,dp
!
matriz copiada
! n_cop
!
(out) inteiro,I4B
!
nmero de elementos copiados
! n_ncop
!
(out) inteiro
!
nmero de elementos no copiados
!-----------------------------------------------------------------------------real(kind=dp),intent(in) ,dimension(:)::src ! fonte
real(kind=dp),intent(out),dimension(:)::dest ! copia
integer,intent(out)::n_cop,
& ! nmero de dados copiados
n_ncop
! nmero de dados no copiados
n_cop = min(size(src),size(dest))
n_ncop = size(src)- n_cop
dest(1:n_cop) = src(1:n_cop)
end subroutine copia_matriz_d
!@@@@@@@@@
10
11
12
tm,
& ! valor temporrio para troca
va
!-----------------------------------------------------------------------------!----------------------------------! Determina psilon da mquina
!----------------------------------eps=epsilon(det)
eps2 = eps*2
!-------------------------------------------------! gera a matriz triagonal
!-------------------------------------------------do i=1,n-1
! anda nas colunas, 1,2,...,N-1 (at penltima)
pv=i
! identifica o pivot
!----------------------------do j=i+1,n !na coluna i anda da linha 2 at ltima para achar o maior valor absoluto
if(abs(a(pv,i)) < abs(a(j,i))) pv=j
!pv = nmero da linha que contm maior valor absoluto
end do
!----------------------------if(pv /= i) then
! coloca linha com maior valor nesta posio
do jc=1,n+1
! anda pelas colunas
tm=a(i,jc)
! guarda temporariamente valor da linha i
a(i,jc)=a(pv,jc) ! escreve valor da linha pv na linha i
a(pv,jc)=tm
! escreve valor da linha i na linhas pv
end do
det=-det ! valor do determinante
end if
!----------------------------if(a(i,i) == 0) then
! matriz singular - primeiro pivot igual a zero --> para o processo
print*,"a(",i,i,") = 0 Matriz singular! "
stop
end if
!----------------------------do jr=i+1,n
!eliminao dos coeficientes abaixo do pivot da linha i
if(a(jr,i) /= 0) then
r = a(jr,i)/a(i,i)
do kc=i,n+1
! anda na linha coluna a coluna ate a ltima
temp=a(jr,kc)
a(jr,kc)=a(jr,kc)-r*a(i,kc)
! se o valor for menor que 2*epsilon ele zerado
if(abs(a(jr,kc))<eps2*temp) a(jr,kc)=0.0
end do
end if
end do
end do
!-------------------------------------------------! calcula o determinante
!-------------------------------------------------do i=1,n
det = det*a(i,i)
end do
if(det == 0) then
print*,"Determinante = 0
Matriz singular"
stop
else
! soluo das equaes
a(n,n+1)=a(n,n+1)/a(n,n)
do nv= (n-1),1,-1
va = a(nv,n+1)
do k=(nv+1),n
va = va - a(nv,k)*a(k,n+1)
end do
a(nv,n+1)=va/a(nv,nv)
end do
return
end if
end subroutine gauss
!@@@@@@@@@
!-----------------------------------------------------------------------------subroutine entra_linha_matriz_t(mat)
!-----------------------------------------------------------------------------!Propsito:
! Entra valores da linha de uma matriz via teclado
! nmero de linhas
! nmero de colunas
do i=1,n
read*, mat(i,1:m)
end do
end subroutine entra_linha_matriz_t
!@@@@@@@@@
!-----------------------------------------------------------------------------subroutine entra_linha_matriz_a(mat,arq)
!-----------------------------------------------------------------------------!Propsito:
! Entra valores da linha de uma matriz via arquivo
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
23/01/2009
!Revises:
!-----------------------------------------------------------------------------!DEPENDNCIA:
![
mdulos]: nenhum
![
funes]: nenhuma
![sub-rotinas]: nenhuma
!-----------------------------------------------------------------------------!Argumentos:
! entra_linha_matriz_a(mat,arq)
!
! mat
!
(out) real, shape(:,:)
!
matriz com dados obtidos do arquivo
! arq
!
(in) caractere
!
nome do arquivo de dados
!-----------------------------------------------------------------------------real,dimension(:,:),intent(out)::mat
character(len=*),intent(in)::arq
integer::i,n,m
n = size(mat,dim=1)
m = size(mat,dim=2)
! nmero de linhas
! nmero de colunas
13
14
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
24/01/2009
!Revises:
!-----------------------------------------------------------------------------!DEPENDNCIA:
![
mdulos]: nenhum
![
funes]: nenhuma
![sub-rotinas]: nenhuma
!-----------------------------------------------------------------------------!Argumentos:
! inversa_matriz(n,mat,inv)
!
! n
!
(in) inteiro
!
nmero de linhas da matriz quadrada NxN
! mat
!
(in) matriz quadrada real, shape(:,:)
!
matriz a ser invertida
! inv
!
(out) matriz quadrada real,shape(:,:)
!
matriz inversa
!-----------------------------------------------------------------------------real,dimension(:,:),intent(in) ::mat ! matriz
real,dimension(:,:),intent(out)::inv ! matriz inversa
integer,intent(in)::n ! nmero de linhas na matriz original
real,allocatable,dimension(:,:)::mat_aum ! matriz aumentada N x M
integer::m ! nmero de colunas na matriz aumentada => m=2*n
integer:: cci,ccj! contadores
integer:: i,
& ! contador, anda pelas colunas de 1 at n-1
j,
& ! contador, anda pelas linhas de i+1 at n
jc, & ! contador, anda pelas colunas de 1 at m
jr, & ! contador, anda pelas linhas de i+1 at n
k,
&
kc, & ! contador, anda pelas colunas de 1 at m
ma, & ! contador, indo de n+1 at m --> n elementos
nv, &
pv
! nmero da linha que tem o maior valor absoluto
real:: det=1.0, & ! inicializao do determinante
eps,
& ! epsilon da mquina
eps2,
& ! dobro de epsilon
r,
& !
temp,
& ! valor temporrio para troca
tm,
& ! valor temporrio para troca
va
!-----------------------------------------------------------m = 2*n
allocate(mat_aum(n,m))
mat_aum = 0
!-------------------------------------------------------------! copia a matriz e agrega matriz unitria na matriz aumentada
!-------------------------------------------------------------do cci=1,n
mat_aum(cci,1:n) = mat(cci,1:n)
end do
do cci=1,n
do ccj=n+1,m
if ((cci+n) == ccj)then
mat_aum(cci,ccj) = 1.0
end if
end do
end do
!----------------------------------! Determina psilon da mquina
!----------------------------------eps=epsilon(det)
eps2 = eps*2
!-------------------------------------------------do i=1,n-1
! i=nmero da coluna -- (forward elimination) (n-1)passos
pv=i
! pv=nmero da linha com maior valor absoluto
do j=i+1,n
! j=nmero da linha, sempre comeando 1 unidade a mais que a coluna
if(abs(mat_aum(pv,i)) < abs(mat_aum(j,i))) pv=j
end do
if(pv /= i) then
15
16
! yt
!
(in) vetor real
!
vetor com pontos y da tabela
! x
!
(in) real
!
ponto x para o qual a interpolao ser calculada
! yans
!
(out) real
!
ponto y interpolado
!-----------------------------------------------------------------------------integer,intent(in)::np
! nmero de pontos da tabela
real,dimension(0:np-1),intent(in)::xt ! ponto x da tabela
real,dimension(0:np-1),intent(in)::yt ! ponto y da tabela
real,intent(in)::x
! ponto x para interpolao
real,intent(out)::yans
! ponto y interpolado
!------------------------------integer:: i, j
! contadores
real::z ! produto dos fatores
!------------------------------yans=0.0
do i=0,np-1
z=1.0
do j=0,np-1
if(i /= j) z=z*(x-xt(j))/(xt(i)-xt(j))
end do
yans=yans+z*yt(i)
end do
end subroutine interp_lagrange
!@@@@@@@@@
!-----------------------------------------------------------------------------subroutine incr_r(a,b,incr,ninterv,incrp)
!-----------------------------------------------------------------------------!Propsito:
! Retorna o prprio incremento ou o incremento mais prximo do incremento solicitado
! que gera um nmeros inteiro de intervalos iniciando em a e terminando em b.
! Tambm retorna o nmero de incrementos
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
27/01/2009
!Revises:
!-----------------------------------------------------------------------------!DEPENDNCIA:
![
mdulos]: nenhum
![
funes]: nenhuma
![sub-rotinas]: nenhuma
!-----------------------------------------------------------------------------!Argumentos:
! incr_r(a,b,incr,ninterv,incrp)
!
! a
!
(in) real
!
ponto inicial
! b
!
(in) real
!
ponto final
! incr
!
(in) real
!
increvento sugerido
! ninterv
!
(out) inteiro
!
nmero de intervalos
! incrp
!
(out) real
!
incremento igual ou prximo do desejado para gerar um nmeros de intervalos
!
inteiro em a-b
!-----------------------------------------------------------------------------real,intent(in):: a,
&! ponto inicial
b,
&! ponto final do intervalo
incr
! incremento desejado
integer,intent(out)::ninterv ! nmeros de intervalos em a-b
real,intent(out):: incrp
! incremento mais prximo
!------------------------real::N_pontos
17
18
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
27/01/2009
!Revises:
!-----------------------------------------------------------------------------!DEPENDNCIA:
![
mdulos]: nenhum
![
funes]: nenhuma
![sub-rotinas]: nenhuma
!-----------------------------------------------------------------------------!Argumentos:
! incr2_rv(a,b,incrp,vet)
!
! a
!
(in) real
!
ponto inicial
! b
!
(in) real
!
ponto final
! incrp
!
(in) real
!
tamanho dos intervalos em a-b
! vet
!
(out) vetor real
!
vetor com N posies gerado com incrp no intervalo a-b
!-----------------------------------------------------------------------------real,intent(in):: a,
&! ponto inicial
b,
&! ponto final do intervalo
incrp
! incremento
real,intent(out),dimension(:)::vet ! vetor com pontos de a at b
!---------------------------------integer:: i,n
n=size(vet)
vet=[ a,((a+i*incrp),i=1,n-1) ]
end subroutine incr2_rv
!@@@@@@@@@
!-----------------------------------------------------------------------------subroutine interp_newton(xt,yt,x,y)
!-----------------------------------------------------------------------------!Propsito:
! Interpolao progressiva de Newton - intervalos iguais, aceita tabela de
! dados com tamanho N (qualquer, maior que 2)
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
24/01/2009
!Revises:
!-----------------------------------------------------------------------------!DEPENDNCIA:
![
mdulos]: nenhum
![
funes]: nenhuma
![sub-rotinas]: nenhuma
!-----------------------------------------------------------------------------!Argumentos:
! interp_newton(xt,yt,x,y)
!
! xt
!
(in) vetor real
!
X - pontos da tabela
! yt
!
(in) vetor real
!
Y - pontos da tabela
! x
!
(in) real
!
ponto desejado
! y
!
(out) real
!
ponto interpolado
!-----------------------------------------------------------------------------real,intent(in),dimension(:)::xt,yt ! tabela original
real,intent(in) :: x
! ponto
real,intent(out):: y
! ponto interpolado
!---------------------------------------------------real,allocatable,dimension(:)::hi
! |x-xt| -> diferenas
19
20
!------------------------------------------------------!
!---clculos das diferenas finitas
dd(0:9,0)=yti
do i=1,9
! completando a tabela de diferena finita iniciando
k=9-i
do j=0,k
dd(j,i)=dd(j+1,i-1)-dd(j,i-1)
end do
end do
!--- varivel local
s=(x-xti(0))/(xti(1)-xti(0))
!--- gera os produtos
pr(0)=1.0
pr(1)=s
pr(9)=0.0
do j=2,8
pr(j)=pr(j-1)*(s-(j-1))
end do
!--- ponto interpolado
y=dd(0,0)
fator=1.0
do i=1,9
fator=fator*i
y=y+(pr(i)/fator)*dd(0,i)
end do
end subroutine interp_newton
!@@@@@@@@@
!-----------------------------------------------------------------------------subroutine interp_polinomial(xt,yt,x,y)
!-----------------------------------------------------------------------------!Propsito:
! Interpolao polinomial - intervalos no necessitam ser iguais, tamanho da
! tabela N (com N qualquer)
!
! Adaptao da sub-rotina polint do numerical recipes
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
24/01/2009
!Revises:
!-----------------------------------------------------------------------------!DEPENDNCIA:
![
mdulos]: nenhum
![
funes]: nenhuma
![sub-rotinas]: nenhuma
!-----------------------------------------------------------------------------!Argumentos:
! interp_polinomial(xt,yt,x,y)
!
! xt
!
(in) vetor real
!
X - pontos da tabela - mximo de 10
! yt
!
(in) vetor real
!
Y - pontos da tabela - mximo de 10
! x
!
(in) real
!
ponto desejado
! y
!
(out) real
!
ponto interpolado
!-----------------------------------------------------------------------------real,intent(in),dimension(:):: xt,yt ! pontos x,y da tabela
real,intent(in):: x
! ponto para interpolao
real,intent(out):: y
! valor interpolado
!---------------------------integer:: i,
& ! contador do loop
tn,
& ! tamanho dos vetores
ipvmp
! posio na tabela do menor valor de x-xt
integer,dimension(1):: pvmp
! posio do menor valor de x-xt
real,dimension(size(xt)):: copy1, &
! vetor
copy2, &
! vetor
!@@@@@@@@@
!-----------------------------------------------------------------------------subroutine dif_finita_asc(xt,yt,dif)
!-----------------------------------------------------------------------------!Propsito:
! Constri a tabela de diferenas finitas ascendente - incrementos equidistantes
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
30/01/2009
!Revises:
!-----------------------------------------------------------------------------!DEPENDNCIA:
![
mdulos]: nenhum
![
funes]: nenhuma
![sub-rotinas]: nenhuma
!-----------------------------------------------------------------------------!Argumentos:
! dif_finita_asc(xt,yt,dif)
!
! xt
!
(in) vetor real, shape(:)
!
valores X da tabela
! yt
!
(in) vetor real, shape(:)
!
valores Y da tabela
! dif
!
(out) matriz, shape(:,:)
!
contm x e as diferenas finitas: y,Dy,D^2y,...
!-----------------------------------------------------------------------------real,dimension(:),intent(in)::xt, yt
real,dimension(:,:),intent(out)::dif
!-----------------------integer:: i,j,k,
& ! contadores
n_pontos
! nmero de pontos
!--------------------------------------------! copia xt e yt para a matriz dif
n_pontos=size(xt)
if(n_pontos > 10) stop "Maximo 10 pontos"
do i=1,n_pontos
dif(i,1)=xt(i)
dif(i,2)=yt(i)
21
22
end do
!print*,"----------- matriz dif ---------"
!print"(8f12.5)",((dif(i,j),j=1,n_pontos+1),i=1,n_pontos)
!stop
do k=3,n_pontos+1 ! anda pelas colunas
j=n_pontos - (k-2)
do i=1,j
dif(i,k)=dif(i+1,k-1)-dif(i,k-1)
end do
end do
end subroutine dif_finita_asc
!@@@@@@@@@
!-----------------------------------------------------------------------------subroutine dif_divididas_asc(xt,yt,dif)
!-----------------------------------------------------------------------------!Propsito:
! Constri a tabela de diferenas divididas ascendente - incrementos podem ser
! desiguais
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
30/01/2009
!Revises:
!-----------------------------------------------------------------------------!DEPENDNCIA:
![
mdulos]: nenhum
![
funes]: nenhuma
![sub-rotinas]: nenhuma
!-----------------------------------------------------------------------------!Argumentos:
! dif_divididas_asc(xt,yt,dif)
!
! xt
!
(in) vetor real, shape(:)
!
valores X da tabela
! yt
!
(in) vetor real, shape(:)
!
valores Y da tabela
! dif
!
(out) matriz, shape(:,:)
!
contm x e as diferenas divididas
!-----------------------------------------------------------------------------real,dimension(:),intent(in)::xt, yt
real,dimension(:,:),intent(out)::dif
!-----------------------integer:: i,j,k,
& ! contadores
n_pontos
! nmero de pontos
!--------------------------------------------! copia xt e yt para a matriz dif
n_pontos=size(xt)
if(n_pontos > 10) stop "Maximo 10 pontos"
do i=1,n_pontos
dif(i,1)=xt(i)
dif(i,2)=yt(i)
end do
do k=3,n_pontos+1
! anda pelas colunas
j=n_pontos - (k-2) ! anda dentro da coluna
do i=1,j
! diferena dividida
dif(i,k)=(dif(i+1,k-1)-dif(i,k-1))/(dif(i+(k-2),1)-dif(i,1))
end do
end do
end subroutine dif_divididas_asc
!@@@@@@@@@
!-----------------------------------------------------------------------------subroutine bissecao(func,a,b,tol,zero,ifail)
!-----------------------------------------------------------------------------!Propsito:
! Calcula a integral da funo usando o mtodo da bisseo
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
30/01/2009
!Revises:
!------------------------------------------------------------------------------
23
24
!DEPENDNCIA:
![
mdulos]: <<<<<< especificado pelo usurio >>>>>>
![
funes]: <<<<<< especificada pelo usurio >>>>>>
![sub-rotinas]: nenhuma
!-----------------------------------------------------------------------------!Argumentos:
! newtom_raphson(func,x,tol,zero)
!
! func
!
(in) funo real,dp
!
funo especificada pelo usurio
! x
!
(in) real,dp
!
valores x da abcissa
! tol
!
(in) real,dp
!
valor da tolerncia - erro
! zero
!
(out) real,dp
!
zero da funo
!-----------------------------------------------------------------------------real(kind=dp),external::func
real(kind=dp),intent(in)::x, tol
real(kind=dp),intent(out)::zero
!--------------------------------------------real(kind=dp)::erro,
& !erro
xb,
& !valor prvio de x
y_deriv, & !derivada no ponto x
xt
!raiz
integer:: n
! nmero de iteraes
!----------------------------------erro=1.0D10
xt=x
xb=xt
n=0
do while (erro > tol)
n=n+1
y_deriv=derivada(func,xt)
xt=xt-func(xt)/y_deriv
erro=abs(xt-xb)
xb=xt
end do
zero=xt
end subroutine newton_raphson
!@@@@@@@@@
!-----------------------------------------------------------------------------subroutine integ_trapezio(func,a,b,n,it)
!-----------------------------------------------------------------------------!Propsito:
! Calcula a integral da funo entre os pontos a e b utilizando n intervalos
! pelo mtodo do trapzio
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
04/02/2009
!Revises:
!-----------------------------------------------------------------------------!DEPENDNCIA:
![
mdulos]: <<<<<< especificado pelo usurio >>>>>>
![
funes]: <<<<<< especificada pelo usurio >>>>>>
![sub-rotinas]: nenhuma
!-----------------------------------------------------------------------------!Argumentos:
! integ_trapezio(func,a,b,n,it)
!
! func
!
(in) funo real,dp
!
funo especificada pelo usurio
! a
!
(in) real,dp
!
valores inicial da integral definida
! b
!
(in) real,dp
!
valor final da integral definida
25
26
! simp=f(a)
do i=1,n1-1
x=a+i*h
! anda por cada um dos pontos de x(2) at x(n-1)
simp = simp + (3 -(-1)**i)*func(x) ! soma 4*f(x_impares) e 2*f(x_pares)
end do
x=b
simp = simp + func(x) ! soma ltimo ponto f(b)
simp = h*(simp/3)
end subroutine simpson_1_3
!@@@@@@@@@
!-----------------------------------------------------------------------------subroutine der1(func,x,tol,der)
!-----------------------------------------------------------------------------!Propsito:
! Calcula a derivada primeira da funo fornecida no ponto x usando a
! aproximao da diferena central para 3-pontos
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
07/02/2009
!Revises:
!-----------------------------------------------------------------------------!DEPENDNCIA:
![
mdulos]: <<<<<< especificado pelo usurio >>>>>>
![
funes]: <<<<<< especificada pelo usurio >>>>>>
![sub-rotinas]: nenhuma
!-----------------------------------------------------------------------------!Argumentos:
! der1(func,x,tol,der)
!
! func
!
(in) funo real,dp
!
funo especificada pelo usurio
! x
!
(in) real,dp
!
valores do ponto no qual ser calculada a derivada primeira
! tol
!
(in) real,dp
!
tolerncia
! der
!
(out) real,dp
!
valor da derivada no ponto x
!-----------------------------------------------------------------------------real(kind=dp),external::func
real(kind=dp),intent(in)::x,tol
real(kind=dp),intent(out)::der
!-----------------------real(kind=dp)::h
! incremento
real(kind=dp),dimension(0:100)::d,
& ! derivadas
e
! diferena entre as derivadas
integer::i ! contador
!--------------------------------------h=1.0
d(0) =0.5*(func(x+h)-func(x-h))/h
do i=1,2
h=h/2
d(i)= 0.5*(func(x+h)-func(x-h))/h
e(i)= abs(d(i))-abs(d(i-1))
end do
i=1
27
28
29
30
!Revises:
!-----------------------------------------------------------------------------!DEPENDNCIA:
![
mdulos]: <<<<<< especificado pelo usurio >>>>>>
![
funes]: <<<<<< especificada pelo usurio >>>>>>
![sub-rotinas]:
!-----------------------------------------------------------------------------!Argumentos:
! euler2_tab(edo2f,x0,y0,z0,a,b,h,xt,yt,zt)
!
! edo2f
!
(in) real
!
funo derivada da varivel z
! x0
!
(in) real
!
valor inicial da varivel independente
! y0
!
(in) real
!
valor inicial da varivel y
! z0
!
(in) real
!
valor inicial da varivel z
! a
!
(in) real
!
valor inicial do intervalo
! b
!
(in) real
!
valor final do intervalo
! h
!
(in) real
!
passo incremental
! xt
!
(out) vetor real, size(:)
!
vetor com pontos x
! yt
!
(out) vetor real, size(:)
!
vetor com pontos y
! zt
!
(out) vetor real, size(:)
!
vetor com pontos z
!-----------------------------------------------------------------------------real, external::edo2f
! funo derivada
real,intent(in)::x0,
& ! valor inicial da varivel independente
y0,
& ! valor inicial y
z0,
& ! valor inicial z
a,
& ! valor inicial do intervalo
b,
& ! valor final do intervalo
h
! passo
real,dimension(:),intent(out)::xt, & ! pontos x da tabela
yt, & ! ponto y da tabela
zt
! ponto z da tabela
!------------------------------------integer:: i
! contador
!------------------------------!---construo da tabela
xt(1)=x0
yt(1)=y0
zt(1)=z0
do i=1,size(yt)-1
xt(i+1)=xt(i)+h
yt(i+1)=yt(i) + zt(i)* h
zt(i+1)=zt(i)+ edo2f(xt(i),yt(i),zt(i)) * h
end do
end subroutine euler2_tab
!@@@@@@@@@
!-----------------------------------------------------------------------------subroutine euler_mod_tab(edof,x0,y0,a,b,h,tol,xt,yt)
!-----------------------------------------------------------------------------!Propsito:
! calcula (x,y,z) do problema do valor inicial da equao diferencial
31
32
end do
end do
end subroutine euler_mod_tab
!!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!!@@@@@@@@@@@@@@@@@@@@
FUNES
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!@@@@@@@
!-----------------------------------------------------------------------------function derivada(func,x) result(df)
!-----------------------------------------------------------------------------!-----------------------------------------------------------------------------!Propsito:
! Calcula a derivada primeira da funo no ponto x usando diferena central
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
03/02/2009
!Revises:
!-----------------------------------------------------------------------------!DEPENDNCIA:
![
mdulos]: <<<<<< especificado pelo usurio >>>>>>
![
funes]: <<<<<< especificada pelo usurio >>>>>>
![sub-rotinas]: nenhuma
!-----------------------------------------------------------------------------!Argumentos:
! derivada(func,x) result(df)
!
! func
!
(in) real,dp
!
funo especificada pelo usurio
! x
!
(in) real,dp
!
valores x especificado pelo usurio
!------------------------------------------! result(df)
!
df - real,dp
!
sada da funo
!-----------------------------------------------------------------------------real(kind=dp),external::func
real(kind=dp),intent(in)::x
real(kind=dp):: df,
& ! derivada
dd1, & ! delta
dd2
! 2*dd1
!-----------------------dd1=1.0D-5
dd2=2.0D-5
df = (func(x+dd1)-func(x-dd1))/dd2
end function derivada
!@@@@@@@
!@@@@@@@
end module fc_rotinas
_______________________________________________________________________________________
arquivo: fc_m1func.f03
module fc_m1func
!------------------------------------------------------------------------------!Propsito:
! Guarda funes definidas pelo usurio
!
!USO:
! Coloque no seu programa fonte a declarao
!
use fc_m1func
!
!COMPILAO:
! (1) deste mdulo
!
f03 fc_constantes.o -c fc_m1func.f03
!
33
34
!--------------------------------! resultado
!
real,dp
!-----------------------------------------------------------------------------real(kind=dp),intent(in)::x ! valor da abcissa
!------------------------------------fun2 = x**3 - 5.0_dp * x**2 + 6.0_dp *x
end function fun2
!@@@@@@@
!-----------------------------------------------------------------------------real(kind=dp) function fun3(x)
!-----------------------------------------------------------------------------!Propsito:
! Define funo: f(x) = x**2
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
03/02/2009
!Revises: Anibal L. Pereira
16/04/2010
!-----------------------------------------------------------------------------!Argumentos:
! fun3(x)
!
! x
!
(in) real, dp
!
valor da abcissa
!--------------------------------! resultado
!
y - real,dp
!-----------------------------------------------------------------------------real(kind=dp),intent(in)::x ! valor da abcissa
!------------------------------------fun3 = x**2
end function fun3
!@@@@@@@
!-----------------------------------------------------------------------------real(kind=dp) function fun4(x)
!-----------------------------------------------------------------------------!Propsito:
! Define funo: f(x) = (1 + (x/2.0)**2)**2)*pi
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
03/02/2009
!Revises: Anibal L. Pereira
16/04/2010
!-----------------------------------------------------------------------------!Argumentos:
! fun4(x)
!
! x
!
(in) real, dp
!
valor da abcissa
!--------------------------------! resultado
!
y - real,dp
!-----------------------------------------------------------------------------real(kind=dp),intent(in)::x ! valor da abcissa
!------------------------------------fun4 = ((1_dp + (x/2.0_dp)**2)**2)*pi_d
end function fun4
!@@@@@@@
!-----------------------------------------------------------------------------real(kind=dp) function fun5(x)
!-----------------------------------------------------------------------------!Propsito:
! Define funo: f(x) = cos(x)
!-----------------------------------------------------------------------------!Autor:
Anibal L. Pereira
06/02/2009
35
36
_______________________________________________________________________________________
arquivo: euler1.plt
37
y ' =u
u ' =v
v '=w
w ' =gawbvcuey
y 0= y 0
u0= y'0
' ' ou
v 0= y 0
w 0= y '0' '
dy
=u
dt
du
=v
dt
dv
=w
dt
dw
=g awbvcuey
dt
y 0= y 0
u 0= y '0
v 0= y '0'
w 0= y '0' '
y i1= y iu i h
u i1=u iv i h
v i1=v iw i h
w i1=wi[ gaw ibv icu iey i]h
Por exemplo, admita o caso de um pndulo simples, que descrito pela equao diferencial ordinria de
2
d
g
= .
2
l
dt
38
A soluo deste problema bastante conhecida e tem a seguinte forma: = 0 sin t onde
e 0
g
l
Ento, aplicando o processo de descomposio da equao diferencial ordinria de segunda ordem em duas
equaes diferencias ordinrias de primeira ordem tem-se:
d
g
=
2
l
dt
d
=
dt
onde a velocidade angular do pndulo.
d
g
=
dt
l
O sistema de equao diferencial ordinria de primeira ordem que descreve o problema pode ser resolvido pelo
mtodo de Euler (Euler padro).
i1= i i h
i1= i
g
i h
l
Outro exemplo, bastante similar, o movimento de uma mola (constante elstica k) satisfazendo a lei de
2
d x
k
= x . A soluo deste problema usando o mtodo de Euler
2
m
dt
dx
=v
dt
dv
k
= x
dt
m
x i1=x i v i h
k
v i1=v i x i h
m
Atividade 02
Entregar em meio magntico:
1.
programa:
euler2_prog
fxxa2.f03
2.
mdulos:
fc_constantes.f03
fc_rotinas.f03
fc_m1func.f03
3.
scripts:
euler21.plt
4.
arquivos:
euler21.dados
euler21.gif
Exemplo/Acrscimo/Ajuste:
Exemplifica o uso do mtodo de Euler para a soluo de equao diferencial ordinria de segunda ordem com valor inicial especificado
a2.1) Gere o arquivo de dados euler21.dados que mostra a
2
d y
2 ln x6 x 2=5
2
dx
com
x 0=1
y x 0 = y 1=1
e
2
y x =x x ln x 0.5x
soluo do PVI:
com
x 0=0
y x 0 = y 0=13 e
exata, y t=10 e x 3
39
a2.3) Gere o arquivo de dados euler23-h03.dados, euler23-h01.dados, euler23-h005.dados e euler23-h001.dados que mostra
t 0=0 , y 0=10 e
as solues do PVI com h=0.03,h=0.01,h=0.005 e h=0.001: y ' '9y ' =0 com
y ' 0=18
soluo exata,
y t=10 e x 3
program euler2_prog
!
!------------------------------------------------------------------------! Propsito: Constri tabela de valores (y,y') soluo da equao
!
diferencial ordinria de 2a ordem com valores iniciais
! x0, y(x0)=y0 e y'(x0)=y'0 utilizando o mtodo de Euler progressivo
!------------------------------------------------------------------------! Arquivo:fxxa2.f03
!
Autor: Anibal L. Pereira
14/02/2009
!Revises:
!------------------------------------------------------------------------use fc_constantes
use fc_rotinas
use fc_m1func
implicit none
integer::i,
& !contador
npassos
! nmero de passos inteiros
real::x0,y0,z0, & ! valores iniciais
a,b,
& ! intervalo - ponto inicial e ponto final
h,
& ! incremento h
delta
! incremento mais prximo de h
real,allocatable,dimension(:)::xt,yt,zt
!pontos da tabela
!--------------------------------------------------! Entrada pontos da tabela
!--------------------------------------------------print*, "========================================"
print*, "Entre com o valor inicial x0, y(0) e z(0)"
print*, "========================================"
read*, x0,y0,z0
print*, "============================================"
print*, "Entre com o valor intervalo:",x0,"--- B "
print*, "============================================"
a=x0
read*, b
print*, "===================================="
print*, "Entre com o incremento h "
print*, "===================================="
read*, h
!---nmero de passos inteiros no intervalo a-b
call incremento(a,b,h,npassos,delta)
print*,"npassos,delta",npassos,delta
!---cria vetores x e y da tabela
allocate(xt(npassos+1),yt(npassos+1),zt(npassos+1))
xt=0.0
yt=0.0
zt=0.0
!---------------------------------------------------! clculo da tabela soluo da EDO
!---------------------------------------------------!---funo derivada: edo2f_1= 2*log(x)+6*x**2+5
!
40
call euler2_tab(edo2f_1,x0,y0,z0,a,b,delta,xt,yt,zt)
!---------------------------------------------------! preserva resultado num arquivo
!---------------------------------------------------open(unit=10, file="euler2.dados", status="replace",action="readwrite")
do i=1,size(yt)
write(unit=10,fmt=*) xt(i),yt(i),zt(i)
end do
close(unit=10)
program euler2_prog
_______________________________________________________________________________________
MDULOS
arquivo: fc_constantes.f03
arquivo: fc_rotinas.f03
arquivo: fc_m1func.f03
ver atividade 01
_______________________________________________________________________________________
arquivo: euler2.plt
erros de arredondamentos
instabilidade
( truncamentos )
( ou oscilao )
O mtodo de Euler modificado mais acurado e mais estvel que o mtodo de Euler padro.
O mtodo de Euler modificado obtido quando se aplica a regra do trapzio para integrar a equao diferencial
ordinria y ' = f y , x , ento a soluo do tipo:
y i1= y i
h
[ f yi 1 , x i1 f y i , x i ]
2
ou
41
h
y i1= y i [ f y i1 , x i1 f y i , x i ]
2
Este mtodo as vezes chamado de mtodo do ponto do meio, pois utiliza o valor mdio entre os pontos
f yi 1 , x i1 f yi , x i
.
2
h
[ f y i 1 , xi 1 f y i , xi ] , ser linear
2
y i1 e o
clculo de y 1
y 1= y 0
h
[ f y 1 , x 1 f y 0 , x 0 ]
2
y1 = y0
y 1 y 0 , ento:
h
[ f y 0 , x 0 f y 0 , x 0 ]
2
y 21 = y 0
h
f y 11 , x 1 f y 0 , x 0 ] onde y 1= f y 1, x 1 ser o valor y 1
previamente calculado.
[
1
2
Se o processo iterativo do clculo de y 1 parar neste passo, o mtodo chamado de mtodo de Euler preditorcorretor (Euler predictor-corretor method) onde a primeira estimativa (predio) depois corrigida pelo clculo
subsequente (corretor). Se o clculo parar na primeira correo, o mtodo preditor-corretor idntico ao mtodo
Runge-Kutta de segunda ordem.
Mas, no mtodo de Euler modificado o processo no para no clculo da primeiro correo, ele continua
(iterativamente) at que o mdulo da diferena entre o ltimo valor calculado e o penltimo valor calculado seja
menor que um valor especificado (uma tolerncia). Ento:
(k=2)
y 21 = y 0
h
f y 11 , x 1 f y 0 , x 0 ]
[
2
verifica se
y12 y11tol
(k=3)
y 3
1 = y0
h
[ f y 21 , x 1 f y0 , x 0 ]
2
verificase
y 31 y 12tol
(k=4)
y 1 = y 0
h
[ f y 13 , x 1 f y 0 , x 0 ]
2
verificase
y 41 y 31 tol
at a iterao k
42
k 1
y1
(k)
= y 0
h
k
f y1 , x 1 f y 0 , x 0 ]
[
2
verificase
k
y 1 tol
y k1
1
se na iterao k a diferena entre o novo valor calculado e o previamente calculado for menor que a tolerncia o
processo iterativo para e o valor y 1 feito igual a y k1 1 , para ento se passar ao ao clculo do prximo
valor desejado (se for o caso)
calculo do valor, y 2
y2
= y 1
h
k
f y 2 , x 2 f y 1 , x1 ]
[
2
verificase
y2 .
calculo do valor y i
O clculo para qualquer ponto feito sempre desta forma, ou seja, repete-se estes procedimentos at o ponto
desejado
y ki11= y i
h
f yi k1 , x i1 f y i , x i ]
[
2
verificase
k1
k
y i1
y i1
tol
Atividade 03
Entregar em meio magntico:
1.
programa:
euler_m_prog
fxxa2.f03
2.
mdulos:
fc_constantes.f03
fc_rotinas.f03
fc_m1func.f03
3.
scripts:
euler_m.plt
4.
arquivos:
euler_m-h05.dados
euler_m-h02.dados
euler_m-h005.dados
euler_m.gif
Exemplo/Acrscimo/Ajuste:
Exemplifica o uso do mtodo de Euler modificado para a soluo de equao diferencial ordinria com valor inicial especificado
a3.1) Gere o arquivo de dados euler_m1.dados que mostra a soluo do problema do valor inicial:
no intervalo [0,10] com h=0.1 e tolerncia 0.001. O arquivo euler_m1.gif contm a soluo exata,
soluo encontrada pelo mtodo de Euler modificado.
dy
y 0=1
=x y
dx
x
,ea
y=x 12 e
y 0=1
y=12 x0.45
, e a soluo encontrada
dy
=x e x 2x ,
dx
y x 0 =0.00454 no intervalo [-10,1]. O arquivo euler_m3.gif contm a soluo exata, y=x 2 e x com
a3.3) Gere o arquivo de dados euler_m3.dados que mostra a soluo do problema do valor inicial:
x 0=10
dy 0.9 y
=
dx 12x
43
a3.4)
Gere
1
x
2
dy
=e
dx
soluo exata,
arquivo
de
dados
euler_m4.dados
1
2 cos 2 x sin 2 x
2
y=e
1
x
2
sin 2 x
que
y 0=0
mostra
soluo
do
problema
do
valor
inicial:
program euler_m_prog
!
!------------------------------------------------------------------------! Propsito: Constri tabela de valores (y,y') soluo da equao
!
diferencial ordinria de 1a ordem com valores iniciais
! y'(0)= utilizando o mtodo de Euler modificado
!------------------------------------------------------------------------! Arquivo:fxxa3.f03
!
Autor: Anibal L. Pereira
21/02/2009
!Revises:
!------------------------------------------------------------------------use fc_constantes
use fc_rotinas
use fc_m1func
implicit none
integer::i,
& !contador
npassos
! nmero de passos inteiros
real::x0,y0,z0, & ! valores iniciais
a,b,
& ! intervalo - ponto inicial e ponto final
h,
& ! incremento h
tol,
& ! tolerncia
delta
! incremento mais prximo de h
real,allocatable,dimension(:)::xt,yt
!pontos da tabela
!--------------------------------------------------! Entrada pontos da tabela
!--------------------------------------------------print*, "========================================"
print*, "Entre com o valor inicial x0 e y(0) "
print*, "========================================"
read*, x0,y0
print*, "============================================"
print*, "Entre com o valor intervalo:",x0,"ate B "
print*, "============================================"
a=x0
read*, b
print*, "========================================="
print*, "Entre com o incremento h e a tolerncia"
print*, "========================================="
read*, h,tol
!---nmero de passos inteiros no intervalo a-b
call incremento(a,b,h,npassos,delta)
!---cria vetores x e y da tabela
allocate(xt(npassos+1),yt(npassos+1))
xt=0.0
yt=0.0
!---------------------------------------------------! clculo da tabela soluo da EDO
!---------------------------------------------------!---funo derivada: edof_m1= x-y
call euler_mod_tab(edof_m1,x0,y0,a,b,delta,tol,xt,yt)
44
_______________________________________________________________________________________
MDULOS
arquivo: fc_constantes.f03
arquivo: fc_rotinas.f03
arquivo: fc_m1func.f03
ver atividade 01
_______________________________________________________________________________________
arquivo: euler_m1.plt