.. _moindres-carres-generiques: :Author: Yann Ménéroux :Version: 0.1 :License: -- :Date: 24/04/2015 Moindres carrés génériques ############################## Introduction ************** Le package **leastsquaresgeneric** du module *geoxygene-contrib* regroupe les algorithmes génériques (linéaires et non linéaires) de l'estimateur des moindres carrés. Les calculs sont effectués à partir : * des expressions algébriques des contraintes * des noms des inconnues à estimer * des paramètres de calcul La généricité des algorithmes nécessite en contre-partie de considérer une équation linéaire comme un cas particulier d'équation non-linéaire. La résolution est alors effectuée suivant l'algorithme itératif de Gauss-Newton (généralisation de la méthode de Newton-Raphson aux systèmes d'équations). **Note importante** **:** la dérivation numérique est calculée par une approximation (au mieux limitée à l'ordre 4). En fonction du conditionnement de la matrice N et de l'amplitude des erreurs introduites par la dérivation numérique, la résolution des équations normales peut conduire à des résultats aberrants. De même, dans certains cas, un système d'équations valides (dont une solution au sens des moindres carrés peut être trouvée en théorie) peut conduire dès les premières itérations à l'obtention d'une matrice singulière. Pour l'instant, le calcul étant réalisé avec la décomposition LU de la bibliothèque `Jama `_, il pourrait être intéressant d'essayer de limiter la propagation des erreurs de dérivation numérique avec la décomposition QR de la bibliothèque `Common-maths `_ . Package *leastsquaresgeneric* ******************************** .. container:: centerside .. figure:: /documentation/resources/img/moindres-carres-generiques/8e80bb59.png :width: 500px Figure 1 - Diagramme des principales classes du package leastsquaresgeneric L'objet principal du package est le *Solver* : .. code-block:: java Solver solver = new Solver(); L'intérêt principal du package est de pouvoir exprimer directement les contraintes sous forme algébrique (langage proche de Matlab) en chaine de caractères. Par exemple, pour définir une contrainte linéaire en x et y : .. code-block:: java Constraint c1 = new Constraint("2*x + 3*y = 5"); *Attention :* les expressions algébriques ne doivent contenir que des valeurs numériques (constantes) ou des paramètres à estimer (variables inconnues du problème). Le code ci-dessous est utilisé pour insérer des identificateurs Java dans l'expression des contraintes. .. code-block:: java double coeff1 = 2.0; double coeff2 = 3.0; Constraint c1 = new Constraint(coeff1 + "*x + " + coeff2 + "*y = 2"); Dans un deuxième temps, il est possible d'affecter des poids d'influence (ou directement des variances ou des écarts-types) aux différentes contraintes : .. code-block:: java c1.setWeight(4.0); // Ou de manière équivalente c1.setVariance(0.25); c1.setStddev(0.5) Les contraintes sont alors ajoutées au *Solver* (ordre indépendant) : .. code-block:: java solver.addConstraint(constraint); Puis chaque variable utilisée dans les contraintes doit être déclarée dans le *solver* et être munie d'une valeur initiale (valeur approchée) : .. code-block:: java solver.addParameter("x", 1); solver.addParameter("y", 1); Les paramètres sont alors choisis (certains sont optionnels). On peut définir entre autres les critères d'arrêts de l'algorithme. Dans le code ci-dessous, on spécifie un nombre maximal d'itérations à 100, mais l'algorithme pourra terminer plus tôt si l'incrément sur toutes les variables entre deux itérations est inférieur à 0.01 (par défaut, ces deux paramètres sont fixés à 0, ce qui signifie qu'ils doivent impérativement être spécifiés). .. code-block:: java // Critère de convergence solver.setConvergenceCriteria(0.01) // Sécurité en cas de non convergence solver.setIterationsNumber(100); Il est également possible de définir les options de dérivation, i.e. le pas (0.1 par défaut) et l'ordre (2 par défaut) de dérivation : .. code-block:: java // Pour une dérivation plus fine solver.setDerivationStep(0.01); solver.setDerivationOrder(4); Enfin, un paramètre qui peut jouer un rôle important en cas de non convergence de l'algorithme : le facteur de réduction (qui réduit l'incrément entre deux itérations). .. code-block:: java // Pour une dérivation plus fine solver.setreducingFactor(0.1); Le calcul peut alors être lancé : .. code-block:: java solver.compute(); La fonction *displayResult()* permet un affichage standardisé des résultats obtenus. .. code-block:: java solver.displayResults(); Sinon, la fonction *getParameter()* permet de récupérer les variables estimées. A noter qu'un paramètre peut-être adressé par son nom ou par un index (ordre d'insertion dans le *Solver*). Ainsi, le code suivant permet d'afficher l'ensemble des paramètres estimés avec les noms associés, indépendamment du code qui précède : .. code-block:: java // Affichage personnalisé des résultats System.out.println(solver.getEffectiveIterationsNumber() + " itérations ont été effectuées"); System.out.println("Les paramètres estimés sont : ") for (int i=0; i T = new ArrayList(); ArrayList D = new ArrayList(); T.add(0.038); D.add(0.050); T.add(0.194); D.add(0.127); T.add(0.425); D.add(0.094); T.add(0.626); D.add(0.212); T.add(1.253); D.add(0.273); T.add(2.500); D.add(0.267); T.add(3.740); D.add(0.332); Puis le code permettant de trouver une estimation des paramètres de la fonction interpolante : .. code-block:: java Solver solver = new Solver(); // Ajout des contraintes for (int i=0; i X = new ArrayList(); ArrayList Y = new ArrayList(); for (int i=0; i