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=True controla impressão de resultados - tabela=None usa variável global ou padrão True para exibir tabelas - grafico=None usa variável global ou padrão True para exibir gráficos

  • Tratamento 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ção

  • Testes 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)

Testes: test_ajustecurvas