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