МИНОБРНАУКИ РФ Федеральное Государственное бюджетное учреждение высшего профессионального образования. Кафедра: Программная инженерия Лабораторная работа №6 Вариант №2 Выполнил студент 2 курса ГРУППЫ ПИН-1206 Корнилов Владимир Проверил: Грязнов Евгений Николаевич Тверь 2013 Задание. Дополните лабораторную работу №4 реализацией следующих методов: 1. Метод простых итераций 2. Метод Стеффенсона 3. Метод Рыбакова Отчет оформляется подобно отчету по л/р №4. Теория: Метод простой итерации — один из простейших численных методов решения уравнений. Метод основан на принципе сжимающего отображения, который применительно к численным методам в общем виде также может называться методом простой итерации или методом последовательных приближений [1]. В частности, для систем линейных алгебраических уравнений существует аналогичный метод итерации. Идея метода простой итерации состоит в том, чтобы уравнение эквивалентному уравнению привести к , так, чтобы отображение было сжимающим. Если это удаётся, то последовательность итераций сходится. Такое преобразование можно делать разными способам. В частности, сохраняет корни уравнение вида если на исследуемом отрезке. Оптимальным выбором является , что приводит к методу Ньютона, который является быстрым, но требует вычисления производной. Если в качестве выбрать константу того же знака, что и производная в окрестности корня, то мы получаем простейший метод итерации. Метод Стеффенсена В методе Ньютона необходимо на каждой итерации вычислять матрицу вторых производных. Поэтому, когда вычисление матрицы вторых производных требует больших объемов вычислений, трудоемкость каждой итерации значительно возрастает. Таким образом, требуется метод, который может обойти эту проблему. Одним из таких методов является метод Стеффенсена, который является разностным аналогом метода Ньютона. Матрица вторых производных заменяется разностным отношением первых производных градиента по специальным узловым точкам. Применим этот метод к решению следующей системы уравнений: задачи минимизации , получим следующий итерационный метод решения ( 1) . Если приближение так: уже известно, то следующее приближение определяется ( 2) где \beta_k - числовой параметр, производных, определяемая по правилу: - матрица разделенных разностей первых : , , : где - элемент i-й строки j-го столбца матрицы ,а , как и выше, обозначает первые и, соответственно, вторые производные по переменным функции J(u) (i,j=1,...,n). J(u) дважды непрерывно дифференцируема. Код программы: Основная часть: public partial class Form1 : Form { public Form1() { InitializeComponent(); label4.Visible = false; label5.Visible = false; label6.Visible = false; } private void button1_Click(object sender, EventArgs e) { try { Methods c=new Methods(); double a = Convert.ToDouble(textBox1.Text); double b = Convert.ToDouble(textBox2.Text); double h = Convert.ToDouble(textBox3.Text); if (a >= b) { MessageBox.Show("a должно быть меньше b"); return; } label4.Text = Convert.ToString(c.Iter(a, b, h)); label5.Text = Convert.ToString(c.Steffen(a, b, h)); label6.Text = Convert.ToString(c.Ribakov(a, b, h)); label4.Visible = true; label5.Visible = true; label6.Visible = true; } catch (Exception exc) { MessageBox.Show(exc.Message); } } private void label8_Click(object sender, EventArgs e) { } private void label7_Click(object sender, EventArgs e) { } } Класс, отвечающий за решение интеграла разными методами: class Methods { public double max = new double(); public double Der(double h, double a, double b) //нахождение максимальной производной { max = 0; for (double i = a; i < b; i += h) { if (1 + Math.Cos(i) > max) max = 1 + Math.Cos(i); } return max; } public static double Function(double x) //записанная функция { return x - Math.Sin(x) - 0.25; } // Метод Итераций public double Iter(double a, double b, double h) //FUN - исходная функция aначатьльное приближение b-конечное приближение h-погрешность { double x; do { x = a - (Function(a) * (b - a)) / (Function(b) - Function(a)); if (Function(a) * Function(x) < 0) b = x; else a = x; } while ((Math.Abs(Function(x))) >= h); return x; } // Метод Стеффенсона public double Steffen(double a, double b, double h) { double x_1 = (a + b) / 2; double x_2 = x_1 - (Function(x_1) * (Function(x_1) / (Function(x_1 + Function(x_1)) - Function(x_1)))); while (Math.Abs(x_2 - x_1) > h) { x_1 = x_2; x_2 = x_1 - (Function(x_1) * (Function(x_1) / (Function(x_1 + Function(x_1)) - Function(x_1)))); } return x_2; } // Метод Рыбакова //а-начальное значение отрезка //b-конечное значение отрезка //h-шаг public double Ribakov(double a, double b, double h) { double x = 0; double M; Methods cl = new Methods(); M = cl.Der(h, a, b); double c = ((Function(a) - Function(a + h)) / h) * (-1); if (M >= c) { x = a; x = x + (Math.Abs(Function(x)) / M); M = cl.Der(h, a, x); while (Math.Abs(Function(x)) > h) { a = x; x = x + (Math.Abs(Function(x)) / M); if (x >= b) { break; } } } else { x = 0; } return x; } } Пользовательский интерфейс: