private IntermediatePointResult IntermediatePoint(
            MultidimensionalFunctionFDF fdf,
            Vector <double> x,
            Vector <double> p,
            double lambda,
            double pg,
            double stepa,
            double stepc,
            double fa,
            double fc,
            Vector <double> x1,
            Vector <double> dx,
            double step,
            double f)
        {
            double stepb = 0, fb;

Trial:
            {
                double u = Math.Abs(pg * lambda * stepc);
                stepb = 0.5 * stepc * u / ((fc - fa) + u);
            }

            TakeStep(x, p, stepb, lambda, x1, dx);
            if (x.Equals(x1))
            {
                return(new IntermediatePointResult
                {
                    Step = 0,
                    F = fa,
                    Gradient = fdf.DF(x1)
                });
            }

            fb = fdf.F(x1);
            if (fb >= fa && stepb > 0)
            {
                fc    = fb;
                stepc = stepb;
                goto Trial;
            }

            var gradient = fdf.DF(x1);

            return(null);
        }