| | | | |

4.1 Integração Autoadaptativa

Ajude a manter o site livre, gratuito e sem propagandas. Colabore!

Vamos considerar o problema de integrar

I(a,b)=abf(x)𝑑x (4.1)

pela Regra de Simpson5858endnote: 58Consulte mais sobre a Regra de Simpson em Seção 10.1 Regras de Newton-Cotes.. Em um dado subintervalo [α,β][a,b], temos

I(α,β)=h03[f(α)+4f(α+h0)+f(β)]S(α,β)h0590f(4)(ξ), (4.2)

onde h0=(βα)/2 e ξ(α,β). Ou seja, temos que

I(α,β)S(α,β)=h0590f(4)(ξ). (4.3)

A ideia é explorarmos esta informação de forma a obtermos uma estimativa para o erro de integração no intervalo [α,β] sem necessitar computar f(4).

Aplicando a Regra de Simpson na partição [α,(α+β)/2][(α+β)/2,β], obtemos

I(α,β)S2(α,β)=(h0/2)590(f(4)(ξ)+f(4)(η)), (4.4)

onde ξ(α,(α+β)/2), η(α+β)/2,β) e

S2(α,β)=S(α,(α+β)/2)+S((α+β)/2,β). (4.5)

Agora, vamos assumir que f(4)(ξ)f(4)(η) de forma que temos

I(α,β)S2(α,β)116h0590f(4)(ξ). (4.6)

De (4.3) e (4.6), obtemos

h0590f(4)(ξ)1615[S(α,β)S2(α,β)](α,β). (4.7)

Isto nos fornece a seguinte estimativa a posteriori do erro

|I(α,β)S2(α,β)||(α,β)|15. (4.8)

Na prática, costuma-se utilizar a seguinte estimativa mais restrita

|I(α,β)S2(α,β)||(α,β)|10. (4.9)

Para garantir uma precisão global em [a,b] igual a uma dada tolerância, é suficiente impor que

|(α,β)|10ϵβαba. (4.10)
Código 8: Algoritmo Simpson Autoadaptativo
1def simpson(f,a,b):
2  return (b-a)/6. * (f(a) + 4*f((a+b)/2.) + f(b))
3
4def simad(f,a,b,tol=1e-8,hmin=1e-10):
5  # intervalo calculado
6  S = (a,a)
7  # intervalo a ser calculado
8  N = (a,b)
9  # intervalo ativo
10  A = N
11  # aprox calculada em [a, b]
12  J = 0.
13  # aprox calculada em A
14  JA = 0.
15  # num f eval
16  nfe = 0
17  # info
18  info = 0
19  while (S != (a,b)):
20    print(S,N,A)
21    # tamanho do intervalo
22    h = A[1]-A[0]
23    while (h > hmin):
24      J0 = simpson(f,A[0],A[1])
25      JA = simpson(f,A[0],A[0]+h/2.)
26      JA += simpson(f,A[0]+h/2.,A[1])
27      nfe += 9
28      # est erro
29      est = np.fabs(J0-JA)/10.
30      # criterio de parada
31      if (est < tol*h/(b-a)):
32        break
33      else:
34        A = (A[0],A[0]+h/2.)
35        h = h/2.
36        print("\t",S,N,A,h,est)
37        if (h < hmin):
38          print("Atencao! h < hmin !")
39          info = -1
40          break
41    J += JA
42    S = (a, A[1])
43    N = (A[1], b)
44    A = N
45  return J, nfe, info
Exemplo 4.1.1.
34arctg(10x)𝑑x =3arctg(30)ln(1601)20+ln(901)20+4arctg(40) (4.11)
1.54203622 (4.12)
E. 4.1.1.

Implemente uma abordagem autoadaptativa usando a Regra do Trapézio. Valide-a e compare com o exemplo anterior.


Envie seu comentário

As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a Política de Uso de Dados para mais informações. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!