Министерство образования науки
ГОУВПО ТвГТУ
Кафедра “Программное обеспечение”.
Лабораторная работа № 8
По курсу “Методы вычисления”
Вариант 11
Выполнял студент
Проверил
Тверь 2012
Напишите программу, реализующую нахождение минимума функции методом равномерного поиска. Напишите программу, реализующую нахождение минимума функции методом дихотомии. Напишите программу, реализующую нахождение минимума функции методом золотого сечения.Замечания по реализации:
В качестве исходной функции брать f(x) = x^3 + 8*x^2 + x + 5, интервала – [-2, 1].Листинг
using System;
using System. Collections. Generic;
using ponentModel;
using System. Data;
using System. Drawing;
using System. Linq;
using System. Text;
using System. Windows. Forms;
namespace NahodMin
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// Начало работы с DLL
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void resalt_Click(object sender, EventArgs e)
{
double a=0, b=0, h=0;
try
{
a = Convert. ToDouble(atxt. Text);
b = Convert. ToDouble(btxt. Text);
h = Convert. ToDouble(htxt. Text);
}
catch
{
MessageBox. Show("Неверный форматю.","error");
return;
}
if (h < 0)
{
MessageBox. Show("Точность должна быть положительной.", "error");
return;
}
if(b < a)
{
MessageBox. Show("Конец отрезка не может быть мньше начального отрезка.", "error");
return;
}
// Реализация метода Равномерного поиска
if(MRP. Checked == true)
{
ravnompoisk fp = new ravnompoisk();
otvettxt. Text = fp. ravnposk(a, b, h).ToString();
}
// Реализация метода Дихотомии
if (MD. Checked == true)
{
dihtomia fp = new dihtomia();
otvettxt. Text = fp. dihtom(a, b, h).ToString();
}
// Реализация метода Золотого сеяения
if(MSS. Checked == true)
{
solotosechenie fp = new solotosechenie();
otvettxt. Text = fp. solotosech(a, b, h).ToString();
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void otset_Click(object sender, EventArgs e)
{
try
{
System. Diagnostics. Process proc = new System. Diagnostics. Process();
string otchet1;
//задание директории в которой располагается изначальная программа
otchet1 = System. Windows. Forms. Application. StartupPath. ToString();
//задание параметров запускаемой программы
proc. StartInfo. FileName = otchet1 + "\\otchet. docx";
proc. StartInfo. WorkingDirectory = otchet1 + "\\otchet. docx";
//запуск программы
proc. Start();
}
catch
{
MessageBox. Show("Не найден файл");
}
}
}
/// <summary>
/// Функция
/// </summary>
static class function
{
public static double f(double x)
{
return (x * x * x) + 8 * (x * x) + x + 5;
}
}
/// <summary>
/// Метод Равномерного поиска
/// </summary>
class ravnompoisk
{
public double ravnposk(double a, double b, double h)
{
double y;
double min = function. f(a);
for (double i = a+h; i <= b; i += h)
{
y = function. f(i);
if (min > y)
{
min = y;
}
}
return min;
}
}
/// <summary>
/// Метод Дихотомии
/// </summary>
class dihtomia
{
public double dihtom(double a, double b, double h)
{
double X1 = 0, X2= 0;
while (b - a > 2 * h)
{
X1 = ((a + b) / 2) - 0.00001;
X2 = ((a + b) / 2) + 0.00001;
if (function. f(X1) > function. f(X2))
{
a = X1;
}
else
{
b = X2;
}
}
return function. f((X2 + X1) / 2);
}
}
/// <summary>
/// Метод золотого сечения
/// </summary>
class solotosechenie
{
public double solotosech(double a, double b, double h)
{
double X1 = 0, X2 = 0;
double f = (1 + Math. Pow(5,0.5))/2;
while (b - a > 2 * h)
{
X1 = b - ((b - a) / f);
X2 = a + ((b - a) / f);
if (function. f(X1) > function. f(X2))
{
a = X1;
}
else
{
b = X2;
}
}
return function. f((X2 + X1) / 2);
}
}
}
Таблица методов
Название метода | Шаг | Значение На интервале [-2,4] | Погрешность | Шаг | Значение На интервале [-2,6] | Погрешность | Истинный корень уравнения |
Метод равномерного поиска. | 0,01 | 4,968584 | -0,0314 | 0,0001 | 4,96859 | -0,00311 | 3,84 |
Метод дихотомии. | 0,01 | 4,96857 | -0,0315 | 0,0001 | 4,96850 | -0,0315 | 3,84 |
Метод золотого сечения. | 0,01 | 4,96874 | -0,0313 | 0,0001 | 4,968501 | -0,0315 | 3,84 |
Вывод: Метод Золотого сечения самый точный из 3 методов.


