Python para Integrais

Neste capítulo, o Python será usado para calcular valores de funções em pontos igualmente espaçados, montar pesos das regras numéricas e somar os termos das fórmulas de integração. Como a introdução ao Python já apresentou funções, listas e NumPy, aqui o foco será estruturar malhas, validar regras e escrever fórmulas compostas de forma reutilizável.

Definindo a função integranda

A função integranda deve ser escrita de forma compatível com o tipo de cálculo que será usado. Se quisermos avaliar vários pontos ao mesmo tempo com NumPy, usamos operações e funções vetorizadas:

import numpy as np

def f(x):
    return x**2 + 3*x - 2

print(f(np.array([1.0, 1.5, 2.0])))

Quando a expressão usa raiz, exponencial ou funções trigonométricas e será aplicada a vetores, use as funções de NumPy:

def f(x):
    return -np.sqrt(x / np.cos(x)) + 5

Cálculo do passo

Nas regras compostas, dividimos o intervalo \([a,b]\) em subintervalos. O passo é calculado por:

\[h = \frac{b-a}{n}\]
a = 1
b = 3
n = 4

h = (b - a) / n
print(h)

Gerando os pontos

Depois de calcular \(h\), podemos gerar os pontos \(x_i\) com np.linspace. Para \(n\) subintervalos, precisamos de \(n+1\) pontos:

x = np.linspace(a, b, n + 1)
y = f(x)

print(x)
print(y)

Essa forma reduz o risco de erro no último ponto do intervalo e deixa o cálculo dos valores de \(f(x_i)\) concentrado em uma única linha.

Somatórios com pesos

As regras dos Trapézios e de Simpson usam pesos diferentes para cada ponto. Podemos guardar os pesos em um vetor e multiplicar todos os termos de uma vez:

pesos = np.array([1, 2, 2, 2, 1], dtype=float)
produto = np.sum(pesos * y)

integral = h/2 * produto
print(integral)

Para a primeira regra de Simpson, os pesos alternam entre 4 e 2 nos pontos internos:

pesos = np.ones(n + 1)
pesos[1:n:2] = 4
pesos[2:n:2] = 2

A primeira regra de Simpson exige que \(n\) seja par. Essa condição pode ser verificada antes do cálculo:

if n % 2 != 0:
    raise ValueError("A primeira regra de Simpson exige n par")
Comando Uso nas integrais
np.sum(pesos * y) Soma os termos ponderados da fórmula
i % 2 Verifica a paridade de \(n\) ou de um índice
pesos[1:n:2] Seleciona posições ímpares internas do vetor de pesos

Funções reutilizáveis para regras compostas

Para evitar repetir a mesma estrutura em vários exemplos, podemos criar uma função para a regra dos Trapézios composta:

def trapezios_composta(f, a, b, n):
    x = np.linspace(a, b, n + 1)
    y = f(x)
    h = (b - a) / n

    pesos = np.ones(n + 1)
    pesos[1:n] = 2

    return h/2 * np.sum(pesos * y)

Atividade

Para \(a=0\), \(b=2\) e \(n=4\), gere os pontos com np.linspace, calcule os valores de \(f(x)=x^2+1\), monte os pesos da regra dos Trapézios e calcule a aproximação da integral.