Метод поразрядного приближения - Кафедра ПО

advertisement
Министерство образования и науки РФ
Высшего профессионального учреждения
Тверской государственный технический университет
Кафедра : «Программное обеспечение»
Лабораторная работа № 8 по курсу «Методы вычислений»
Выполнил: Студент второго курса
Группа ПИН-1106
Кузнецов Д.А..
Проверил: Виноградов С.Ю.
Тверь 2012
Задание
1. Напишите программу, реализующую нахождение минимума функции методом равномерного поиска.
2. Напишите программу, реализующую нахождение минимума функции методом дихотомии.
3. Напишите программу, реализующую нахождение минимума функции методом золотого сечения.
Замечания по реализации:
4. В качестве исходной функции брать f(x) = x^3 + 8*x^2 + x + 5, интервала – [-2, 1].
5.
Теория.
Метод равномерного поиска.
Этот метод основан на том, что переменной присваиваются значения
шагом h =const (шагом поиска), где i=0,1,2,… и вычисляются значения
точкаx. Если
, то переменной
становится
ответом.
c
в соседних
дается новое приращение. Как только
, поиск останавливается и предпоследняя точка считается
Выбор
(начального значения переменной ) определяется пользователем. Шаг поиска
- фактическая погрешность определения результата. При поиске решения на отрезке,
обычно в качестве начального приближения берут один из его концов, а при изменении
переменной х предусматривается проверка на выход ее за границу отрезка.
Метод поразрядного приближения
является разновидностью метода равномерного поиска и реализуется следующим
образом:
Задаем начальное приближение
слева от минимума функции
и
вычисляем
, задаем начальный шаг поиска h (выбирается вычислителем),
точность  определения результата поиска (для переменной ), берем i=0.
Задаем
и вычисляем
Проверяем условие
увеличивая на 1.
.
, если оно выполняется, то идем к пункту 2,
Проверяем условие |h|  . Если оно выполняется, полагаем h = -h/10, увеличиваем на 1 и
идем к пункту 2, т.е. обеспечиваем поиск минимума в другом направлении с шагом h/10.
Выводим на печать полученное значение для переменной
Метод деления отрезка пополам (или метод дихотомии).
и функции
.
Поиск минимума
точек
Величина
на отрезке [a, b] на каждом шаге начинается с выбора двух
и
, где >0-постоянная, являющаяся параметром метода.
выбирается вычислителем и может определяться целесообразным
количеством верных десятичных знаков при задании аргумента . Точки и
расположены симметрично на [a, b] относительно его середины и при малых делят его
почти пополам. Уточняем положение экстремума с заданной точностью .
Метод реализуется следующим алгоритмом:
Проверяем условие |b-a|<. Если условие выполняется, идем к пункту 6.
Делим интервал поиска [a, b] точками
Для значений
и
вычисляем
Проверяем условие
1.
Полагаем
и
и
.
. Если оно выполняется, полагаем
и идем к пункту 1.
Выводим на печать
и
.
Реализация
using
using
using
using
.
System;
System.Collections.Generic;
System.Linq;
System.Text;
namespace Lab8
{
/// <summary>
/// Вычислительные функции
/// </summary>
class Tools
{
/// <summary>
/// Класс заданной функции
/// </summary>
и идем к пункту
public static class func
{
/// <summary>
/// Найти значение функции
/// </summary>
/// <param name="x">Значение аргумента</param>
/// <returns>Значение функции</returns>
public static double Get_y(double x)
{
return Math.Pow(x, 3) + Math.Pow(x, 2) * 8 + x + 5;
}
}
/// <summary>
/// Класс равномерного поиска
/// </summary>
public static class Ravn_poisk
{
/// <summary>
/// Получить минимум
/// </summary>
/// <param name="a">левая граница</param>
/// <param name="b">правая граница</param>
/// <param name="n">число шагов</param>
/// <returns>минимум функции</returns>
public static double Get_min(double a, double b, int n)
{
double x_min = a;
double x_next;
for (int i = 0; i < n; i++)
{
x_next = a + (b - a) * i / (n + 1);
if (func.Get_y( x_next) <func.Get_y(
x_min = x_next;
x_min))
}
return x_min;
}
}
/// <summary>
/// Метод дихотомии
/// </summary>
public static class Dihotomy
{
/// <summary>
/// Получить минимум функции
/// </summary>
/// <param name="a">левая граница</param>
/// <param name="b">правая граница</param>
/// <param name="n">число шагов</param>
/// <returns>минимум функции</returns>
public static double Get_min(double a, double b, double n)
{
double psi, x1=0,x2=0;
for (int i = 0; i <= n; i++)
{
psi = (b - a) / 4;
x1 = (a + b) / 2 - psi;
x2 = (a + b) / 2 + psi;
if (func.Get_y(x1) > func.Get_y(x2))
{
a = x1;
}
else
{
b = x2;
}
}
return (x1 + x2) / 2;
}
}
/// <summary>
/// Метод золотого сечения
/// </summary>
public static class gold_sech
{
/// <summary>
/// Получить минимум
/// </summary>
/// <param name="a">левая граница</param>
/// <param name="b">правая граница</param>
/// <param name="n">число шагов</param>
/// <returns>минимум функции</returns>
public static double Get_min(double a, double b, double n)
{
double psi, x1 = 0, x2 = 0;
psi = (1 + Math.Sqrt(5)) / 2;
for (int i = 0; i <= n; i++)
{
x1 = b - (b - a) / psi;
x2 = a + (b - a) / psi;
if (func.Get_y(x1) >= func.Get_y(x2))
a = x1;
else
b = x2;
}
double x = (a + b) / 2;
return x;
}
}
}
}
Download