/// <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); }
/* * 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); }