using System; using System.Diagnostics; public class cspline{ double[] x,y,b,c,d; public static int binsearch(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 cspline(double[] xs,double[] ys){ int n=xs.Length; Trace.Assert(ys.Length>=n); x=new double[n]; y=new double[n]; b=new double[n]; c=new double[n-1]; d=new double[n-1]; 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=x[0] && z<=x[x.Length-1]); int i=binsearch(x,z); double dx=z-x[i];/* calculate the inerpolating spline : */ return y[i]+dx*(b[i]+dx*(c[i]+dx*d[i])); } public double deriv(double z){/* derivative of the spline at point z */ Trace.Assert(z>=x[0] && z<=x[x.Length-1]); int i=binsearch(x,z); double dx=z-x[i]; return b[i]+dx*(2*c[i]+dx*3*d[i]); } public double integ(double z){/* derivative of the spline at point z */ Trace.Assert(z>=x[0] && z<=x[x.Length-1]); int iz=binsearch(x,z); double sum=0,dx; for(int i=0;i