Exemplo n.º 1
0
        private List <string> getResults(IDerivativeFunction function, double eps, double x1, double x2, double alpha, double betta, double lambda)
        {
            List <string> results = new List <string>();
            double        x1_prev, x2_prev;
            double        dx1, dx2;
            double        prevFunc, resFunc;
            int           k = 1;

            do
            {
                dx1 = function.getDerivativeX1().getY(x1, x2); //первая производная по х1
                dx2 = function.getDerivativeX2().getY(x1, x2); //первая производная по x2

                x1_prev = x1;
                x2_prev = x2;

                x1 -= alpha * dx1; //новое х1
                x2 -= alpha * dx2; //новое х2

                prevFunc = function.getY(x1_prev, x2_prev);
                resFunc  = function.getY(x1, x2);

                results.Add(String.Format("k={0} x1={1} x2={2} f(x1,x2)={3}", k++, Math.Round(x1, 3), Math.Round(x2, 3), Math.Round(resFunc, 3)));

                if (resFunc > prevFunc - 0.5 * lambda * Math.Sqrt(Math.Pow(dx1, 2) + Math.Pow(dx2, 2)))
                {
                    alpha = lambda * betta;
                }
            } while ((Math.Abs(resFunc - prevFunc) > eps));

            return(results);
        }
Exemplo n.º 2
0
        public List <string> getResults(IDerivativeFunction function, double x1, double x2, double e, double lam)
        {
            List <string> results = new List <string>();

            int i = 0;
            // TO-DO remove code duplication
            Matrix grad = calculateGrad(function, x1, x2);

            x1 -= x1 - e * grad.get(0, 0);
            x2 -= x2 - e * grad.get(0, 1);
            results.Add(String.Format("k={0} x1={1} x2={2} f(x1,x2)={3}", i++, Math.Round(x1, 3), Math.Round(x2, 3), Math.Round(function.getY(x1, x2), 3)));
            Matrix prevGrad;

            do
            {
                prevGrad = grad;
                grad     = calculateGrad(function, x1, x2);
                x1      -= lam * grad.get(0, 0);
                x2      -= lam * grad.get(0, 1);
                results.Add(String.Format("k={0} x1={1} x2={2} f(x1,x2)={3}", i++, Math.Round(x1, 3), Math.Round(x2, 3), Math.Round(function.getY(x1, x2), 3)));
            } while (Math.Abs((prevGrad - grad).get(0, 0)) > e && Math.Abs((prevGrad - grad).get(0, 1)) > e);

            return(results);
        }
Exemplo n.º 3
0
 private Matrix calculateGrad(IDerivativeFunction function, double x1, double x2)
 {
     return(new Matrix(new double[1, 2] {
         { function.getDerivativeX1().getY(x1, x2), function.getDerivativeX2().getY(x1, x2) }
     }));
 }