Лабораторная работа №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. Количество точек либо задайте в программе, либо позвольте задавать его пользователю.
Сдавать в виде архива, заархивируйте всю папку с проектом.