public void Minimize(Func<IVector, double> f, Func<IVector, IVector> gradient, int n) { _b = Matrix.CreateI(n, n, () => new RealNumber(1), () => new RealNumber(0)); _x = new Vector(new[] {new RealNumber(0), new RealNumber(0)}); _f = f; IVector grad; do { _gradient = gradient(_x); var direction = CalculateMinimizeDirection(_b, _gradient); var step = CalculateStepAndChangeAlpha(direction, f); grad = gradient(_x); //nablaF(xk + 1) var y = grad.Sum(_gradient.Negate()); //yk //its time to calculate b(k + 1) _b = CalculateInvertedPseudoGaussian(_b, step, y); } while (grad.Norm.IsGreater(_errorThreshold)); }
private static IVector CalculateMinimizeDirection(IMatrix invertedPseudoGessian, IVector gradient) { return invertedPseudoGessian.Mul(gradient.Negate()); }