using System; using System.Diagnostics; public class functional_cspline{ public static int bsearch(double[] x, double z){ int i=0, j=x.Length-1;/* locate the interval for z by bisection */ while(j-i>1){ int mid=(i+j)/2; if(z>x[mid]) i=mid; else j=mid;} return i; } public static Func make_cspline(double[] xs,double[] ys){ int n=xs.Length; Trace.Assert(ys.Length>=n); double[] x=new double[n],y=new double[n]; for(int i=0;i0);} for(int i=0;i=0;i--) b[i]=(B[i]-Q[i]*b[i+1])/D[i]; for(int i=0;i {/* evaluation of the spline at point z */ if(zx[n-1]) return double.NaN; int i=bsearch(x,z); double dx=z-x[i];/* calculate the inerpolating spline : */ return y[i]+dx*(b[i]+dx*(c[i]+dx*d[i])); }; }//build }//cspline