Esempio n. 1
0
    public static int Main()
    {
        // Loading raw data and converting to logarithmic values
        List <double[]> data = misc.load_data("../data.txt");

        double[] x = data[0]; double[] y = data[1];
        for (int i = 0; i < y.Length; i++)
        {
            y[i] = Log(y[i]);
        }                                           // Logarithmic value
        double[] dy = new double[y.Length];         // Allocate array for y errors
        for (int i = 0; i < dy.Length; i++)
        {
            dy[i] = (Exp(y[i]) / 20) / Exp(y[i]);
        }                                                                           // Logarithmic y errors
        Func <double, double>[] F = new Func <double, double>[] { s => 1, s => s }; // Array of fitting functions

        var    res = new lsq_qr(x, y, dy, F);                                       // Variable storing instance of least square class
        vector c   = res.get_c();                                                   // Retrieve expansion coefficients of fitting functions
        double a   = Exp(c[0]);
        double l   = c[1];

        var outfile = new System.IO.StreamWriter("../out_A.txt", append: false);

        outfile.WriteLine($"---------------------------------------");
        outfile.WriteLine($"ThX decay fit using least square method");
        outfile.WriteLine($"---------------------------------------");
        outfile.WriteLine("Fitting parameters:");
        outfile.WriteLine($"a:                {a}");
        outfile.WriteLine($"lambda:           {l}");
        outfile.WriteLine($"Fitting t_1/2:    {-Log(2)/l} days");
        outfile.WriteLine($"Modern t_1/2:     3.66 days");
        outfile.Close();

        var expout = new System.IO.StreamWriter("expout.txt", append: false);
        var logout = new System.IO.StreamWriter("logout.txt", append: false);

        for (double i = 0; i < 20; i += 0.25)
        {
            expout.WriteLine($"{i} {exp(a,l)(i)}");
        }
        expout.Close();
        for (int i = 0; i < x.Length; i++)
        {
            logout.WriteLine($"{x[i]} {y[i]} {c[0] + c[1]*x[i]}");
        }
        logout.Close();
        return(0);
    }
Esempio n. 2
0
    public static int Main()
    {
        // 1) Amount of operations scaling
        matrix    A;
        int       nmax       = 100;
        Stopwatch time       = new Stopwatch();
        var       diag_scale = new System.IO.StreamWriter("./plot_files/diag_scale.txt", append: false);

        for (int n = 20; n < nmax; n += 1)
        {
            A = misc.gen_matrix(n);
            time.Reset();
            time.Start();
            var res = new jacobi_diagonalization(A);
            time.Stop();
            diag_scale.WriteLine($"{Log(n)} {Log(time.ElapsedMilliseconds)}");
        }
        diag_scale.Close();

        // Linear fit to logarithmic data to verify n^3 dependence
        List <double[]> data = misc.load_data("./plot_files/diag_scale.txt");

        double[] x = data[0]; double[] y = data[1];
        double[] dy = new double[y.Length];         // Allocate array for y errors
        for (int i = 0; i < dy.Length; i++)
        {
            dy[i] = 1e-3;
        }                                                                           // Logarithmic y errors
        Func <double, double>[] F = new Func <double, double>[] { s => 1, s => s }; // Array of fitting functions
        var    fit      = new lsq_qr(x, y, dy, F);                                  // Variable storing instance of least square class
        vector c        = fit.get_c();                                              // Retrieve expansion coefficients of fitting functions
        double a        = c[0];
        double b        = c[1];
        var    fit_data = new System.IO.StreamWriter("./plot_files/fit_data.txt", append: false);

        for (double n = x[0]; n < x[x.Length - 1]; n += 0.1)
        {
            fit_data.WriteLine($"{n} {a + b*n}");
        }
        fit_data.Close();

        // 2) Demonstration of value-by-value method
        int dim = 10; int eigenvalues = 5;

        A = misc.gen_matrix(dim);
        matrix Ac      = A.copy();
        matrix Acc     = A.copy();
        var    A_res   = new jacobi_diagonalization(A, "cyclic");
        var    Ac_res  = new jacobi_diagonalization(Ac, "value", "min", eigenvalues);
        var    Acc_res = new jacobi_diagonalization(Acc, "value", "max", eigenvalues);
        var    outfile = new System.IO.StreamWriter("../out_B.txt", append: false);

        outfile.WriteLine($"---------------------------------");
        outfile.WriteLine($"Scaling of matrix diagonalization");
        outfile.WriteLine($"---------------------------------");
        outfile.WriteLine($"To demonstrate the O(n^3) scaling of the matrix diagonalization procedure, a linear fit is applied to the logaritmic (n,t) data.");
        outfile.WriteLine($"Fit result:");
        outfile.WriteLine($"log(t) = {a} + {b}*log(n)");
        outfile.WriteLine($"Thus, the scaling must be O(n^3) since the slope is approximately equal to 3.\n");
        outfile.WriteLine($"-----------------------------------------------");
        outfile.WriteLine($"Jacobi diagonalization eigenvalue-by-eigenvalue");
        outfile.WriteLine($"-----------------------------------------------");
        outfile.WriteLine($"Test of eigenvalue-by-eigenvalue routine:");
        outfile.WriteLine($"A random symmetric matrix A of dimension {dim}x{dim} is generated. Rotation angle should be changed into 0.5*arctan2(-2*Apq, App-Aqq) to achieve largest eigenvalue.\n");
        outfile.WriteLine($"{eigenvalues} lowest eigenvalues of A:");
        vector lowest_eigenvalues = Ac_res.get_eigenvalues();

        for (int ir = 0; ir < lowest_eigenvalues.size; ir++)
        {
            outfile.Write("{0,10:g3} ", lowest_eigenvalues[ir]);
        }
        outfile.WriteLine("\n");
        outfile.WriteLine($"{eigenvalues} highest eigenvalues of A:");
        vector highest_eigenvalues = Acc_res.get_eigenvalues();

        for (int ir = 0; ir < highest_eigenvalues.size; ir++)
        {
            outfile.Write("{0,10:g3} ", highest_eigenvalues[ir]);
        }
        outfile.WriteLine("\n");
        outfile.WriteLine($"Eigenvalues of A for comparison:");
        vector all_eigenvalues = A_res.get_eigenvalues();

        for (int ir = 0; ir < all_eigenvalues.size; ir++)
        {
            outfile.Write("{0,10:g3} ", all_eigenvalues[ir]);
        }
        outfile.WriteLine("\n");

        outfile.WriteLine($"Comparison of the two diagonalization routines in terms of number of rotations:");
        dim     = 50;
        A       = misc.gen_matrix(dim);
        Ac      = A.copy();
        Acc     = A.copy();
        A_res   = new jacobi_diagonalization(A, "cyclic");
        Ac_res  = new jacobi_diagonalization(Ac, "value", "min", 1);
        Acc_res = new jacobi_diagonalization(Acc, "value", "min", dim);
        outfile.WriteLine($"Another random symmetric matrix A of dimension {dim}x{dim} is generated.\n");
        outfile.WriteLine($"Cyclic method:");
        outfile.WriteLine($"Lowest eigenvalue:                            {A_res.get_eigenvalues()[0]}");
        outfile.WriteLine($"Amount of rotations (full diagonalization):   {A_res.get_rotations()}\n");
        outfile.WriteLine($"Eigenvalue-by-eigenvalue method:");
        outfile.WriteLine($"Lowest eigenvalue:                            {Ac_res.get_eigenvalues()[0]}");
        outfile.WriteLine($"Amount of rotations (lowest eigenvalue):      {Ac_res.get_rotations()}");
        outfile.WriteLine($"Amount of rotations (full diagonalization):   {Acc_res.get_rotations()}\n");
        outfile.WriteLine($"Thus, the eigenvalue-by-eigenvalue method is suitable for calculuating only the lowest eigenvalues of a matrix whereas the cyclic sweep method is faster for full diagonalization.\n");
        outfile.Close();
        return(0);
    }
Esempio n. 3
0
    public static int Main()
    {
        // Loading raw data and converting to logarithmic values
        List <double[]> data = misc.load_data("../data.txt");

        double[] x = data[0]; double[] y = data[1];
        for (int i = 0; i < y.Length; i++)
        {
            y[i] = Log(y[i]);
        }                                           // Logarithmic value
        double[] dy = new double[y.Length];         // Allocate array for y errors
        for (int i = 0; i < dy.Length; i++)
        {
            dy[i] = (Exp(y[i]) / 20) / Exp(y[i]);
        }                                                                           // Logarithmic y errors
        Func <double, double>[] F = new Func <double, double>[] { s => 1, s => s }; // Array of fitting functions

        var    res = new lsq_qr(x, y, dy, F);                                       // Variable storing instance of least square class
        vector c   = res.get_c();                                                   // Retrieve expansion coefficients of fitting functions
        double a   = Exp(c[0]);
        double l   = c[1];

        double[] dc  = res.get_dc();
        double   dl  = Log(2) / (l * l) * dc[1]; // Uncertainty in t 1/2 obtained using error of propagation
        matrix   cov = res.get_cov();

        var outfile = new System.IO.StreamWriter("../out_B.txt", append: false);

        outfile.WriteLine($"---------------------------------------");
        outfile.WriteLine($"ThX decay fit using least square method");
        outfile.WriteLine($"---------------------------------------");
        outfile.WriteLine("Fitting parameters:");
        outfile.WriteLine($"a:                {a}");
        outfile.WriteLine($"lambda:           {l}");
        outfile.WriteLine($"Fitting t_1/2:    {-Log(2)/l}({dl}) days");
        outfile.WriteLine($"Modern t_1/2:     3.66 days");
        outfile.WriteLine("The modern value of t_1/2 seems to be within the uncertainty of the fitting t_1/2\n");
        outfile.WriteLine($"Covariance matrix:");
        for (int ir = 0; ir < cov.size1; ir++)
        {
            for (int ic = 0; ic < cov.size2; ic++)
            {
                outfile.Write("{0,10:g3} ", cov[ir, ic]);
            }
            outfile.WriteLine("");
        }
        outfile.WriteLine("");
        outfile.Close();

        var expout = new System.IO.StreamWriter("expout.txt", append: false);
        var logout = new System.IO.StreamWriter("logout.txt", append: false);

        for (double i = 0; i < 20; i += 0.25)
        {
            expout.WriteLine($"{i} {exp(a,l)(i)}");
        }
        expout.Close();
        for (int i = 0; i < x.Length; i++)
        {
            logout.WriteLine($"{x[i]} {y[i]} {c[0] + c[1]*x[i]}");
        }
        logout.Close();
        return(0);
    }