import numpy as np
from .config import est_pedagogique
[docs]
def matrice_conception(x, degre):
"""
Genere la matrice de conception (Vandermonde) pour les moindres carres.
Args:
x (array_like): Points d'abscisse.
degre (int): Degre du polynome.
Returns:
ndarray: Matrice de conception.
"""
return np.vander(x, degre + 1)
[docs]
def equations_normales(x, y, degre):
"""
Formule les equations normales (A.T @ A)x = A.T @ y.
Args:
x (array_like): Points d'abscisse.
y (array_like): Points d'ordonnee.
degre (int): Degre du polynome.
Returns:
tuple: (Matrice de gauche, Vecteur de droite).
"""
A = matrice_conception(x, degre)
gauche = A.T @ A
droite = A.T @ y
if est_pedagogique():
print("[Pedagogique] Equations Normales (A.T @ A)x = A.T @ y:")
print(f" Matrice A.T @ A:\n{gauche}")
print(f" Vecteur A.T @ y: {droite}")
return gauche, droite
[docs]
def moindres_carres(x, y, degre, pedagogique=None):
"""
Realise une approximation par moindres carres.
Args:
x (array_like): Points d'abscisse.
y (array_like): Points d'ordonnee.
degre (int): Degre du polynome d'approximation.
pedagogique (bool, optional): Affiche les details si True.
Returns:
poly1d: Le polynome d'approximation.
"""
coeffs = np.polyfit(x, y, degre)
poly = np.poly1d(coeffs)
if est_pedagogique(pedagogique):
print(f"[Pedagogique] Moindres Carres (degre {degre}) Coeffs: {coeffs}")
return poly
[docs]
def moindres_carres_origine(x, y, pedagogique=None):
"""
Ajustement lineaire passant par l'origine (y = mx).
Args:
x (array_like): Points d'abscisse.
y (array_like): Points d'ordonnee.
pedagogique (bool, optional): Affiche les etapes si True.
Returns:
callable: Fonction f(x) = mx.
"""
m = np.sum(x * y) / np.sum(x**2)
if est_pedagogique(pedagogique):
print(f"[Pedagogique] Moindres Carres par Origine (y = mx):")
print(f" Pente m = sum(x*y) / sum(x^2) = {m}")
return lambda t: m * t
[docs]
def nombre_condition(A):
"""
Calcule le nombre de conditionnement d'une matrice.
Args:
A (ndarray): La matrice a analyser.
Returns:
float: Le nombre de condition.
"""
return np.linalg.cond(A)
def est_mal_conditionne(A, seuil=1e10):
cond = nombre_condition(A)
return cond > seuil