Física Computacional A
DFAT/
FiscompFA
Integração
Professor: Anibal Leonardo Pereira última atualização: junho 2011
Estagiários:
2004/1 a 2005/2 Luciana Conceição Iecker Lima
2010/1 Magali dos Santos Leodato
2009/1 a 2010/2 Filipe da Fonseca Cordovil
Monitores:
2001/1 Diego Chagas Garcia
2002/2 Erick Azevedo Meirelles
2003/1 a 2003/2 Luciana Maria dos Santos Azevedo
2003/1 a 2003/2 Tatiana Gonçalves Martins
2003/1 a 2005/2 Renato Nascente Júnior
2004/1 a 2005/2 Públio Martins Romano M. Carreiro
2006/1 a 2007/2 Luiz Fernando Rosalba Telles Souza
2006/1 a 2007/2 Paulo Henrique Pfitzner
2008/1 a 2008/2 Filipe da Fonseca Cordovil
2008/1 a 2009/2 Magali dos Santos Leodato
2011/1 a Filipe da Fonseca Cordovil
1. Integração
O método de integração numérica é usado para integrar funções tanto sob a forma tabular quanto na forma
analítica.
Os métodos de integração numérica podem usar tanto a interpolação polinomial com espaçamento uniforme
quanto a interpolação polinomial com espaçamento desigual, portanto eles podem utilizar as fórmulas de:
•
interpolação ascendente de Newton
•interpolação descendente de Newton
•
interpolação diferenças divididas de Newton
•interpolação de Lagrange
Para a integração numérica, o método do trapézio é o mais simples por isto é sempre utilizado para introduzir os
conceitos de integração numérica enquanto a regra de Simpson 1/3 é utilizado para a determinação da integral
quando se utiliza uma calculadora (
cálculo manual).
2. Método do Trapézio
Método do Trapézio é um método de integração que utiliza um polinômio interpolador linear.
A expressão para a integração pelo método do trapézio é :
I =
∫
a b
f x dx=
b−a
onde
b−a
2
[
f a f b]
é a regra do trapézio
e a grandeza
E
representa o erro existente no valor calculado da integral.
A representação gráfica do processo de integração utilizando uma
interpolação linear é mostrado na figura ao lado.
A área hachurada debaixo a linha de interpolação (
definida pela interpolação linear) é igual ao valor da integral
calculada pelo método do trapézio, enquanto a área sob a curva é a integral exata da função. O erro
E
no valor
da integral é igual a área branca entre a curva e a reta.
Porque a integral é a área sob a curva, ela pode ser calculada geometricamente pela
soma da área do retângulo com a área do triângulo que estão sob a curva:
I =A
retângulo
A
triângulo. Então:
I = f
a⋅
b−a
1
2
⋅
f
b−
f
a⋅
b−a
I =b−a⋅
[
f
a
1
2
⋅
f
b−
f
a
]
=
b−a⋅
[
2f
a
f
b−
f
a2
]
I =
b−a
2
⋅
[
f
a
f
b]
A equação pode ser estendida para vários intervalos, simplesmente adicionando-se cada uma das áreas sob a
curva. Então, para
N
intervalos iguais, cada um deles com um tamanho igual a
h
, a regra do trapézio pode
ser escrita assim:
I =
∫
a bf x dx=
h
2
[
f a2
∑
i=1 N −1f aih f b
]
E
onde
h=
b−a
N
. Na figura temos:
h=
x
N−
x
0N
.
Ao abrir a equação ela pode ser escrita assim:
I =
h
2
f
02f
12 f
2⋯2 f
N −1
f
N
E
onde
f
0=
f a
,
f
1=
f ah
,
f
2=
f a2h
,
f
3=
f a3h
,
⋯
,
f
i=
f aih
ou
f
0=
f x
0
,
f
1=
f x
0
h
,
f
2=
f x
02h
,
f
3=
f x
03h
,
⋯
,
f
i=
f x
0
ih
Atente ao fato do intervalo
h
(
incremento ou passo) ser constante.
Por este motivo os pontos estão afastados um dos outros por
h
e eles serão localização, em relação ao
primeiro ponto, por
f
i=
f aih
. Então:
quando
i=0
→
f
0=
f a
ou
f
0=
f x
0
i=1
→
f
1=
f ah
ou
f
1=
f x
0
h
i=2
→
f
2=
f a2 h
ou
f
2=
f x
02 h
⋯
→
⋯⋯
i= N
→
f
N=
f aN h
ou
f
N=
f x
0
N h
Exemplo 01:
Calcule a integral definida
I =
∫
1.00 1.30
x dx
usando a regra do trapézio.
Fazendo
N =6
temos
h=
b−a
N
=
1.30−1.00
6
=0.05
então:
I =
h
2
[
f
02 f
1
2 f
22 f
3
2 f
4
2 f
5
f
6]
(
observe que a contagem inicia com o valor zero
)
Podemos escrever:
i
x+ih
x
f(x)
0 1.00 + 0
1.00
1.0000
1 1.00 + 1x0.05
1.05
1.0247
2 1.00 + 2x0.05
1.10
1.0488
3 1.00 + 3x0.05
1.15
1.0724
4 1.00 + 4x0.05
1.20
1.0954
5 1.00 + 5x0.05
1.25
1.1180
6 1.00 + 6x0.05
1.30
1.1402
I =
0.05
2
[
12×1.02472×1.04882×1.07242×1.09542×1.11801.1402
]
I =0.025[12.04942.09762.14482.19082.2361.1402]=0.32147
O valor correto da integral é
0.32149
. Por isto o erro existente no valor calculado pela regra do trapézio é de
0.00002
.
Sem demostração:
O erro no valor da integral pelo método do trapézio para uma única área é obtido usando-se a fórmula:
E≃−
h
3
12
⋅
f
''
com ab
Para o erro estendido (
aquele obtido pela soma das áreas) o erro total é obtido pela soma dos erros em cada uma
das áreas, o que nos leva a fórmula:
E≃−
1
12
b−a
3N
3∑
i=1 Nf
' '
x
i≃−
1
12
b−a h
2f
' '
com ab
Esta equação mostra que o erro é proporcional a
h
2para um intervalo fixo
[
a , b]
.
Para a integral
I =
∫
1.00 1.30
x dx
temos :
f x =
x
,
f
'
x =
1
2
x
1 2e
f
' '
x =−
1
4
x
3 2logo:
E≃−
1
12
b−a h
2f
' '≃0.0833×0.3×0.05
2×
[
−
1
4
×1.01
1.5]
≃0.000015853
que é ligeiramente menor que o valor 0.00002 obtido. Entretanto ao se fazer o arredondamento para 5 casas
decimais teremos o valor 0.0002 obtido anteriormente.
Exemplo 02:
Calcule a integral definida
I =
∫
0 1
1x
2
dx
A resposta exata da integral é:
I =
∫
0 1
1x
2
dx=x−
x
33
=
2
3
≃0.66667
Resolvendo pelo método do trapézio:
N =1
,
a=0
,
b=1
,
h=
1−0
1
=1
I ≃
h
2
f
0
f
1≃0.510≃
1
2
≃0.5
N =2
,
a=0
,
b=1
,
h=
1−0
2
=
1
2
I ≃
h
2
f
0
2 f
1
f
2≃
1
4
12×
3
4
0≃
5
8
≃
0.625
N =4
,
a=0
,
b=1
,
h=
1−0
4
=
1
4
I ≃
h
2
f
0
2 f
12 f
2
2 f
3
f
4≃0.2511.8751.50.8750≃0.65625
No cálculo do erro usa-se a derivada segunda:
f x =1− x
2,
f
'
x =−2x
,
f
' '
x =−2
com
N =4
temos:
E≃−
1
12
b−a h
2f
' '≃−
1
12
×1×0.25
2×−2≃0.0141≃0.01
O erro no valor da integral com
N =4
é de
0.66667 – 0.65625=0.01042=0.01
Observe que, como esperado, o erro vai diminuindo quando o valor de
h
diminuí (ou N cresce), para o
mesmo intervalo
[
a , b]
.
N =1
erro de 25%
N =2
erro de 6.25 %
N =4
erro de 1.56 %
3. Método de Simpson 1/3
O método de Simpson 1/3 é baseado na interpolação polinomial quadrática (
polinômio de segundo grau)
A figura mostra que o intervalo
[
a , b]
é dividido em dois
intervalos (
um número par de intervalos).
Ao usar os 3 pontos isto nos permite construir um polinômio
interpolador de segunda ordem.
Ao proceder assim somos capaz de derivar uma expressão para a
integral que é conhecida como regra de Simpson 1/3
Antes de obter a fórmula de Simpson 1/3 faz-se a indicação dos passos necessários para a obtenção da derivada
segunda usando a aproximação central (
ela já foi apresentada quando tratamos da derivada). Ao recordamos os passos
necessários à obtenção da derivada segunda isto ajudará (
tornará mais fácil) o processo de entendimento da obtenção
da expressão que permite calcular a integral por Simpson 1/3.
1.
escrever a expressão de Taylor
progressiva
: do ponto central
f
ipara o ponto
f
i1f
i1=
f
i
h f
i'
h
22
f
i ' '
h
36
f
i ' ' '
h
424
f
i 4⋯
2.
escrever a expressão de Taylor
regressiva
: do ponto central
f
ipara o ponto
f
i−1f
i−1=
f
i−
h f
i'
h
22
f
i ' '−
h
36
f
i ' ''
h
424
f
i 4⋯
3.
adiciona-se estas duas expressões temos
f
i1
f
i −1=
2 f
i
h
22
f
i ' '
h
424
f
i 4 ⋯
4.
subtrai-se
2 f
ide ambos os lados da expressão resultante, temos
f
i1−2 f
i
f
i−1=
h
22
f
i ' '
h
424
f
i 4 ⋯
5. truncando-se a série, temos
f
i' '=
f
i 1−2 f
i
f
i −1h
2esta é a derivada segunda. Dela podemos obter a expressão:
h
2f
i ' '
=
f
i1−2 f
i
f
i−1que será útil na derivação da expressão da regra de Simpson 1/3
Agora, para a obtenção da regra de Simpson 1/3 procede-se assim:
1. escreve-se a expansão de Taylor da curva que passa pelos pontos
f = f
i
x−x
i
f
i'
x−x
i
22!
f
i ' '
x−x
i
33!
f
i ' ' '
x −x
i
44!
f
i 4⋯
2.
por conveniência, utiliza-se o ponto central. Então integrando-se a função
I =
∫
xi−h xihf x dx=
∫
xi−h xih[
f
i
x− x
i
f
i'
x− x
i
22!
f
i ' '
x− x
i
33!
f
i ' ' '
x−x
i
44!
f
i 4 ⋯
]
dx
I =
∫
xi−h xihf x dx=2 h f
i0
1
3
h
3f
i' '⋯
3.
agora usando a derivada segunda aproximação central (
que obtivemos antes)
h
2f
i ' 'I =
∫
xi−h xih
f x dx=2 h f
i
1
3
h f
i−1−
2 f
i
f
i1⋯
4. Truncando a série, chegamos a expressão desejada
I =
∫
xi−h xih
f x dx=
1
3
h f
i−1
4 f
i
f
i1
Porque a série foi truncada a expressão correta é:
I =
1
3
h f
i−1
4 f
i
f
i1
E
O erro (
sem demostração) é dado avaliado pela expressão:
E≃−
h
5
90
f
4
x
.
A integração por Simpson 1/3 é bastante simples e pode ser obtida usando-se uma calculadora e sua acurácia e
boa o bastante para muitas aplicações.
Geralmente usa-se a regra de Simpson 1/3 para calcular a integral no lugar da integração pelo método do
trapézio.
Guarde esta expressão, pois ela é importante:
I =
h
3
f
i−1
4f
i
f
i1
Lembre-se
: Simpson 1/3 sempre utiliza um
número par de intervalos
ou então um
número impar de pontos
A regra de Simpson 1/3 é chamada assim por causa do
1
3
que aparece na expressão.
A regra de Simpson 1/3 estendida é obtida pela aplicação repetida da regra de Simpson 1/3 em um intervalo que
foi dividido em um
número par de intervalos
.
Chamando o
número total de intervalos
de
N
(
observe que N tem que ser par) a regra de Simpson 1/3 fica assim:
I =
h
3
[
f a4
∑
i=1 i impar N −1f aih2
∑
i=2 i par N − 2f aih f b
]
E
onde
h=
b−a
N
.
A primeira soma é feita somente com os índices impares (
observe o fator 4) enquanto a segunda soma envolve
apenas os índices pares (
observe o fator multiplicativo 2).
Quando se abre a expressão ela fica similar a:
I =
∫
a bf x dx =
=
h
3
[
f
0
4 f
12 f
24 f
3
2 f
4⋯2 f
N −24 f
N −1
f
N]
E
O erro (
sem demostração) é calculada por:
E≃−
b−a
180
h
4
f
4
observe que para um intervalo fixo
[
a , b]
o erro é proporcional a
h
4.
Exemplo 03:
Calcule a integral definida
I =
∫
0 1
1
1x
2
dx
A resposta exata da integral é:
I =
∫
0 1
1
1x
2
dx=tan
−1x
∣
0 1=
4
≃
0.7853
Resolvendo pelo método do Simpson 1/3 :
N =2
,
a=0
,
b=1
,
h=
1−0
2
=
1
2
=0.5
observe: N → par
x
0=0.0 f
0=1.0
x
1=0.5 f
1=0.8
x
2=1.0 f
2=0.5
I ≃
h
3
f
04 f
1
f
2≃
0.5
3
13.20.5≃0.7833
N =4
,
a=0
,
b=1
,
h=
1−0
4
=0.25
observe: N → par
I ≃
h
3
f
0
4 f
12 f
24 f
3
f
4≃
0.25
3
10.940.80.640.5≃0.785
Exemplo 04:
Calcule a integral definida
I =
∫
2 3
1
x1
dx
A resposta exata da integral é:
I =
∫
2 3
1
x1
dx=ln x1
∣
2 3=
ln
4
3
=0.287682072
Resolvendo pelo método do Simpson 1/3 :
N =4
,
a=2
,
b=3
,
h=
3−2
4
=
0.25
observe: N → par
I ≃
h
3
f
0
4 f
12 f
24 f
3
f
4
I ≃
0.25
3
0.3333340.30769232 0.285714240.26666670.25≃0.2876831
O erro é igual a :
E=0.287682072−0.2876831=0.000001027≃0.000001
4. Método de Simpson 3/8
O método de Simpson 3/8 é derivado da integração de um polinômio interpolador de grau três.
Considere a função
f x
mostrada na figura ao lado
Um polinômio interpolador linear seria assim
Um polinômio interpolador de segundo grau assim
Observe o intervalo
[
a , b]
dividido em 2 partes
Número par de intervalos
O polinômio interpolador de terceiro grau assim.
Observe o intervalo
[
a , b]
dividido em 3 partes
I =
∫
a bf x dx=
3
8
h [ f
03 f
1
3 f
2
f
3]
E
onde:
h=
b−a
3
,
f
i=
f aih
e
E
é o erro.
O erro é calculado pela expressão
E≃−
3
80
h
5
f
4x
onde
x=
ab
2
.
A fórmula de Simpson 3/8 é aplicável a três intervalos ou a múltiplos de três intervalos.
Quando o número de intervalos é impar, mas não múltiplo de três, precede-se assim:
1.
utiliza-se Simpson 3/8
aos 3 primeiros intervalos ou aos 3 últimos intervalos
2. aplica-se Simpson 1/3
ao intervalos restantes (
que serão par)
Porque a ordem do erro para Simpson 1/3
−
1
90
h
5
f
4 e a mesma para Simpson 3/8
−
3
80
h
5
f
4não há
ganho significativo na acurácia da integral. Portanto, pode-se utilizar indistintamente as duas regras.
Esta Folha contém
04 Atividades
00 atividades exemplos
03 atividade exemplo com ajustes e/ou acréscimos
01 atividades para serem feitas
00 atividades para serem ajustadas e/ou acrescidas
Seu professor de laboratório (e/ou teoria) poderá alterar esta relação !
Código da folha de atividades
Acesse a Home Page da disciplina, entre no link Datas-e-Atividades, para obter o código da folha de atividades. Toda atividade tem que ter o "xx" substituído pelo código indicado. Exemplos: código 02 ► fxxa3.f03
→
f02a3.f03Atividade 01
Entregar em meio magnético:
1. programa: int_trapezio fxxa1.f03
2. módulos: mod_ m_procedimentos_018.f03 m_funcoes_006.f03 3. arquivos: int_trapezio_001.dados
mais os necessários
Exemplo/Acréscimo/Ajuste:
A integral de uma função é a área sob a curva.
O cálculo da área pode ser feita utilizando-se trapézios elementares traçados sob a curva e depois somando-se todos os trapézios para obter a área total.
Este procedimento fornece o valor de uma integral definida.
Figura obtida de: http://pt.wikipedia.org/wiki/Integral em 10/01/2010) A regra do trapézio para o cálculo de uma integral definida é :
∫
a bf x dx≃
x
2
[
f a f b 2⋅
∑
i=1 N −1f x
i
]
onde são utilizados N intervalos e
x=
b−a
N
e
x
i=
ai x
Para verificar a correção do programa, calcule:
∫
0 6
x
2dx =72
usando N=10, depois N=100 e depois N=1000Modifique o programa para salvar um arquivo de dados (int_trapezio_001.dados) contendo o seguinte: • uma linha onde é feita a identificação da função
• na linha seguinte escreva: a, b, N, int
Obtenha os valores das seguintes integrais:
∫
a bf
2
x dx=
∫
a bdx
c
2
x
2=
1
c
arctan
x
c
∣
a bfazendo c = 2, calcule a integral para os limites a= 1 e b = 3
∫
a bf
3
x dx=
∫
a be
cxsin kx dx=
e
cxc
2
k
2
c sin kx− k cos kx
∣
a bcalcule a integral para: c = 2, k = 3, a = 0.5 e b = 1.3 Você tem que acrescentar as funções indicadas ( f2 e f3 ) no módulo m_funcoes_006 para poder calcular a integral. Quando utilizar o programa especifique a função desejadas no programa
OBSERVE
que esta atividade implementa o procedimento usando um DO infinito (DO sem contagem) e
faz cálculos com precisão simples
Escreva o programa
int_trapezioe salve-o no arquivo
fxxa1.f03Escreva o módulo
m_procedimentos_018e salve-o no arquivo
m_procedimentos_018.f03Escreva o módulo
m_funcoes_006e salve-o no arquivo
m_funcoes_006.f03Não deixe de atualizar o cabeçalho de forma adequada.
Você pode copiar e colar os códigos fontes,
mas não deixe de ajustar a diagramação dos
códigos fontes segundo o estilo de programação adotado na disciplina
________________________________________________________________________________________
►
arquivo: fxxa1.f03◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
program int_trapezio ! !--- ! Propósito: calcula a integral definida entre a e b usando a regra ! do trapézio!--- ! Arquivo: fxxa1.f03
! Autor: Anibal L. Pereira 06/01/2010 !Revisões: Anibal L. Pereira 20/02/2011
!--- use m_procedimentos_018
use m_funcoes_006 implicit none
real:: a, & ! limite inferior da integral b, & ! limite superior de integral int ! valor da integral
integer:: N ! número de intervalos real, external :: func
!--- entra com os limites e a quantidade de intervalos --- print*
print*," Entre com o limite inferior e limite superior da integral" read*, a, b
print*
print*," Entre com o número de intervalos" read*, N
!--- calcula a integral
call trapezio(a, b, N, int, f1) !--- mostra o resultado
print*
print*,"O valor da integral é:", int end program int_trapezio
_______________________________________________________________________________________
►
arquivo: m_procedimentos_018.f03◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
module m_procedimentos_018 ! !--- ! Propósito: Conter funções e sub-rotinas!--- ! Arquivo: m_procedimentos_018.f03
! Autor: Anibal L. Pereira 05/01/2010
!--- ! [módulos ] nenhum
! [funções ] nenhuma ![sub-rotinas] trapezio
! :::calcula a integral definida entre a e b pelo método do trapézio !--- public :: trapezio
contains
subroutine trapezio(a, b, N, int, func)
! definida da função pelo método do trapézio
!--- ! Autor: Anibal L. Pereira 08/01/2010
!--- real, intent(in):: a, & ! limite inferior
b ! limite superior integer, intent(in):: N ! número de intervalos real, intent(out) :: int ! valor da integral real, external :: func ! função a ser integrada real:: x, & ! ordenada
dx ! incremento integer:: i ! contador
!--- cálculo do intervalo --- dx = (b - a) / N
!-- calcula f(a) + f(b) --- int = func(a) + func(b)
!--- calcula o somatório --- i = 0
do
i = i + 1
x = a + i * dx ! pontos intermediários int = int + 2.0 * func(x)
if(i == (N - 1)) exit end do
!--- multiplica o resultado por metade do incremento --- int = (dx / 2.0) * int
end subroutine trapezio end module m_procedimentos_018
_______________________________________________________________________________________
►
arquivo: m_funcoes_006.f03◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
module m_funcoes_006 ! !--- ! Propósito: Contém funções definidas pelo usuário!--- ! Arquivo: m_funcoes_006.f03
! Autor: Anibal L. Pereira 05/01/2010
!--- ! [módulos ] nenhum ! [funções ] f1 (-->) y = x**2 ![sub-rotinas] nenhuma !--- public :: f1 contains real function f1(x) !--- ! Propósito: função y = x**2 !--- ! Autor: Anibal L. Pereira 08/01/2010
!--- implicit none
real, intent(in) :: x
!--- função muito simples. Está sendo usada para exemplificar o conceito f1 = x **2
end function f1
Atividade 02
Entregar em meio magnético:
1. programa: integ_trapezio_prog fxxa2.f03
2. módulos: fc_constantes.f03 m_procedimentos_019.f03 m_funcoes_007.f03 3. arquivos: int_trapezio_prog_001.dados mais os necessários
Exemplo/Acréscimo/Ajuste:
Esta atividade calcula a integral definida pelo método do trapézio, porém utiliza precisão dupla. Para verificar a correção do programa, calcule:
∫
0 6
x
2dx =72
usando N=10, depois N=100 e depois N=1000Modifique o programa para salvar um arquivo de dados (int_trapezio_prog_001.dados) contendo o seguinte: • uma linha onde é feita a identificação da função
• na linha seguinte escreva: a, b, N, int Obtenha os valores das seguintes integrais definidas:
•
∫
0 21
x
dx
(resposta Int=2.796) •∫
0 10300⋅x
1e
xdx
(resposta Int=246.28)•
∫
8 30
2000 ln
[
140000
140000−2100⋅t
]
−9.8⋅t
dt
(resposta Int=11074)Acrescente as funções no módulo m_funcoes_006 para poder calcular as integrais
Escreva o programa
integ_trapezio_proge salve-o no arquivo
fxxa2.f03Escreva o módulo
m_procedimentos_019e salve-o no arquivo
m_procedimentos_019.f03Escreva o módulo
m_funcoes_007e salve-o no arquivo
m_funcoes_007.f03Não deixe de atualizar o cabeçalho de forma adequada.
Documentação externa
PARCIAL
do programa: integ_trapezio_prog
1) Atividade: fxxa22) Programa: integ_trapezio_prog Autor: Anibal L. Pereira 03/02/2009 Versão: Revisões:
3) Arquivo: fxxa2.f03 4) Propósitos:
5) Identificação dos Dados: Entrada: Saída: 6) Subprogramas: [módulo ] [função ] [sub-rotina]
7) Método:
A área sobre a curva (integral da função) é obtida somando-se as áreas dos trapézios, então:
A1= x1 2 [f x1f x0] A2= x2 2 [f x2f x1] ⋮ An= xn 2 [f xnf xn−1]
porque
x
1=
x
2==
x
n=
x
chega-se a expressão
Integral=A=
x
2
[
f x
0
f x
n2⋅f x
1
2⋅f x
22⋅ f x
n−1]
ou
I =
x
2
[
f x
0
f x
n2⋅
∑
i=1 n−1f x
i
]
8) Comentários e Observações:9) Pseudocódigo ou Fluxograma ou Diagrama NS
________________________________________________________________________________________
►
arquivo: fxxa2.f03◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
program integ_trapezio_prog ! !--- ! Propósito: Calcula a integral definida da função especificada entre a e b ! pelo método do trapézio!--- ! Arquivo:fxxa2.f03
! Autor: Anibal L. Pereira 03/02/2009 !Revisões: !--- use fc_constantes use m_procedimentos_019 use m_funcoes_007 implicit none
real(kind=dp):: a, &!valor inicial b, &!valor final it !integral
integer::n, & ! quantidade de intervalos k ! indicador de ação
character(len=1)::menu="n" do while(.true.)
print*
print*,"===================" print*
!--- ! Entrada do valor inicial, final e intervalos !---
print*, "=====================================================" print*, "Entre ponto Inicial, Final e Quantidade de Intervalos" print*, "=====================================================" read*, a, b, n
call integ_trapezio(fun1,a,b,n,it)
print"(a,i10,a,D12.3)","Com",n," intervalos a integral vale :",it
do while(.true.)
print*,"---" print*,"s -- entre s para novo calculo da integral" print*,"n -- entre n para sair"
print*,"---" read*, menu
if(menu == "s" .or. menu == "S") then k=1
exit
elseif(menu == "n" .or. menu == "N") then k=2
exit end if end do
if(k == 1) k=0 !repete o método para nova raiz if(k == 2) exit
end do
end program integ_trapezio_prog
_______________________________________________________________________________________
►
arquivo: fc_constantes.f03◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄
►
Utilize os módulos existentes:
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
_______________________________________________________________________________________
►
arquivo: m_funcoes_007.f03◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
module m_funcoes_007 ! !--- ! Propósito: Contém funções definidas pelo usuário!--- ! Arquivo: m_funcoes_007.f03
! Autor: Anibal L. Pereira 20/02/2011
!--- ! [módulos ] nenhum ! [funções ] fun1 (-->) y = x**2 ![sub-rotinas] nenhuma !--- use fc_constantes public :: fun1 contains
real(kind=dp) function fun1(x)
!--- ! Propósito: função y = x**2
!--- ! Autor: Anibal L. Pereira 20/02/2011
!--- implicit none
real(kind=dp), intent(in) :: x
!--- função muito simples. Está sendo usada para exemplificar o conceito !--- de usar precisão dupla
end function fun1
end module m_funcoes_007
_______________________________________________________________________________________
►
arquivo: m_procedimentos_019.f03◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
module m_procedimentos_019 ! !--- ! Propósito: Conter funções e sub-rotinas!--- ! Arquivo: m_procedimentos_019.f03
! Autor: Anibal L. Pereira 05/01/2010
!--- ! [módulos ] nenhum
! [funções ] nenhuma ![sub-rotinas] integ_trapezio
! :::calcula a integral definida entre a e b pelo método do trapézio ! usando precisão dupla
!--- use fc_constantes public :: integ_trapezio contains subroutine integ_trapezio(func,a,b,n,it) !--- !Propósito:
! Calcula a integral da função entre os pontos a e b utilizando n intervalos ! pelo método do trapézio
!--- !Autor: Anibal L. Pereira 04/02/2009
!Revisões: !--- real(kind=dp),external::func real(kind=dp),intent(in)::a, b integer,intent(in)::n real(kind=dp),intent(out)::it !--- real(kind=dp)::dx, & !incremento
s1, & !parte da soma s2, & !parte da soma p !ponto integer:: i ! contador !--- dx=(b-a)/n s1=func(a)+func(b) p=a s2=0.0_dp do i=1,n-1 p=p+dx s2=s2+func(p) end do it=(dx/2.0_dp)*(s1+2_dp*(s2)) end subroutine integ_trapezio end module m_procedimentos_019
Atividade 03
Entregar em meio magnético:
1. programa: simpson_prog fxxa3.f03
2. módulos: fc_constantes.f03 m_procedimentos_020.f03 m_funcoes_008.f03 3. arquivos: simpson_prog_001.dados mais os necessários
Exemplo/Acréscimo/Ajuste:
Esta atividade calcula a integral definida pelo método de simpson 1/3
O programa calcula a integral:
∫
0 10
π⋅
(
1+
(
x
2
)
2)
2dx =4482.006
Use N =100 OBSERVAÇÃO:a sub-rotina trata para que o número de pontos usado com simpson 1/3 seja sempre um número de pontos impar, o que garante que o número de intervalos é par
Modifique o programa para salvar um arquivo de dados (simpson_prog_001.dados) contendo o seguinte: • uma linha onde é feita a identificação da função
• na linha seguinte escreva: a, b, N, int Obtenha os valores das seguintes integrais definidas:
•
I=
∫
0 π 2sin(x )dx
para esta integral use a a regra do trapézio com N=2,4,8,25,50,100 e também a regra simpson1/3 com N=3,5,9,25
•
I=
∫
0 π1
2+cos(x)
dx
(resposta:1.8137) •I=
∫
1 2log(1+ x)
x
dx
(resposta:0.6142) •I=
∫
0 π 21
1+sin
2(
x )
dx
(resposta:1.1107)Coloque as funções no módulo m_funcoes_008 para poder calcular as integrais
Escreva o programa
simpson_proge salve-o no arquivo
fxxa3.f03Escreva o módulo
m_procedimentos020e salve-o no arquivo
m_procedimentos_020.f03Escreva o módulo
m_funcoes_008e salve-o no arquivo
m_funcoes_008.f031) Atividade: fxxa2
2) Programa: simpson_prog Autor: Anibal L. Pereira 03/02/2009 Versão: Revisões:
3) Arquivo: fxxa2.f03
4) Propósitos: Obter o valor da integral definida de uma função entre os pontos a e b usando o método de simpson 1/3 5) Identificação dos Dados:
Entrada: Saída: 6) Subprogramas: [módulo ] [função ] [sub-rotina] 7) Método:
O método do trapézio utiliza uma linha reta para unir os 2 pontos consecutivos, daí seu nome - trapézio. O método de
Simpson 1/3 utiliza um polinômio de segunda ordem (equação quadrática) para unir 2 pontos consecutivos. A construção
de um polinômio
P
2
x
necessita de 3 pontos
x
0, x
1, x
2, o que leva a necessidade garantir um número de
intervalo par, pois somente assim existirá um número impar de pontos.
O polinômio interpolador ascendente de Newton que gera uma curva quadrática com os (n+1=3) pontos
x
0, x
1, x
2é :
P
2
x
0=
f x
0
sh= y
0
s y
0
1
2
s s−1
2
y
0
com a variável local igual a
s=
x−x
0h
.
Agora como a variável local assume os valores 0, 1 e 2
s=0,1 ,2
s=0 ,
x
00⋅h= x
0=
a
s=1 ,
x
01⋅h= x
1s=2 ,
x
0
2⋅h=x
2=
b
I =
∫
a bf x dx =
∫
a bP
2
x dx =
∫
s=0 s=2y
0
s y
0
1
2
s s−1
2y
0dx
chegar-se a expressão
I =
h
3
⋅
[
f
04⋅f
1
f
2]
ou
I =
h
3
⋅
[
f a4⋅f x
1
f b
]
Observe o 1/3 na expressão. Isto leva a denominação Simpson 1/3 para o método. Repetindo-se o método para vários
pontos (NP –
garantido que
NP é impar
) chega-se a fórmula geral de Simpson 1/3:
I =
∫
a bf x dx =
h
3
⋅
[
f a f b4⋅
∑
i=1 i ,impar NP−1f aih2⋅
∑
i=2 i , par NP−2f aih
]
8) Comentários e Observações:►
arquivo: fxxa3.f03◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
program simpson_prog !
!--- ! Propósito: Calcula a integral definida da função especificada entre a e b ! pelo método de simpson 1/3
!--- ! Arquivo:fxxa3.f03
! Autor: Anibal L. Pereira 03/02/2009 !Revisões: !--- use fc_constantes use m_procedimentos_020 use m_funcoes_008 implicit none
real(kind=dp):: a, &!valor inicial b, &!valor final it !integral
integer::n, & ! número de intervalos inicial k ! indicador de ação
character(len=1)::menu="n" do while(.true.)
print*
print*,"======================" print*," Metodo de Simpson 1/3" print*,"======================" print*
!--- ! Entrada do valor inicial, final e intervalos !---
print*, "=====================================================" print*, "Entre ponto Inicial, Final e Quantidade de Intervalos" print*, "=====================================================" read*, a, b, n
call simpson_1_3(fun4,a,b,n,it)
print"(a,i10,a,D15.7)","Com",n," intervalos a integral vale :",it do while(.true.)
print*,"---" print*,"s -- entre s para novo calculo da integral" print*,"n -- entre n para sair"
print*,"---" read*, menu
if(menu == "s" .or. menu == "S") then k=1
exit
elseif(menu == "n" .or. menu == "N") then k=2
exit end if end do
if(k == 1) k=0 !repete o método para nova raiz if(k == 2) exit
end do
end program simpson_prog
_______________________________________________________________________________________
►
arquivo: fc_constantes.f03◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄
►
Utilize os módulos existentes:
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
_______________________________________________________________________________________
►
arquivo: m_funcoes_008.f03◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
!
!--- ! Propósito: Contém funções definidas pelo usuário
!--- ! Arquivo: m_funcoes_008.f03
! Autor: Anibal L. Pereira 20/02/2011
!--- ! [módulos ] nenhum
! [funções ] fun4 (-->) f(x) = (1 + (x/2.0)**2)**2)*pi ![sub-rotinas] nenhuma
!--- use fc_constantes
public :: fun4 contains
function fun4(x) result(y)
!--- !Propósito:
! Define função: f(x) = (1 + (x/2.0)**2)**2)*pi
!--- !Autor: Anibal L. Pereira 03/02/2009
!Revisões:
!--- real(kind=dp),intent(in)::x ! valor da abcissa
!--- real(kind=dp)::y ! resultado
!---
y = ((1_dp + (x/2.0_dp)**2)**2)*pi_d end function fun4
end module m_funcoes_008
_______________________________________________________________________________________
►
arquivo: m_procedimentos_020.f03◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄►◄
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
module m_procedimentos_020 ! !--- ! Propósito: Conter funções e sub-rotinas!--- ! Arquivo: m_procedimentos_020.f03
! Autor: Anibal L. Pereira 20/02/2011
!--- ! [módulos ] nenhum
! [funções ] nenhuma ![sub-rotinas] simpson_1_3
! :::Calcula a integral da função entre os pontos a e b utilizando n1 intervalos ! pelo método de simpson 1/3
! !--- use fc_constantes public :: integ_trapezio contains !--- subroutine simpson_1_3(func,a,b,n,simp) !--- !Propósito:
! Calcula a integral da função entre os pontos a e b utilizando n1 intervalos ! pelo método de simpson 1/3
!--- !Autor: Anibal L. Pereira 04/02/2009
!Revisões:
!--- real(kind=dp),external::func
integer,intent(in)::n ! número sugerindo de intervalos (par ou impar) real(kind=dp),intent(out)::simp ! valor da integral
!--- real(kind=dp)::h, & !tamanho do incremento x !ponto
integer:: n1, & ! números de intervalos próximo de n, que será sempre par i ! contador
!---
!--- ! garante que o número de intervalos (n1) seja sempre par
! ou seja garante um números impares de pontos ! ! se n é par ===> n1 = n ! se n é impar ===> n1 = n + 1 !--- n1=max(n,2) n1=n1+modulo(n1,2) h=(b-a)/n1 x=a simp=func(x) ! 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 end module m_procedimentos_020