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); }