예제 #1
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);
        }