Лабораторная работа №12. Решение уравнения
                                Требуемые условия завершения
                                
    
        
                
    
                                
                                    
                                
                            
                    
                    
                    
                
                    Открыто с: четверг, 16 мая 2019, 11:55
                
                
                    Срок сдачи: четверг, 16 мая 2019, 15:30
                
        Цель работы - создать приложение Windows, которое решает уравнение и графически отображает процесс решения.
- 
Первый шаг - создание кода для решения уравнения. Создаём интерфейс IEquationSolver со свойствамиFunc<double, double> Equation { get; } // уравнение double Epsilon { get; } // погрешность решения double A { get; } // аппроксимации решения double B { get; } double C { get; } // кореньи открытым методомvoid SolveTheEquation(); Этот интерфейс реализуется классами, которые решают уравнение относительно одной вещественной переменной при помощи двухшаговых итерационных методов.
- 
Создаём абстрактный класс AbstractSolver, реализующий IEquationSolver. Добавляем свойствоpublic int Iterations { get; protected set; } // счётчик итерацийи конструктор (обратите внимание на модификатор доступа)protected AbstractSolver(Func<double, double> Добавляем абстрактный метод (он не имеет реализации)equation, double a, double b, double epsilon = 0.1e-6) public abstract void OneStep(); Делаем реализацию метода SolveTheEquation: в цикле, пока модель разности A и B превышает Epsilon, вызываем метод OneStep и увеличиваем cчётчик итераций на единицу.
- Создаём класс Dichotomia - наследник AbstractSolver, который имеет два закрытых вещественных поля
private double fa; // значение Equation(a) private double fb; // значение Equation(b)Создайте конструктор, обращающийся к конструктору базового класса и инициализирующий все поля. Он должен бросать исключение ArgumentException, если a>b или fa и fb имеют один знак.
 Перегрузите OneStep() так, чтобы метод SolveEquation выполнял метод половинного деления.
- 
Тестируем класс Dichotomia. Создайте Unit-тесты и в тест конструктора добавьте кодvar solver = new Dichotomia(Math.Sin, 1, 4, 0.1e-6); solver.SolveTheEquation(); Assert.IsTrue(Math.Abs(solver.C) - Math.PI< 0.1e-6);Придумайте несколько своих тестов.
- Создаём пользовательский интерфейс приложения
 Размещаем на форме элементы Label, TextBox и Button следующим образом: Задайте свойство (Name) первого сверху поля для ввода (TextBox) - leftBoundary, второго - rightBoundary, третьего - epsilon, третьего - solution, четвертого - iterations. Для двух последних полей установите свойство ReadOnly - True. Установите свойство Text окна для ввода epsilon в значение "0.1e-6" (возможно, придётся вместо точки использовать запятую). 
- 
Добавьте в класс Form1 закрытое полеprivate Func Equation = Math.Sin; Дважды щелкните по кнопке "Решить уравнение". Напишите код в методе private void button1_Click(object sender, EventArgs e) Создайте переменныеvar a = double.Parse(leftBoundary.Text); var b = double.Parse(rightBoundary.Text); var eps = double.Parse(epsilon.Text);Создаём объект класса Dichotomia и вызываем его метод SolveTheEquation()
 Отображаем результатыsolution.Text = solver.C.ToString(); iterations.Text = solver.Iterations.ToString();
- Добавьте на форму элемент Chart (назовите его plot) и создайте закрытый метод класса Form1
- Добавьте ещё один класс - InformativeDichotomia (наследник Dichotomia). Он имеет открытое свойство 
public Chart Plot { get; }и конструкторpublic InformativeDichotomia(Func<double, double> который обращается к методам базового класса и задает значения полей. Перегрузите метод OneStep таким образом, чтобы он добавлял на график точку с отметкой, которая включает номер итерации и новое значение корня. Измените метод button1_Click так, чтобы после нажатия кнопки на форме появился график с отметками итераций примерно следующего вида.equation, double a, double b, Chart plot, double epsilon = 0.1e-6)  
private void Plot(int points)Код метода начинаем с
plot.Series.Clear(); // очищаем диаграммуСоздаем и инициализируем переменные для границ отрезка
Добавляем новую кривую
var series = new Series {ChartType = SeriesChartType.Spline, Color = Color.Red, BorderWidth = 3};
plot.Series.Add(series);
Для того, чтобы построить график, вызываем в цикле AddXY
series.Points.AddXY(x, Equation(x));Добавляем вызов Plot в код метода button2_Click. Количество точек либо задайте в программе, либо позвольте задавать его пользователю.
Сдавать в виде архива, заархивируйте всю папку с проектом.