public static int Main() { // The interpolation routines will be tested on the function f(x) = sin(x) double xmin = 0; // Minimum x value double xmax = 3 * PI; // Maximum x value misc.generate_data(f1, xmin, xmax, 0.5, "./datafiles/data.txt"); // Generate tabulated function values misc.generate_data(f2, xmin, xmax, 0.5, "./datafiles/data2.txt"); // Generate tabulated integration values misc.generate_data(f3, xmin, xmax, 0.5, "./datafiles/data3.txt"); // Generate tabulated integration values // Load tabulated data values into double arrays List <double[]> data = misc.load_data("./datafiles/data.txt"); double[] x = data[0]; double[] y = data[1]; int n = x.Length; // Preparation of output files for plotting var lspline_out = new System.IO.StreamWriter("./datafiles/lspline_out.txt", append: false); var qspline_out = new System.IO.StreamWriter("./datafiles/qspline_out.txt", append: false); var cspline_out = new System.IO.StreamWriter("./datafiles/cspline_out.txt", append: false); var outfile = new System.IO.StreamWriter("./out.txt", append: false); double dz = 0.01; // Output files for linear interpolation var res1 = new lspline(x, y); for (double z = x[0]; z <= x[x.Length - 1]; z += dz) { lspline_out.WriteLine($"{z} {res1.spline(z)} {res1.integral(z)}"); } lspline_out.Close(); // Output files for quadratic interpolation var res2 = new qspline(x, y); for (double z = x[0]; z <= x[x.Length - 1]; z += dz) { qspline_out.WriteLine($"{z} {res2.spline(z)} {res2.integral(z)} {res2.derivative(z)}"); } qspline_out.Close(); // Output files for cubic interpolation var res3 = new cspline(x, y); for (double z = x[0]; z <= x[x.Length - 1]; z += dz) { cspline_out.WriteLine($"{z} {res3.spline(z)} {res3.integral(z)} {res3.derivative(z)}"); } cspline_out.Close(); // Output files for comparsion of interpolation routines in terms of the integration values outfile.WriteLine($"In the following, the interpolation routines are compared with their integration values."); outfile.WriteLine($"For comparison, f(x) = sin(x) is interpolated and integrated from 0 to 2*pi (analytical value: 0).\n"); outfile.WriteLine($"Linear interpolation:"); outfile.WriteLine($"Integration result: {res1.integral(2*PI)}"); outfile.WriteLine($"Error: {0-res1.integral(2*PI)}\n"); outfile.WriteLine($"Quadratic interpolation:"); outfile.WriteLine($"Integration result: {res2.integral(2*PI)}"); outfile.WriteLine($"Error: {0-res2.integral(2*PI)}\n"); outfile.WriteLine($"Cubic interpolation:"); outfile.WriteLine($"Integration result: {res3.integral(2*PI)}"); outfile.WriteLine($"Error: {0-res3.integral(2*PI)}\n"); outfile.Close(); return(0); }
static int Main(string[] args) { if (args.Length < 3) { Console.Error.WriteLine("too few arguments"); return(1); } string infile = args[0]; string outfile1 = args[1]; string outfile2 = args[2]; StreamReader instream = new StreamReader(infile); StreamWriter outstream1 = new StreamWriter(outfile1, append: false); StreamWriter outstream2 = new StreamWriter(outfile2, append: false); //Importing the data into vectors List <double> xlist = new List <double>(); List <double> ylist = new List <double>(); do { string line = instream.ReadLine(); if (line == null) { break; } string[] values = line.Split(' ', '\t'); xlist.Add(Double.Parse(values[0])); ylist.Add(Double.Parse(values[1])); } while (true); int n = xlist.Count; vector x = new vector(n); vector y = new vector(n); for (int i = 0; i <= (n - 1); i++) { x[i] = xlist[i]; y[i] = ylist[i]; } lspline s = new lspline(x, y); // The linear interpolation int N = 999; for (int i = 0; i <= N; i++) { double z = (x[n - 1] - x[0]) / N * i + x[0]; double yz = s.eval(z); outstream1.WriteLine($"{z} \t {yz}"); } // Intergrating by the linear interpolation for (int i = 0; i <= N; i++) { double z = (x[n - 1] - x[0]) / N * i + x[0]; double area_z = s.integral(z); outstream2.WriteLine($"{z} \t {area_z}"); } outstream1.Close(); outstream2.Close(); instream.Close(); return(0); }