Ajustes de Curvas
Funções do módulo codigos.ajustecurvas para ajustes de curvas e estatísticas.
Características Implementadas
O módulo codigos/ajustecurvas.py implementa métodos robustos para ajuste de curvas com as seguintes características:
Validação de Entrada: Todas as funções validam entradas usando
_validate_curve_fitting_inputs()Parâmetros Consistentes: Todas as funções principais seguem a assinatura
(x, y, ..., verbose=True, tabela=None, grafico=None)Controle de Saída: -
verbose=Truecontrola impressão de resultados -tabela=Noneusa variável global ou padrãoTruepara exibir tabelas -grafico=Noneusa variável global ou padrãoTruepara exibir gráficosTratamento de Erros: Validação robusta com mensagens de erro informativas
Métodos Implementados: - Regressão linear por pontos selecionados - Regressão linear por intervalo - Mínimos quadrados (linear) - Mínimos quadrados polinomial (ordem n)
Métricas Estatísticas: Cálculo de R², Chi² ajustado, desvios e resíduos
Interface Interativa: Função
dados()para entrada de dados com validaçãoTestes Abrangentes: 15+ testes cobrindo casos normais e de erro
Documentação
As funções abaixo implementam métodos de ajuste (regressão linear, mínimos quadrados
ordem n, estatísticas de ajuste e utilitários de tabela). Todas aceitam numpy.ndarray
como entrada e retornam estruturas numpy para integração simples com outras rotinas.
- codigos.ajustecurvas.dados()[código-fonte]
Função de entrada de dados interativa.
Solicita ao usuário o número de pontos e os valores de x e y, com validação de entrada e tratamento de erros.
Returns: - Vetor x (np.ndarray) - Vetor y (np.ndarray)
- codigos.ajustecurvas.tabela_minimos_quadrados(x, y, verbose=True)[código-fonte]
Tabela para exibição dos cálculos pelo método dos mínimos quadrados:
Entradas/Parâmetros: - x (vetor de pontos em x) - y (vetor de pontos em y) - verbose (bool): se True, imprime a tabela; se False, executa silenciosamente
Fórmulas b1 = (sum_xi * sum_yi - n * sum_xiyi) / (sum_xi ** 2 - n * sum_xi**2) b0 = (sum_yi - b1 * sum_xi) / n
Saídas: - Tabela com i,xi,yi,xi**2,yi**2,xiyi,ui,di,di**2
- codigos.ajustecurvas.calcula_chi_e_r2(x, y, b0, b1, n_params=2, verbose=True)[código-fonte]
Calcula chi-quadrado (ajustado), soma dos quadrados dos resíduos (desvio) e coeficiente de determinação R^2, recebendo explicitamente os coeficientes da reta (b0, b1) e os pontos (x, y).
Parâmetros: x (np.array): valores de x y (np.array): valores observados b0 (float): coeficiente linear da reta b1 (float): coeficiente angular da reta n_params (int): número de parâmetros do modelo (p), padrão 2 para regressão linear verbose (bool): se True, imprime os resultados; se False, executa silenciosamente
Fórmulas: D(a0,a1) = sum((y_i - b0 - b1*x_i)^2) SQT = sum((y_i - y_media)^2) SQRes = sum((y_i - Ui)^2) onde Ui = b0 + b1 * x_i SQReg = sum((Ui - y_media)^2) R^2 = 1 - (SQRes / SQT) Chi^2 = D(a0,a1) / (n - p) (n = número de pontos, p = número de parâmetros do modelo)
- Retorna:
chi2, r2, Desvio, SQT, SQRes, SQReg, Ui
- codigos.ajustecurvas.regressaolinear(x, y, verbose=True, tabela=None, grafico=None)[código-fonte]
Método 1: Polinômio interpolador de ordem 1 - Escolhendo o primeiro e o último ponto, ou qualquer outro par de pontos inserido previamente pelo usuário.
Entradas/Parâmetros: - x (vetor de pontos em x) - y (vetor de pontos em y) - verbose (bool): se True, imprime resultados; se False, executa silenciosamente - tabela (bool): se True, mostra tabela; se None, usa variável global - grafico (bool): se True, mostra gráfico; se None, usa variável global - x0,y0; x1,y1 (pares de pontos escolhidos por indice)
Fórmulas b1 = (y1 - y0) / (x1 - x0) b0 = y0 - b1 * x0 P_1(x) = y0 - ((y1 - y0)/(x1 - x0))*(x-x0) D(a0,a1) = sum((yi - p1(xi))^2)
Saídas: - Tabela com i,xi,yi,p_1(xi),di - Equação da reta - Desvio D(a0,a1) - Chi2, R2 - Gráfico ilustrativo
- codigos.ajustecurvas.regressaolinear_intervalo(x, y, verbose=True, tabela=None, grafico=None)[código-fonte]
Método 2: Polinômio interpolador de ordem 1 dentro do intervalo (x.min(x), x.max(x)) - Inserindo pontos manualmente dentro do intervalo previamente definido com os dados da funcao dados()
Entradas/Parâmetros: - x (vetor de pontos em x) - y (vetor de pontos em y) - verbose (bool): se True, imprime resultados; se False, executa silenciosamente
Fórmulas P_1(x) = y0 - ((y1 - y0)/(x1 - x0))*(x-x0) D(a0,a1) = sum((yi - p1(xi))^2)
Saídas: - Tabela com i,xi,yi,p_1(xi),di - Equação da reta - Desvio D(a0,a1) - Chi2, R2 - Gráfico ilustrativo
- codigos.ajustecurvas.minquadrados(x, y, verbose=True, tabela=None, grafico=None)[código-fonte]
Método 3: Mínimos Quadrados - É a derivada do desvio igualada a 0 com respeito a b0 e b1 (parciais)
Entradas/Parâmetros: - x (vetor de pontos em x) - y (vetor de pontos em y) - verbose (bool): se True, imprime resultados; se False, executa silenciosamente - tabela (bool): se True, mostra tabela; se None, usa variável global - grafico (bool): se True, mostra gráfico; se None, usa variável global
Fórmulas: b0 = (sum(yi) - b1*sum(xi)) / n b1 = (sum(xi)*sum(yi) - n*sum(xiyi))/((sum(xi)**2) - n*sum(xi**2)) D(b0,b1) = sum((yi - (b0 + b1*xi))^2)
Saídas: - Tabela com i,xi,yi,xi**2,yi**2,xiyi,ui,di,di**2 - Equação da reta - Desvio D(b0,b1) - Chi2, R2 - Gráfico ilustrativo
Exemplo de Uso
1"""Exemplo: ajuste de curva linear simples (ajustecurvas)"""
2import numpy as np
3from codigos import ajustecurvas as ac
4
5if __name__ == '__main__':
6 # Dados de exemplo
7 x = np.array([0.0, 1.0, 2.0])
8 y = 1.0 + 2.0 * x # y = 1 + 2x
9
10 print("=== Exemplo de Ajuste de Curvas ===")
11 print("Dados: x =", x)
12 print("Dados: y =", y)
13 print("Função esperada: y = 1 + 2x")
14 print()
15
16 # Ajuste com saída controlada
17 print("1. Ajuste com tabelas e gráficos desabilitados:")
18 ac.minquadrados(x, y, verbose=True, tabela=False, grafico=False)
19
20 print("\n2. Cálculo de estatísticas:")
21 stats = ac.calcula_chi_e_r2(x, y, b0=1.0, b1=2.0, n_params=2, verbose=False)
22 print(f"R² = {stats['R2']:.6f} (esperado: 1.0 para ajuste perfeito)")
23 print(f"Chi² ajustado = {stats['Chi2']:.6f}")
24 print(f"Desvio (SQRes) = {stats['Desvio']:.6f}")
25
26 print("\n3. Exemplo com dados reais (altura vs peso):")
27 # Exemplo com dados reais
28 x_altura = np.array([150, 160, 170, 180, 190]) # cm
29 y_peso = np.array([50, 60, 65, 75, 85]) # kg
30 ac.minquadrados(x_altura, y_peso, verbose=True, tabela=False, grafico=False)
Testes de Integração
Coberto pelos seguintes testes:
Teste global:
pytest -q(roda todos os testes do projeto)Teste de calcnum:
pytest tests/test_inputs_calcnum.py::test_calcnum_inputs_basic -q(valida integração via menu principal)Teste individual:
pytest tests/test_ajustecurvas.py -v(testes específicos do módulo)
Teste correspondente: tests/inputs/inputAjustes.txt
Testes Unitários (visíveis)
Links rápidos
Teste de integração relacionado:
tests/test_inputs_calcnum.py::test_calcnum_inputs_basicTestes unitários (arquivo):
tests/test_ajustecurvas.pyPágina de testes (docs): Testes: test_ajustecurvas