示例#1
0
        bool compute_alpha()
        {
            double[] betan = new double[N];
            betan[0] = -1.52763883147;
            betan[1] = 1.048327004372e-1;
            betan[2] = 2.669121419134012e-2;

            BigFloat[] betanB = new BigFloat[N];
            betanB[0] = -1.52763883147;
            betanB[1] = 1.048327004372e-1;
            betanB[2] = 2.669121419134012e-2;

            // f vector
            BigFloat[] fnB = new BigFloat[N];

            // jacobian matrix
            var mx = Matrix.Create <BigFloat>(N, N);

            double stepSize = (1 - (1 / (float)N)) / N;

            double[] zi = Range(1 / N, 1, stepSize).ToArray();
            double[] zj = new double[N];
            Array.Copy(zi, 1, zj, 0, N);

            for (int l = 0; l < count; l++)
            {
                for (int n = 0; n < N; n++)
                {
                    fnB[n] = f(zj[n], betanB);

                    BigFloat[] gradB = diffedRangeB(zj[n], betanB);

                    for (int m = 0; m < N; m++)
                    {
                        mx[n, m] = gradB[m];
                    }
                }

                var snB = mx.GetCholeskyDecomposition();

                //var sn = JnB.Decompose(false);
                var snA     = snB.Solve(fnB);
                var betanp1 = betanB.Zip(snA, (d1, d2) => d1 - d2).ToArray();

                // Check for convergence
                BigFloat tolChk = snA.OneNorm();
                BigFloat tarVal = Math.Pow(10, -M);
                if (tolChk < tarVal)
                {
                    // compute alpha
                    myalpha = 1 / g(1, betanp1);

                    Console.WriteLine(l + ": " + tolChk);
                    Console.WriteLine("\n Converged! with alpha = " + myalpha);
                    return(false);
                }

                betanB = betanp1;
                Console.WriteLine(l + ": " + tolChk);// + "; " + (1 / gD((double)1, betanp1)));
            }

            return(true);
        }