lab6x - Кафедра ПО

advertisement
Министерство образования науки
ГОУВПО ТвГТУ
Кафедра “Программное обеспечение”.
Лабораторная работа № 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. В сравнении участвовали: Метод простых итераций, Метод
Стеффенсона, Метод Рыбакова.
Download