Quando a matemática simbólica encontra seu limite, entra a numérica. Esta série
percorre o SciPy e o NumPy resolvendo o que o SymPy não resolve: equações sem
solução fechada, integrais que não têm primitiva, derivadas a partir de dados
medidos, ajustes de curva com incerteza, sistemas de equações diferenciais e a
transformada de Fourier — sempre partindo de problemas concretos de física,
química e engenharia.
Os artigos são listados abaixo, na ordem em que foram escritos.
A maioria das equações, integrais e equações diferenciais de problemas reais não tem solução em forma fechada, e o SymPy não as resolve. Esta série de 13 artigos mostra como NumPy e SciPy atacam esses problemas: raízes, polinômios, cálculo numérico, otimização e FFT.
Na equação de Kepler, a incógnita aparece dentro e fora de um seno, e nenhuma álgebra a isola. Para casos assim, o SciPy aproxima a raiz. Veremos bisseção e brentq, o método de Newton e por que ele pode falhar, e os sistemas não lineares com fsolve e root.
Onde está o Cometa Halley numa data qualquer? A resposta exige resolver a equação de Kepler, que não tem forma fechada. Com newton e brentq, do SciPy, localizamos o cometa, tornamos visível a lei das áreas e calculamos o alcance de um projétil com resistência do ar.
Do pH de um ácido fraco ao volume de um gás real e ao fator de atrito de uma tubulação: três equações que a química e a engenharia usam no dia a dia e que só têm solução numérica útil. Resolvemos as três com brentq e numpy.roots e reconstruímos o diagrama de Moody.
Guardados em float64, os coeficientes do polinômio de Wilkinson já não devolvem as raízes de 1 a 20: duas delas viram um par complexo. Antes de chegar a ele, vemos raízes, derivadas, integrais e divisão com numpy.polynomial e a armadilha da ordem dos coeficientes.
Dados experimentais raramente caem sobre uma curva. Veremos como o NumPy ajusta polinômios a dados com ruído, o que o SymPy não faz, por que extrapolar é perigoso e por que o fenômeno de Runge vem dos nós igualmente espaçados, e não do grau alto.
A temperatura do reator está subindo rápido demais? A pergunta é uma derivada, mas só há números numa tabela. Veremos diferenças finitas, numpy.gradient e scipy.differentiate, e por que diminuir o passo nem sempre melhora a derivada, por causa do arredondamento e do ruído.
A função gaussiana não tem primitiva elementar, e isso é um teorema de Liouville. Quando a primitiva não existe, ou só há uma tabela de medições, o caminho é numérico: quad, trapézio e Simpson, do scipy.integrate, com os cuidados que cada um pede.
A fórmula clássica do período do pêndulo só vale para oscilações pequenas, e a equação exata não tem solução em forma fechada. Com o solve_ivp do SciPy, medimos o período de verdade e resolvemos sistemas rígidos, Lotka-Volterra, queda com arrasto e reações consecutivas.
Derivar e igualar a zero resolve a otimização de livro-texto. Com várias variáveis, restrições ou função sem derivada tratável, a conta trava. Veremos minimize, SLSQP e bounds do scipy.optimize, os mínimos locais e a busca global com differential_evolution.
Maximizar só a conversão de um reator empurra temperatura e tempo para o limite, e essa é a resposta certa para a pergunta errada. Quatro problemas reais com scipy.optimize: o reator, o alcance de um projétil com arrasto, uma viga com três restrições e um mix de produção.
Um parâmetro ajustado sem barra de erro está incompleto. Veremos como o curve_fit funciona, o que a matriz de covariância diz sobre a incerteza e a correlação dos parâmetros, e por que linearizar os dados para ajustar pode destruir o resultado, como em Lineweaver-Burk.