Практикум по курсу "Объектно-ориентированное программирование" на языке C#. Андрианова А.А - 29 стр.

UptoLike

28
// функция не удовлетворяет тем свойствам,
// которые гарантируют существование корня
throw new Exception("Возможно, на этом
отрезке корней нет");
}
. . .
}
Для решения уравнения достаточно иметь только одну функцию,
которая реализует общую процедуру всех методов решения уравнений.
Реализация пункта 1 процедуры в этой функции осуществляется посредством
вызова через делегат method именно того метода деления отрезка, который
был выбран при инициализации класса Solver. В указанном далее коде
использование делегатов выделено.
// метод решения уравнения
// 1 параметр – делегат функции, которая определяет уравнение,
// 2, 3 параметры - концы отрезка,
// 4 параметр - точность решения
static public double RootEquation(Function f, double a,
double b, double eps)
{
// корень гарантировано существует,
// если на концах отрезка
// функция принимает значения различных знаков.
if(f(a) * f(b) > 0)
throw new Exception("Возможно, на этом отрезке корней нет");
// цикл метода - вычисления продолжается до тех пор,
// пока на одном из концов отрезка не будет получено
// значение функции с заданной точностью
while(Math.Abs(f(a))>eps && Math.Abs(f(b))>eps)
{
// поиск точки деления отрезка - вызов делегата
double c = method(f,a,b);
// если найденная точка - корень, это решение
if(f(c) == 0)
return c;
// выбор следующего отрезка
if(f(a)*f(c) < 0)
b = c;
else
a = c;
}
// выбор приближенного значения корня
if(Math.Abs(f(a))<=eps )
return a;
else
return b;
}
        // функция не удовлетворяет тем свойствам,
        // которые гарантируют существование корня
        throw new Exception("Возможно, на этом
                                           отрезке корней нет");
     }
     . . .
}

     Для решения уравнения достаточно иметь только одну функцию,
которая реализует общую процедуру всех методов решения уравнений.
Реализация пункта 1 процедуры в этой функции осуществляется посредством
вызова через делегат method именно того метода деления отрезка, который
был выбран при инициализации класса Solver. В указанном далее коде
использование делегатов выделено.

    // метод решения уравнения
    // 1 параметр – делегат функции, которая определяет уравнение,
    // 2, 3 параметры - концы отрезка,
    // 4 параметр - точность решения
    static public double RootEquation(Function f, double a,
                                            double b, double eps)
    {
       // корень гарантировано существует,
       // если на концах отрезка
       // функция принимает значения различных знаков.
       if(f(a) * f(b) > 0)
          throw new Exception("Возможно, на этом отрезке корней нет");
       // цикл метода - вычисления продолжается до тех пор,
       // пока на одном из концов отрезка не будет получено
       // значение функции с заданной точностью
       while(Math.Abs(f(a))>eps && Math.Abs(f(b))>eps)
       {
          // поиск точки деления отрезка - вызов делегата
          double c = method(f,a,b);
          // если найденная точка - корень, это решение
          if(f(c) == 0)
             return c;
          // выбор следующего отрезка
          if(f(a)*f(c) < 0)
             b = c;
          else
              a = c;
       }
       // выбор приближенного значения корня
       if(Math.Abs(f(a))<=eps )
          return a;
       else
          return b;
    }

                                                                     28