public static PolynomialData LsPolynomial(Vector <double> data, Vector <double> index, int order)
        {
            if (data == null)
            {
                throw new ArgumentNullException("data");
            }
            if (index == null)
            {
                throw new ArgumentNullException("index");
            }

            if (order != 3 && order != 5)
            {
                throw new NotImplementedException("Uniquement le 3e et le 5e ordre sont implantés");
            }

            var dataOut = new PolynomialData(order);

            Matrix <double> V = MatrixOperation.VandermondeMatrix(index, order);

            Vector <double> p = V.QR(QRMethod.Full).Solve(data);
            Vector <double> r = data - (V * p);

            dataOut.PolynomialParams = Vector <double> .Build.DenseOfArray(p.ToArray());

            dataOut.VandermondeMatrix = V;
            dataOut.FreedomDegrees    = data.Count - (order + 1);
            dataOut.ResidualNorm      = r.L2Norm();
            dataOut.PolynomialOrder   = order;

            return(dataOut);
        }
        public static Vector <double> GetCartesianPoint(PolynomialData polyDataLatitude, PolynomialData polyDataLongitude, PolynomialData polyDataAltitude, int nbStep)
        {
            if (polyDataLatitude == null)
            {
                throw new ArgumentNullException("polyDataLatitude");
            }
            if (polyDataLongitude == null)
            {
                throw new ArgumentNullException("polyDataLongitude");
            }
            if (polyDataAltitude == null)
            {
                throw new ArgumentNullException("polyDataAltitude");
            }

            return(Vector <double> .Build.Dense(new[] {
                GetPolynomialValue(nbStep, polyDataLatitude.PolynomialParams, polyDataLatitude.PolynomialOrder),
                GetPolynomialValue(nbStep, polyDataLongitude.PolynomialParams, polyDataLongitude.PolynomialOrder),
                GetPolynomialValue(nbStep, polyDataAltitude.PolynomialParams, polyDataAltitude.PolynomialOrder)
            }));
        }