/// <summary>
        /// Formate un élément XML pour refléter un objet PerfSerie
        /// </summary>
        /// <param name="pp">Objet PerfSerie</param>
        /// <returns>Un élément XML</returns>
        private XElement xmlPerfSerie(PerfSerie pf)
        {
            XElement xElem = new XElement("Serie", new XAttribute("Key", pf.dataBaseKey),
                                          new XAttribute("Factor", pf.factorValue));
            XElement xColElem = new XElement("Points");

            // Ajout de chaque point de la série
            for (int count = 0; count < pf.count; count++)
            {
                xColElem.Add(xmlPerfPoint(pf.pointAt(count)));
            }
            xElem.Add(xColElem);
            return(xElem);
        }
示例#2
0
        /*
         * SERVICES
         */

        /// <summary>
        /// Interpolation polynomiale pour une abscisse de référence, sur la base d'une série de points de
        /// performance sélectionnés, dans une série Perfserie
        /// </summary>
        /// <param name="x">Abscisse de référence</param>
        /// <returns>
        /// Renvoie la valeur prédite par interpolation
        /// </returns>
        public double interpolate(double x)
        {
            double interpolation = Double.NaN;

            int[] selectedPoints = selectedPointsTable();

            // Cas ou aucun point n'est sélectionné
            if (selectedPoints == null)
            {
                throw new ModelException(AeroCalc.E_VOID_SYSTEM, "", "", x);
            }
            // Cas ou un seul point est sélectionné dans la série
            if (selectedPoints.Length == 1)
            {
                return(perfSerie.pointAt(selectedPoints[0]).output);
            }
            else
            {
                // Cas général, plus d'un point sélectionné
                //
                double[] ptX = new double[selectedPoints.Length];
                double[] ptY = new double[selectedPoints.Length];

                for (int count = 0; count < selectedPoints.Length; count++)
                {
                    ptX[count] = perfSerie.pointAt(selectedPoints[count]).factorValue;
                    ptY[count] = perfSerie.pointAt(selectedPoints[count]).output;
                }

                // Calcul des polynomes
                double[] p = new double[selectedPoints.Length];
                double   numerateur;
                double   denominateur;

                for (int count = 0; count < p.Length; count++)
                {
                    numerateur   = 1;
                    denominateur = 1;
                    // Calcul du numerateur
                    for (int counter = 0; counter < p.Length; counter++)
                    {
                        if (count == counter)
                        {
                            // Pas de produit à calculer
                        }
                        else
                        {
                            numerateur *= x - ptX[counter];
                        }
                    }
                    // Calcul du dénominateur
                    for (int counter = 0; counter < p.Length; counter++)
                    {
                        if (count == counter)
                        {
                            // Pas de produit à calculer
                        }
                        else
                        {
                            denominateur *= ptX[count] - ptX[counter];
                        }
                    }
                    p[count] = numerateur / denominateur;
                }
                // Somme des polynômes
                interpolation = 0;
                for (int count = 0; count < p.Length; count++)
                {
                    interpolation += ptY[count] * p[count];
                }
            }
            return(interpolation);
        }