示例#1
0
        public static double[] cubicSpline(double[] x, double[] y)
        {
            double[] curve  = new double[(int)x[x.Length - 1]];
            var      spline = CubicSpline.InterpolateNaturalInplace(x, y);

            for (int i = 0; i < curve.Length; i++)
            {
                curve[i] = spline.Interpolate(i);
            }

            return(curve);
        }
        /// <summary>
        /// Interpolates cubic piecewise between the given points
        /// this class is a wrapper to provide .NET XML Functions to the MathDotNet Library
        /// </summary>
        /// <param name="x">there are the supporting points</param>
        /// <param name="y">the value at each supporting point. Must have the same length as the x-values</param>
        public Spline(double[] x, double[] y)
        {
            //sort the values ascending
            bool isAscending = false;

            while (!isAscending)
            {
                for (int i = 1; i < x.Length; i++)
                {
                    if (x[i - 1] > x[i]) //compare whether each value is bigger than the previous
                    {
                        for (int j = 0; j < i; j++)
                        {
                            if (x[j] > x[i]) //if the value at j is bigger than the value at i the correct position was found
                            {
                                //displace the value;
                                List <double> listX = x.ToList();
                                listX.Remove(x[i]);
                                listX.Insert(j, x[i]);
                                x = listX.ToArray();
                                List <double> listY = y.ToList();
                                listY.Remove(y[i]);
                                listY.Insert(j, y[i]);
                                y = listY.ToArray();
                                break;
                            }
                        }
                        break;
                    }

                    if (x[i - 1].Equals(x[i])) //if a X-value exists twice
                    {
                        throw new ArgumentException("LinearInterpolation: it is forbidden, that a X-value appears twice");
                    }

                    if (i == x.Length - 1) //if the loop has run to its end
                    {
                        isAscending = true;
                    }
                }
            }
            this._x = x;
            this._y = y;
            spline  = CubicSpline.InterpolateNaturalInplace(x, y);
        }