Exemplo n.º 1
0
    public static vector newton(Func <vector, vector> f, vector x, double epsilon = 1e-3, double dx = 1e-7)
    {
        vector res = x.copy();
        var    n   = res.size;
        var    J   = new matrix(n, n);

        while (true)
        {
            var fx = f(res);
            for (int j = 0; j < n; j++)
            {
                res[j] += dx;
                var df = f(res) - fx;
                for (int i = 0; i < n; i++)
                {
                    J[i, j] = df[i] / dx;
                }
                res[j] -= dx;
            }
            var J_qr = LinEq.QrGsDecomp(J);
            var Dx   = LinEq.QrGsSolve(J_qr, -fx);
            // Dx.print();
            double s = 2;
            vector y, fy;
            double comp_norm;
            while (true)
            {
                s        /= 2;
                y         = res + Dx * s;
                fy        = f(y);
                comp_norm = fy.norm();
                if (comp_norm < (1 - s / 2) * comp_norm | s < 0.02)
                {
                    break;
                }
            }
            res       = y;
            fx        = fy;
            comp_norm = Dx.norm();
            if (comp_norm < dx | comp_norm < epsilon)
            {
                break;
            }
        }
        return(res);
    }
Exemplo n.º 2
0
    public void fit(Func <double, double>[] fs, vector x, vector y, vector dy)
    {
        var n = x.size;
        var m = fs.Length;
        var A = new matrix(n, m);
        var b = new vector(n);

        for (int i = 0; i < n; i++)
        {
            b[i] = y[i] / dy[i];
            for (int j = 0; j < m; j++)
            {
                A[i, j] = fs[j](x[i]) / dy[i];
            }
        }
        var qrData = LinEq.QrGsDecomp(A);

        c = LinEq.QrGsSolve(qrData, b);
        var inverse_R = LinEq.inverse(LinEq.QrGsDecomp(qrData.R));

        S = inverse_R * inverse_R.T;
    }
Exemplo n.º 3
0
    public static void Main()
    {
        // matrix A = new matrix(6, 4);
        // for(int i = 0; i < A.size1; i++)
        // {
        //     for(int j = 0; j < A.size2; j++)
        //     {
        //         A[i, j] = fixRand.NextDouble();
        //     }
        // }
        // A.print();
        // var data = LinEq.QrGsDecomp(A);
        // data.Q.print();
        // data.R.print();
        // var qtq = data.Q.transpose()*data.Q;
        // qtq.print();
        // var Ares = data.Q*data.R;
        // Ares.print();


        Console.WriteLine("Testing A)");
        Random fixRand = new Random(0);
        matrix A       = new matrix(5, 5);
        vector B       = new vector(5);

        for (int i = 0; i < A.size1; i++)
        {
            for (int j = 0; j < A.size2; j++)
            {
                A[j][i] = fixRand.NextDouble();
            }
        }
        for (int i = 0; i < B.size; i++)
        {
            B[i] = fixRand.NextDouble();
        }
        Console.WriteLine("The random Square matrix A");
        A.print();
        Console.WriteLine("The random Vector B for the Linear system Ax=B");
        B.print();
        var data = LinEq.QrGsDecomp(A);

        Console.WriteLine("The matrix Q");
        data.Q.print();
        Console.WriteLine("The matrix R");
        data.R.print();
        var res = LinEq.QrGsSolve(data, B);

        Console.WriteLine("Solution to the system QRx=b");
        res.print();
        var check = A * res;

        Console.WriteLine("Ax=b, should be equal to the random vector B");
        check.print();
        // Random fixRand = new Random(0);
        Console.WriteLine("Testing B)");
        matrix Aforinverse = new matrix(5, 5);

        for (int i = 0; i < Aforinverse.size1; i++)
        {
            for (int j = 0; j < Aforinverse.size2; j++)
            {
                Aforinverse[i, j] = fixRand.NextDouble();
            }
        }
        Console.WriteLine("Random square matrix A for inversion");
        Aforinverse.print();
        var dataB       = LinEq.QrGsDecomp(Aforinverse);
        var Bforinverse = LinEq.inverse(dataB);
        var Cforinverse = Aforinverse * Bforinverse;

        Console.WriteLine("AA^-1 = I");
        Cforinverse.print();
    }