public class qspline{ double[] x,y,b,c; int n => x.Length; public qspline(double[] x,double[] y){ this.x=(double[])x.Clone(); this.y=(double[])y.Clone(); b=new double[n-1]; c=new double[n-1]; var p=new double[n-1]; var h=new double[n-1]; for(int i=0;i=0;i--) c[i]=(p[i+1]-p[i]-c[i+1]*h[i+1])/h[i]; for(int i=0;ix[n-1]) throw new System.ArgumentException(); int i=0, j=n-1; while(j-i>1){ int m=(i+j)/2; if(z>x[m]) i=m; else j=m; } return i; } public double eval(double z){ //evaluates s(z) int i=binsearch(z); double h=z-x[i]; return y[i]+h*(b[i]+h*c[i]); } public double deriv(double z){//evaluates s'(z) int i=binsearch(z); double h=z-x[i]; return b[i]+2*h*c[i]; } public double integ(double z){//evaluates inegral of s(z) from x_0 to z int i=binsearch(z); double sum=0,h; for(int k=0;k