Министерство образования науки ГОУВПО ТвГТУ Кафедра “Программное обеспечение”. Лабораторная работа № 5 По курсу “Методы вычисления” Вариант 11 Выполнял студент Новожилов И.Ю. Проверил Виноградов С.Ю. Тверь 2012 Дополните лабораторную работу №4 реализацией следующих методов: 1. Метод простых итераций 2. Метод Стеффенсона 3. Метод Рыбакова Функция: ln(x) – (x-5)2 = 0 Листинг using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms; namespace NelUrav { public partial class Form1 : Form { public Form1() { InitializeComponent(); } /// <summary> /// Работа с dll /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { try { //Обьявление переменных double a, b, h, M = 0; a = double.Parse(atxt.Text); b = double.Parse(btxt.Text); h = double.Parse(htxt.Text); M = double.Parse(Mtxt.Text); if (h < 0) { MessageBox.Show("h должен быть больше 0", "error"); osher.Text = "0"; return; } //Вызов метода простых итераций if (Mpi.Checked == true) { osher.Text = PI.prost_iter(a, h).ToString(); } //Вызов метода Стеффенсона if (Mstef.Checked == true) { if (a + function.f(a) < 0 && a<0) { MessageBox.Show("Невозможно определить корень. Выберите другое начальное значение.", "error"); osher.Text = "0"; return; } osher.Text = Steffan.steff(a, h).ToString(); } //Вызов метода Рыбакого if (Mrib.Checked == true) { if (a > b) { MessageBox.Show("a должно быть меньше b", "error"); osher.Text = "0"; return; } osher.Text = ribakov.rib(a, b, h, M).ToString(); } } catch { MessageBox.Show("Неверный формат", "error"); } } private void Mpi_CheckedChanged(object sender, EventArgs e) { atxt.Text = null; btxt.Text = "0"; htxt.Text = null; otobr2.Visible = false; btxt.Visible = false; otobr.Text = "x ="; Mtxt.Visible = false; Mlable.Visible = false; } private void Mrib_CheckedChanged(object sender, EventArgs e) { atxt.Text = null; btxt.Text = null; htxt.Text = null; Mtxt.Text = null; otobr2.Visible = true; Mlable.Visible = true; atxt.Visible = true; btxt.Visible = true; htxt.Visible = true; Mtxt.Visible = true; } private void Mstef_CheckedChanged(object sender, EventArgs e) { atxt.Text = null; htxt.Text = null; btxt.Text = "0"; otobr2.Visible = false; btxt.Visible = false; otobr.Text = "x ="; Mtxt.Visible = false; Mlable.Visible = false; } private void button2_Click(object sender, EventArgs e) { try { System.Diagnostics.Process proc = new System.Diagnostics.Process(); string otchet2; //задание директории в которой располагается изначальная программа otchet2 = System.Windows.Forms.Application.StartupPath.ToString(); //задание параметров запускаемой программы proc.StartInfo.FileName = otchet2 + "\\lab6.docx"; proc.StartInfo.WorkingDirectory = otchet2 + "\\lab6.docx"; //запуск программы proc.Start(); } catch { MessageBox.Show("Не найден файл"); } } private void Form1_Load(object sender, EventArgs e) { } ///////////////////////////////////////////////////////////////////////////// DLL ///////////////////////////////////////////////////////////////////////////// /// <summary> /// Класс функции /// </summary> static class function { /// <summary> /// Статическое уравнение /// </summary> /// <param name="x"></param> /// <returns>подсчет значения функции</returns> public static double f(double x) { return Math.Log(x) - (x - 5) * (x - 5); } } /// <summary> /// Класс производной функции вида x = f(x) /// </summary> static class prividenie { public static double f(double x) { return Math.Sqrt(Math.Log(x) + 10 * x - 25); } } /// <summary> /// Класс Метода простых итераций /// </summary> static class PI { /// <summary> /// Метод простых итераций /// </summary> /// <param name="a">Начальное значение</param> /// <param name="h">Точность</param> /// <returns>Корень</returns> public static double prost_iter(double a, double h) { double x, c = 0; if (a < 0) { MessageBox.Show("Производная должна быть больше 1", "error"); x = 0; } else { if ((Math.Log(a) + 10 * a - 25) < 0) { MessageBox.Show("Производная должна быть больше 1", "error"); x = 0; } else { c = ((prividenie.f(a) - prividenie.f(a + h)) / h) * (-1); if (c > 1) { MessageBox.Show("Производная должна быть больше 1", "error"); x = 0; } else { x = prividenie.f(a); while (x - a > h) { a = x; x = prividenie.f(a); } } } } return x; } } /// <summary> /// Класс Метода Стеффенсона /// </summary> static class Steffan { /// <summary> /// Метод Стеффенсона /// </summary> /// <param name="a">Начальное значение</param> /// <param name="h">Точность</param> /// <returns>Корень</returns> public static double steff(double a, double h) { double x = a - (function.f(a) * (function.f(a)/(function.f(a+function.f(a))function.f(a)))); while (x - a > h) { a = x; if (function.f(a - function.f(a)) < 0) { MessageBox.Show("Невозможно определить корень. Выберите другое начальное значение.", "error"); x = 0; } else { x = a - (function.f(a) * (function.f(a) / (function.f(a + function.f(a)) function.f(a)))); } } return x; } } /// <summary> /// Класс Метода Рыбакого /// </summary> static class ribakov { /// <summary> /// Метод Рыбакова /// </summary> /// <param name="a">Начальное значение отрезка</param> /// <param name="b">Конечное значение отрезка</param> /// <param name="h">Шаг</param> /// <param name="M">Константа</param> /// <returns>Корень</returns> public static double rib(double a,double b, double h, double M) { double x = 0; double c = ((function.f(a) - function.f(a + h)) / h) * (-1); if (M >= c) { x = a; x = x + (Math.Abs(function.f(x))/M); while (Math.Abs(function.f(x)) > h) { a = x; x = x + (Math.Abs(function.f(x)) / M); if (x >= b) { break; } } } else { MessageBox.Show("M меньше чем значение производной", "error"); x = 0; } return x; } } } } Таблица методов Название Метода Шаг Значение На интервале [1,6] Погрешность Шаг Метод Дихотомии 0,01 3,838867 -0,001133 0,0001 3,840072 0,000072 3,84 Метод Ньютона 0,01 3,840036 0,000036 0,0001 3,840046 0,000046 3,84 Метод Секущих 0,01 3,840283 0,000283 0,0001 3,840051 0,000051 3,84 Метод Простых итераций Метод Стеффенсона 0,01 6,344259 -0,015741 0,0001 6,354259 -0,005741 6,36 0,0001 6,360148 0,000148 6,36 Метод Рыбакова 0,01 6,357340 -0,002660 0,0001 6,360134 0,000134 6,36 6,360166 0,000166 Значение На интервале [2,7] Погрешность Истинный корень уравнения 0,01 Вывод: Метод Рыбакова самый точный. P. S. В сравнении участвовали: Метод простых итераций, Метод Стеффенсона, Метод Рыбакова.