Python - Matemática com Python

Nesta etapa, reunimos os comandos necessários para trabalhar com matemática em Python. Eles serão usados nos capítulos de zeros de funções, sistemas lineares, interpolação, regressão, integrais e equações diferenciais.

O ponto principal é perceber que existem duas formas comuns de usar matemática no computador. A primeira é o cálculo numérico, no qual trabalhamos com aproximações decimais, tabelas de valores, vetores e matrizes. A segunda é o cálculo simbólico, no qual o Python manipula expressões algébricas, como \(x^2+3x-2\), derivadas e simplificações.

Tipo de cálculo Biblioteca Uso principal
Numérico math, numpy, scipy Calcular aproximações, vetores, matrizes e métodos numéricos
Simbólico sympy Manipular fórmulas, derivadas, polinômios e expressões algébricas
Visual matplotlib Construir gráficos de funções, pontos e resultados numéricos

Biblioteca math

A biblioteca math possui funções matemáticas comuns. Ela é indicada quando queremos calcular uma função em um único número por vez:

from math import sqrt, sin, cos, exp, log, pi

print(sqrt(9))
print(cos(pi))
print(exp(1))

As funções trigonométricas de math usam radianos. Por exemplo, \(\pi\) radianos correspondem a \(180^\circ\).

Matemática Python Significado
\(\sqrt{x}\) sqrt(x) Raiz quadrada
\(\sin(x)\) sin(x) Seno
\(\cos(x)\) cos(x) Cosseno
\(e^x\) exp(x) Exponencial
\(\ln(x)\) log(x) Logaritmo natural

NumPy

A biblioteca numpy é usada para trabalhar com vetores, matrizes e cálculos numéricos. Ela será útil quando precisarmos calcular vários valores de uma vez, como em tabelas de pontos, interpolação, regressão e integração numérica:

import numpy as np

x = np.array([1, 2, 3, 4], dtype=float)
y = x**2 + 1

print(y)

Com NumPy, operações como potência, soma e multiplicação são aplicadas elemento a elemento nos vetores.

x = np.array([1, 2, 3], dtype=float)

print(2*x)
print(x + 5)
print(x**2)

Criando pontos igualmente espaçados

Em vários métodos numéricos, precisamos dividir um intervalo em partes iguais. Para isso, podemos usar np.linspace. O exemplo abaixo cria 5 pontos entre 0 e 2, incluindo os extremos:

import numpy as np

x = np.linspace(0, 2, 5)
print(x)

O resultado representa os pontos \(0\), \(0.5\), \(1.0\), \(1.5\) e \(2.0\). Essa ideia aparecerá nas tabelas de valores, nas regras de integração e nos métodos para equações diferenciais.

Funções matemáticas com NumPy

Quando a variável é um vetor de NumPy, devemos usar as funções do próprio NumPy, como np.sin, np.cos, np.exp e np.sqrt. Assim, a função é calculada em todos os pontos do vetor:

import numpy as np

def f(x):
    return np.sin(x) + x**2

pontos = np.linspace(0, 1, 6)
valores = f(pontos)

print(pontos)
print(valores)

Essa forma de escrever a função facilita a construção de tabelas, pois não é necessário repetir o cálculo ponto por ponto.

Matrizes

Matrizes aparecem principalmente nos capítulos de sistemas lineares e regressão:

import numpy as np

A = np.array([
    [2, -1],
    [1, 3]
], dtype=float)

b = np.array([1, 7], dtype=float)

print(A)
print(b)

Para acessar um elemento da matriz, usamos dois índices:

print(A[0, 0])
print(A[1, 0])

O primeiro índice indica a linha e o segundo indica a coluna. Como em Python a contagem começa em zero, A[0, 0] representa o elemento da primeira linha e primeira coluna.

Multiplicação matricial

O operador @ realiza multiplicação matricial:

x = np.array([2, 1], dtype=float)
resultado = A @ x

print(resultado)

Essa operação representa o produto \(Ax\), muito usado em sistemas lineares. Para resolver diretamente um sistema \(Ax=b\), podemos usar np.linalg.solve:

solucao = np.linalg.solve(A, b)
print(solucao)

Nos capítulos de métodos numéricos, esse comando pode ser usado para conferir resultados. A ideia principal, porém, será entender e programar os métodos passo a passo.

Somatórios e produtos

Muitas fórmulas matemáticas usam somatórios. Em Python, podemos representar essas somas com sum. Por exemplo, a soma \(\sum x_i^2\) pode ser escrita assim:

x = [1, 2, 3, 4]
soma = sum(xi**2 for xi in x)

print(soma)

Com NumPy, também podemos calcular somas diretamente sobre vetores:

x = np.array([1, 2, 3, 4], dtype=float)
soma = np.sum(x**2)

print(soma)

SymPy

A biblioteca sympy permite trabalhar com expressões simbólicas, como polinômios, derivadas e simplificações. Diferentemente do NumPy, aqui a variável \(x\) não recebe um valor numérico imediatamente; ela representa uma incógnita algébrica:

import sympy as sp

x = sp.symbols("x")
f = x**2 + 3*x - 2

print(sp.expand((x - 1)*(x + 2)))
print(sp.diff(f, x))

Também podemos substituir um valor na expressão usando subs:

valor = f.subs(x, 2)
print(valor)

Esse recurso será útil quando for necessário manipular polinômios, calcular derivadas e comparar uma expressão algébrica com sua forma expandida ou simplificada.

SciPy

A biblioteca scipy possui rotinas prontas para cálculo científico. Ela pode ser usada para comparar resultados obtidos manualmente pelos métodos numéricos estudados. No exemplo abaixo, quad calcula uma aproximação para uma integral definida:

from scipy.integrate import quad

def f(x):
    return x**2

resultado, erro = quad(f, 0, 1)
print(resultado)

A variável resultado guarda o valor aproximado da integral, enquanto erro guarda uma estimativa do erro numérico do cálculo.

Exemplo completo

O código abaixo calcula valores de uma função em vários pontos:

import numpy as np

def f(x):
    return x**2 - 4

pontos = np.linspace(0, 3, 7)
valores = f(pontos)

print(pontos)
print(valores)

Atividade

Use NumPy para criar os pontos entre 0 e 2 com passo 0.5 e calcule \(f(x)=x^2+1\) em cada ponto. Depois, use np.sum para somar todos os valores obtidos.