예제 #1
0
    public static int Main()
    {
        // int n=5;
        int m    = 4;
        var rand = new Random(1);
        // Assignment B
        matrix B = new matrix(m, m);

        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < m; j++)
            {
                B[i, j] = 10 * (rand.NextDouble());
            }
        }
        WriteLine("Assignment B: ");
        B.print($"Square matrix A with size  {m}x{m}, to do assigment B:");
        var qr_B  = new qrdecompositionGS(B);
        var B_inv = qr_B.inverse();

        B_inv.print("The invers matrix of A, B=:");
        var bbinv = B * B_inv;

        bbinv.print("A*B=I");

        return(0);
    }
예제 #2
0
    public void lsfit(Func <double, double>[] fs, vector x, vector y, vector dy)
    {
        int    n = x.size, m = fs.Length;
        matrix A = new matrix(n, m);
        vector b = new vector(n);

        for (int i = 0; i < n; i++)
        {
            b[i] = y[i] / dy[i];
            for (int k = 0; k < m; k++)
            {
                A[i, k] = fs[k](x[i]) / dy[i];
            }
        }
        var qr_A = new qrdecompositionGS(A);
        var c    = qr_A.backsubstitution(qr_A.R, qr_A.Q.transpose() * b);

        setC(c);
        var R_inv = qr_A.inverse(qr_A.R);
        // var R_inv = qr_A.backsubstitution(qr_A.R*(qr_A.Q.transpose()*qr_A.Q));
        var S = R_inv * R_inv.transpose();

        setS(S);
        f = fs;
    }
예제 #3
0
    public static vector newton
    (
        Func <vector, vector> f, //takes the input vector x and retrun f(x)
        vector xstart,           //Starting point
        double eps = 1e-3,       //The accuracy goal, ||f(x)||< epsilon
        double dx  = 1e-6        //finite difference
    )
    {
        vector x  = xstart.copy();
        int    n  = xstart.size;
        vector fx = f(x);
        vector y;
        vector fy;

        do
        {
            matrix J = new matrix(n, n);
            for (int j = 0; j < n; j++)
            {
                x[j] += dx;
                vector df = f(x) - fx;
                for (int i = 0; i < n; i++)
                {
                    J[i, j] = df[i] / dx;
                }
                x[j] -= dx;
            }
            var    JQR = new qrdecompositionGS(J);
            matrix B   = JQR.inverse();
            vector Dx  = -B * fx;
            double s   = 1;
            do
            {
                y  = x + Dx * s;
                fy = f(y);
                if (fy.norm() < (1 - s / 2) * fx.norm())
                {
                    break;
                }
                if (s < 1.0 / 32)
                {
                    break;
                }
                s /= 2;
            } while (true);
            x  = y;
            fx = fy;
            if (fx.norm() < eps)
            {
                break;
            }
        } while (true);
        return(x);
    }
예제 #4
0
    // Assignment B
    public matrix inverse()
    {
        int    n = Q.size1, m = Q.size2;
        matrix A_inv = new matrix(n, m);
        vector e     = new vector(n);
        var    qr_B  = new qrdecompositionGS(Q * R);

        for (int i = 0; i < n; i++)
        {
            e[i]     = 1;
            A_inv[i] = qr_B.solve(e);
            e[i]     = 0;
        }
        return(A_inv);
    }
예제 #5
0
파일: main.cs 프로젝트: eliaszap/ppnm
    public static int Main()
    {
        int    n    = 5;
        int    m    = 4;
        matrix A    = new matrix(n, m);
        var    rand = new Random(1);

        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                A[i, j] = 10 * (rand.NextDouble());
            }
        }


        // A.1
        WriteLine("Assignment A.1:");
        A.print($"Matrix A {n}x{m}:");
        var qr_A = new qrdecompositionGS(A);
        var Q    = qr_A.Q;
        var R    = qr_A.R;

        R.print($"The upper triangular matrix R:");
        var qq = Q.transpose() * Q;

        qq.print($"Q^T Q =1: ");
        var qr = Q * R;

        qr.print($"Q*R=A: ");
        if (A.approx(Q * R))
        {
            Write("Q*R=A, test passed\n");
        }
        else
        {
            Write("Q*R!=A, test failed\n");
        }
        WriteLine("");
        // A.2
        WriteLine("Assignment A.2:");
        matrix A2 = new matrix(n, n);

        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                A2[i, j] = 10 * (rand.NextDouble());
            }
        }
        A2.print($"Matrix A {n}x{n}:");
        var    qr_A2 = new qrdecompositionGS(A2);
        vector b     = new vector(n);

        for (int i = 0; i < n; i++)
        {
            b[i] = 10 * (rand.NextDouble());
        }
        b.print($"Vector b with size {n}: ");
        var qrxb = qr_A2.solve(qr_A2.Q, b);

        qrxb.print($"solve x for QRx=b:\nx = ");
        var ax = A2 * qrxb;

        ax.print("Ax = ");
        WriteLine("which is equal to b.\n");
        return(0);
    }