Beispiel #1
0
        public override Result Run(Params p)
        {
            if (p.Alfa.Size != 2)
            {
                throw new Exception(Name + " ошибка: интервал локализации минимума не состоит из двух точек");
            }
            // устанавливаем функцию
            f = p.Y;
            Params cP = (Params)p.Clone();

            if (NormalizationDirections && cP.P.Norma > 1.0)
            {
                cP.P = cP.P.Rationing();
            }
            Result result = cP.ToResult();
            Vector x = result.ListX[0], P = result.ListP[0];

            int    n   = 0; // номер числа фибоначчи
            double Fn  = FibonacciNumbers.getPrevNumberFibonacci(System.Math.Abs(result.Alfas[0] - result.Alfas[1]) / Lim.Eps, ref n),
                   Fnm = FibonacciNumbers.getNNumberFibonacci(n - 1);
            int chet   = n % 2 == 1 ? -1 : 1;

            double lambda = result.Alfas[0] + Fnm * System.Math.Abs(result.Alfas[0] - result.Alfas[1]) / Fn + chet * Lim.Eps / Fn, mu,
                   f1, f2;

            while (result.K <= Lim.K)
            {
                mu = result.Alfas[0] + result.Alfas[1] - lambda;
                f1 = f.Parse(X(x, lambda, P));
                f2 = f.Parse(X(x, mu, P));
                if (lambda < mu && f1 < f2)
                {
                    result.Alfas[1] = mu;
                }
                else if (lambda < mu && f1 > f2)
                {
                    result.Alfas[0] = lambda;
                    lambda          = mu;
                }
                else if (lambda > mu && f1 < f2)
                {
                    result.Alfas[0] = mu;
                }
                else if (lambda > mu && f1 > f2)
                {
                    result.Alfas[1] = lambda;
                    lambda          = mu;
                }
                if (result.K == n)
                {
                    break;
                }
                result.K++;
            }

            result.AlfaMin = (result.Alfas[1] + result.Alfas[0]) / 2.0;
            result.XMin    = X(x, result.AlfaMin, P);

            return(result);
        }