示例#1
0
    public static vector newton(Func <vector, vector> f, vector x, double eps = 1e-3, double dx = 1e-7)
    {
        int    n = x.size;
        vector fx = f(x), z, fz;

        while (true)
        {
            matrix J = jacobi(f, fx, x);
            matrix R = new matrix(n, n);
            QR.qr_gs_decomp(J, R);
            matrix B = QR.qr_gs_inverse(J, R);
            //B.print("inverse B");
            vector del_x  = -B * fx;
            double lambda = 1;
            while (true)
            {
                z  = x + lambda * del_x;
                fz = f(z);
                if (fz.norm() < (1 - lambda / 2) * fx.norm())
                {
                    break;
                }
                else if (lambda < 1.0 / 64)
                {
                    break;
                }
                else
                {
                    lambda /= 2;
                }
            }
            x  = z;
            fx = fz;
            if (fx.norm() < eps)
            {
                break;
            }
            else if (x.norm() < dx)
            {
                break;
            }
        }
        return(x);
    }
示例#2
0
    static int Main()
    {
        //public Func<double,double>[] f;
        int    n     = 8;
        int    m     = 2;
        matrix R     = new matrix(m, m);
        matrix Q     = new matrix(n, m);
        vector c     = new vector(m);
        vector y     = new vector(n);
        matrix A     = new matrix(n, m);
        matrix B     = new matrix(m, n);
        matrix sigma = new matrix(m, m);

        Func <double, double>[] f = { t => 1, t => t };
        vector b  = new vector(new double [] { 117, 100, 88, 72, 53, 29.5, 25.2, 15.2, 11.1 });
        var    dy = 0.05 * b;
        vector x  = new vector(new double [] { 1, 2, 3, 4, 6, 9, 10, 13, 15 });

        for (int i = 0; i < n; i++)
        {
            y[i]  = Log(b[i]);
            y[i]  = y[i] / 0.05;
            dy[i] = dy[i] / b[i];
        }
        for (int i = 0; i < n; i++)
        {
            for (int k = 0; k < m; k++)
            {
                A[i, k] = f[k](x[i]) / dy[i];
                Q[i, k] = A[i, k];
            }
        }

        //A.print($"matrix A: ");
        QR.qr_gs_decomp(Q, R);
        c     = QR.qr_qs_solve(Q, R, y);//coeff
        B     = QR.inverse(Q, R);
        sigma = B * B.T;
        vector delta = new vector(m);//delta are uncertainties of coeff

        for (int i = 0; i < m; i++)
        {
            delta[i] = Sqrt(sigma[i, i]);
        }

        for (double i = 0; i < 20; i = i + 0.1)
        {
            WriteLine($"{i} {Exp(c[0])*Exp(c[1]*i)}");
        }

        c.print($"solution x");
        Error.WriteLine($"N0={Exp(c[0])}");
        Error.WriteLine($"lambda={c[1]}");
        Error.WriteLine($"The half life time calculated via the fitting function is ln(2)/lambda= {Log(2)/-c[1]:f1} days");
        Error.WriteLine("The actual half life time is 3.6 days.");
        //(A*c).print("check Ax~b");

        //B
        double unc = Log(2) / (c[1] * c[1]) * delta[1];

        Error.WriteLine($"Uncertainty for estimated halflife: {unc:f1} days");
        Error.WriteLine($"The estimated value doesn't agree with the modern value");

        return(0);
    }