コード例 #1
0
    public static void Main()
    {
        // First part of A
        int n   = 5; // Size of quadratic matrix M.
        var rnd = new Random(1);

        Console.WriteLine("Part A1");
        matrix M = new matrix(n, n);

        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                M[i, j] = 4 * rnd.NextDouble() - 1.5;
                M[j, i] = M[i, j];
            }
        }
        matrix M2 = M.copy();

        M.print("We choose an arbitrary matrix M = ");
        vector D      = new vector(n);
        matrix V      = new matrix(n, n);
        int    sweeps = Jacobi_diagonalization.cyclic_sweep(M, V, D);
        matrix temp2  = V.T * M2 * V;

        Console.WriteLine($"Total number of sweeps done is = {sweeps}");
        temp2.print("V.T*M*V = ");
        D.print("Eigenvalues = ");
    }
コード例 #2
0
    public static void Main()
    {
        //Second part of A


        StreamWriter eigenenergies = new StreamWriter("eigenenergiesA2.data", append: false);
        StreamWriter outData       = new StreamWriter("outA2.data", append: false);
        int          m             = 99;
        double       s             = 1.0 / (m + 1);
        matrix       H             = new matrix(m, m);

        for (int i = 0; i < m - 1; i++)
        {
            matrix.set(H, i, i, -2);
            matrix.set(H, i, i + 1, 1);
            matrix.set(H, i + 1, i, 1);
        }
        matrix.set(H, m - 1, m - 1, -2);
        matrix.scale(H, -1 / s / s);

        vector D2 = new vector(m);
        matrix V2 = new matrix(m, m);

        int sweeps2 = Jacobi_diagonalization.cyclic_sweep(H, V2, D2);

        for (int k = 0; k < m / 3; k++)
        {
            double exact      = PI * PI * (k + 1) * (k + 1);
            double calculated = D2[k];
            eigenenergies.WriteLine($"{k} {calculated} {exact}");
        }

        for (int k = 0; k < 4; k++)
        {
            outData.WriteLine($"{0} {0}");
            for (int i = 0; i < m; i++)
            {
                double factor = Sign(V2[0, k]);
                outData.WriteLine($"{(i+1.0)/(m+1.0)} {V2[i,k]*factor/Sqrt(s)}");
            }
            outData.WriteLine($"{1} {0}");
            outData.WriteLine("");
        }

        outData.Close();
        eigenenergies.Close();
    }