Exemplo n.º 1
0
 static void findLambda()
 {
     if (Auxiliary.isMonotonous(df, a, b))
     {
         double alpha = Math.Min(df(a), df(b));
         double gamma = Math.Max(df(a), df(b));
         lambda = 2 / (alpha + gamma);
         q      = (gamma - alpha) / (gamma + alpha);
     }
 }
        public static double getRoot(MyFunction func)
        {
            double a   = func.getA();
            double b   = func.getB();
            double eps = func.getEps();

            Func <double, double> f   = func.getF();
            Func <double, double> df  = Derivative.get(f);
            Func <double, double> d2f = Derivative.get(df);

            int i = 1;

            if (!Auxiliary.isMonotonous(f, a, b))
            {
                throw new System.InvalidOperationException("Функція не строго монотонна на цьому проміжку. Виберіть інший проміжок.");
            }
            else if (!Auxiliary.isRootOnRange(a, b, f))
            {
                throw new System.InvalidOperationException("Функція не має коренів на цьому проміжку. Виберіть інший проміжок.");
            }

            Console.WriteLine("Початковий проміжок [ " + a + " ; " + b + " ].");

            bool a_by_hord = false;

            if (f(a) * d2f(a) < 0)
            {
                a_by_hord = true;
            }

            do
            {
                if (a_by_hord)
                {
                    Console.WriteLine("a хордами");

                    a = a - f(a) * (b - a) / (f(b) - f(a));
                    b = b - f(b) / df(b);
                }
                else
                {
                    a = a - f(a) / df(a);
                    b = a - f(a) * (b - a) / (f(b) - f(a));
                }

                Console.WriteLine("№" + i + "   Наближене значення: (a)  " + a);
                Console.WriteLine("№" + i + "   Наближене значення: (b)  " + b);
                i++;
            }while (!Auxiliary.simplifiedStopCriteria(a, b, f, eps));

            return((a + b) / 2);
        }
Exemplo n.º 3
0
        public static double getRoot(MyFunction func)
        {
            double a   = func.getA();
            double b   = func.getB();
            double eps = func.getEps();

            Func <double, double> f  = func.getF();
            Func <double, double> df = Derivative.get(f);

            double c = 0;

            int i = 1;

            Console.WriteLine("Початковий проміжок [ " + a + " ; " + b + " ].");

            if (!Auxiliary.isMonotonous(f, a, b))
            {
                throw new System.InvalidOperationException("Функція не строго монотонна на цьому проміжку. Виберіть інший проміжок.");
            }
            else if (!Auxiliary.isRootOnRange(a, b, f))
            {
                throw new System.InvalidOperationException("Функція не має коренів на цьому проміжку. Виберіть інший проміжок.");
            }

            do
            {
                c = a - (f(a) * (b - a)) / (f(b) - f(a));

                if (Math.Abs(f(c)) < eps)
                {
                    return(c);
                }
                else if (f(c) * f(a) < 0)
                {
                    b = c;
                }
                else if (f(c) * f(b) < 0)
                {
                    a = c;
                }

                Console.WriteLine("№" + i + "   Наближене значення: " + c);
                i++;
            }while (!Auxiliary.simplifiedStopCriteria(a, b, f, eps));

            return((a + b) / 2);
        }