Автор работы: Пользователь скрыл имя, 30 Ноября 2013 в 23:10, курсовая работа
Цель данной курсовой работы:
- проанализировать и обработать теоретические и практические данные по методу Пауэлла;
- провести сравнительный анализ с другими методами;
- разработка программы, реализующая данный метод.
Постановка задачи
Изучить частный случай метода сопряженных направлений – метод Пауэлла.
Изучить алгоритмы реализации поиска минимума функции f(x) .
Реализовать пользовательский интерфейс.
ВВЕДЕНИЕ…………………………………………………………………….…….4
ПОСТАНОВКА ЗАДАЧИ………………………………………….…………….…5
1 Метод Пауэлла и сопряженные направления 6
1.1 Обоснование применения сопряженных направлений в алгоритмах оптимизации. 6
1.2 Метод Пауэлла. 9
1.3 Стратегия поиска 11
1.4 Блок схема алгоритма метода сопряженных направлений 12
1.5 Пример поиска минимума функции методом Пауэлла 15
2 Описание программной части. Выбор среды программирования 16
3 Руководство пользователя 17
4 Описание программы 20
ВЫВОДЫ……………………………………….…………………………………..23
СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ……………
Положим d0 = dn , i = 0, у0 = х0, k= 0.
Шаг 2. Найти yi+1 = y i +ti di где шаг ti находится в результате поиска ми-нимума функции f(yi+tidi) по ti одним из методов одномерной минимизации.
Шаг 3. Проверить выполнение условий:
а) если i < n -1, положить i= i +1 и перейти к шагу 2;
б) если I = n -1, проверить успешность поиска по n первым направлениям.
Если у n = у°, то поиск завершить: х* =yn, иначе положить i=i+1 и перейти к шагу 2;
в) если i = n, проверить успешность поиска по n последним направлениям. Если y n+1 = у 1, поиск завершить: х* = у n+1, иначе перейти к шагу 4 для построения сопряженного направления.
Шаг 4. Положить хk+1 = уn+1 и проверить условие окончания:
а) если |||хk+1 - хk || | < ε, то поиск завершить: х* = хk+1;
б) иначе положить: d0 = dn = уn+1 - у1 (новое направление);
(исключается старое
Если при этом rang (,...,)= n, то новая система направлений линейно независима. В этом случае положить: di =di , i = 0,1,...,n; k =k +1, i = 0, у0 = xk+i и перейти к шагу 2.
Если rang(,...,)< n, то новая система направлений линейно зависима. Тогда следует продолжать поиск в старых направлениях. Для этого положить: di =di , i = 0,1,...,n; у0 = xk+1, k = k + 1, i = 0 и перейти к шагу 2.
Рассмотрим алгоритм метода сопряженных направлений, представленный в виде блок схемы. Алгоритм начинается с ввода данных , где x0 - это координата начальной точки, ε – число для окончания алгоритма (ε > 0), d1 и d2 -начальные направления поиска (). Выход их алгоритма возможен в трех случаях:
При минимум функции будет найден в т. .
При минимум функции будет найден в т. .
При |||| < минимум функции будет найден в т. .
Рисунок 1.3 – Продолжение блок схемы алгоритма метода Пауэлла
Найти минимум функции методом сопряженных направлений Пауэлла.
10 ) x0 = (8; 9)T, , ε = 0,1, y0 = x0 = (8;9)T
i=0, k=0;
20) y1 = y0 +t0 d0 = (8;9)T + t0 (0;1)T = (8, 9 + t0);
f (8, 9 + t0) = 83 + (9 + t0)2 – 24 – 2(9 + t0) + 2 = t02 + 16t0 + 553;
t0 = -8; y1 = (8;1)T;
30) Т.к. i < n-1 положим i=1 и перейдем к шагу 2;
21) y2 = y1 + t1 d1 = (8;1)T + t1 (1;0)T = (8 + t1;1)T;
f (8 + t1;1) = t13 + 24t12 + 189t1;
t1 = -7; y2 = (1;1);
31) i = n-1; y2 ≠ y0, i =2;
22 ) y3 = y2 + t2 d2 = (1; 1)T + t2 (0;1)T = (1; 1+t2);
t2 = 0; y3 = (1;1)T;
32) i = n = 2;
y3 ≠ y1;
40) x1 = y3 = (1;1)T;
Т.к. || (1;1)T – (8;9)T || = 10,63 > ε положим = d2 = y3 – y1 = (-7;0)T,
= d2 = (0;1)T;
;
Новая система
направлений линейно
d0 = = (-7;0)T;
d1 = = (0;1)T;
d2 = = (-7;0)T;
i = 0, k = 1, y0 = x1 = (1;1)T;
23) y1 = y0 +t0 d0 = (1;1)T + t0 (-7;0)T = (1 - 7t0 ;1);
to = 0; y1 = (1;1);
33) i < n-1 положим i=1 и перейдем к шагу 2;
24) y2 = y1 + t1 d1 = (1;1)T + t1 (0;1)T = (1;1 + t1)T;
t1 = 0; y2 = (1;1);
34) i = n-1; y2 = y0;
x* = y2 = (1;1)T.
Для создания
программного продукта использовалась
интегрированная среда
C# — объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлс-берга в компании Microsoft.
C# относится
к семье языков с C-подобным
синтаксисом, из них его син-
Переняв многое от своих предшественников — языков C++, Java, Delphi, Модула и Smalltalk — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# не поддержи-вает множественное наследование классов (в отличие от C++).
Название «Си шарп» (До диез) происходит от музыкальной нотации, где знак диез, прибавляемый к основному обозначению ноты, означает повышение соответствующего этой ноте звука на полутон.[4] Это аналогично названию языка C++, где «++» обозначает, что переменная должна быть увеличена на 1.
Вследствие технических ограничений на отображение (стандартные шрифты, браузеры и т. д.) и того обстоятельства, что знак диез ♯ не представ-лен на стандартной клавиатуре, знак номера # был выбран для представления знака диез при записи имени языка программирования.[5] Это соглашение отражено в Спецификации Языка C# ECMA-334.[6] Тем не менее, на практике (например, при размещении рекламы и коробочном дизайне[7]), Майкрософт использует предназначенный музыкальный знак.
Названия языков программирования не принято переводить, поэтому зачастую язык называют по-английски «Си шарп».
C# является мощным объектным языком с возможностями наследования и универсализации.
C# является наследником языков С/С++, сохраняя лучшие черты этих популярных языков программирования. Общий с этими языками синтаксис, знакомые операторы языка облегчают переход программистов от C++ к С#.
Для решения
задачи методом сопряженных
После запуска программного продукта приложение примет вид как показано на рисунке 3.1.
Рисунок 3.1 – Главное окно программы
Для решения задачи необходимо заполнить все текстовые поля, как показано на рисунке 3.2.
Рисунок 3.2 – Ввод данных
При нажатии на кнопку «Расчитать» будет выведено решение метода Пауэла (рис. 3.3,3.4).
Рисунок 3.3 – Вывод результата
Рисунок 3.4 – Вывод результата
Для сохранения решения задачи нужно нажать на кнопку «Сохранить в файл», после чего откроется диалоговое окно (рис.3.5) для выбора места хранения файла и его (файла) названия. Решение примера будет сохранено в текстовый файл с разрешением *.txt.
Рисунок 3.5 – Диалоговое окно сохранения файла.
Рассмотрим основные фрагменты программного продукта, реализующий «метод Пауэлла».
Нахождение экстремума функции f (yi + ti di ) по ti осуществляется функцией Extremum одним из методов одномерной минимизации: «Фибоначи».
private double extremum(double[]u) // u[] это d[]
{
double a = -2 * y[0];
double b = 2 * y[0];
double eps = (b-a)/50;
double l = (b-a)/10;
int g = 0; //счетчик
double s; //y
double w; //z
step_3: s = (a + b - eps) / 2;
w = (a + b + eps) / 2;
if (Function_for_search_extremum(
{
b = w;
}
else
{
a = s;
}
if (Math.Abs(b - a) <= l)
return (a + b) / 2;
else
{
g++;
goto step_3;
}
}
Функция Function_for_search_extremum необходима для нахождения значения функции при поиске экстремума.
private double
Function_for_search_extremum(
{
double Fx = Math.Pow((y[0] + t * u[0]), 3) + Math.Pow((y[1] + t * u[1]), 2) - 3 * (y[0] + t * u[0]) - 2 * (y[1] + t * u[1]) + 2;
return Fx;
}
Для вычисления ранга матрицы используется метод Rang_matrici.
private int Rang_matrici(double [,]Matrica)
{
if(Matrica[1,0] != 0)
for (int i = 1; i < 2; i++)
{
double mnojitel = (Matrica[0, 0] / Matrica[i, 0]) * (-1);
for (int j = 0; j < 2; j++)
{
Matrica[i, j] = Matrica[i,j] * mnojitel + Matrica[i-1, j];
}
}
int k;
int y = 0;
for (int i = 0; i < 2; i++)
{
k = 0;
for (int j = 0; j < 2; j++)
{
if (Matrica[i, j] == 0)
k++;
}
if (k == 2)
y++;
}
int rang = 2 - y;
return rang;
}
Запись полученного решения, хранящееся в объекте RichTextBox1, записывается в текстовый файл спомощью функции MenuFileSaveAs().
private void MenuFileSaveAs()
{
saveFileDialog1.Filter = "Text files|*.txt";
if (saveFileDialog1.ShowDialog()
== DialogResult.OK && saveFileDialog1.FileName.
{
richTextBox1.SaveFile(
}
}
А так же контролируются вводимые данные в элементы управления Text-Box. Пользователь может вводить только цифры и запятую. Проверка осуществляется при нажатии любой клавиши.
private void textX0_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar != 8 && (e.KeyChar < 48 || e.KeyChar > 57 ))
e.Handled = true;
if (e.KeyChar == 44)
e.Handled = false;
}
Выводы
В данной курсовой работе был рассмотрен метод сопряженного направления, описан его алгоритм и приведены несколько примеров решений по алгоритму, как ручного вычисления, так и с помощью ЭВМ.
Рассматривая и сравнивая выше приведенные примеры решений и их результаты, можно сказать, что минимум квадратичной функции был найден с минимальной погрешностью.
Данный метод ориентирован на исследование квадратичных функций. Основная его идея заключается в том, что бы, приведя квадратичную функцию n переменных к виду суммы полных квадратов, был найден ее оптимум в результате n одномерных поисков по преобразованным координатным направлениям.
В программном продукте были реализованы следующие функции:
- решение заданной функции методом Пауэлла;
- вывод результата и ход решения в текстовый объект;
- вывод ошибок,
при условии, что вводимые
- запись решения функции в текстовый файл.
Список использованной литературы
1.Акулич, И.Л. Математическое программирование в примерах и задачах [Текст] / И.Л.Акулич – Москва 1986.
2.Банди, Б.А. Методы оптимизации вводный курс [Текст] / Б.А.Банди – Москва 1988.
3.Белецкая, С.Ю. Решение задач математического программирования [Текст] / С.Ю.Белецкая – Воронеж 2001.
4.Карманов, В.Г. Математическое программирование Текст] / В.Г.Карманов – Москва 1975.
5. Пантелеев, А.В. Методы оптимизации в примерах и задачах Текст] / А.В.Пантелеев – Москва 2005. – С. 544.
Приложение А
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization;
using System.Runtime.Serialization.
using System.Runtime.Serialization.
namespace Sopr_Napr
{
public partial class Form1 : Form
{
double[,] Matrica = new double[2, 2];
double[] x = new double[2];
double E;
double[] d1 = new double[2];
double[] d2 = new double[2];
double[] d0 = new double[2];
int i;
int k;
int n = 2;
int j;
double[] y = new double[2];
double[] y1 = new double[2];
double[] y0 = new double[2];
double[] x_st = new double[2];
double[] d1_n = new double[2];
double[] d2_n = new double[2];
double[] d0_n = new double[2];
public Form1()
{
InitializeComponent();
}
private int Rang_matrici(double[,] Matrica)
{
if (Matrica[1, 0] != 0)
for (int i = 1; i < 2; i++)
{
double mnojitel = (Matrica[0, 0] / Matrica[i, 0]) * (-1);
for (int j = 0; j < 2; j++)
{
Matrica[i, j] = Matrica[i, j] * mnojitel + Matrica[i - 1, j];
}
}
int k;
int y = 0;
for (int i = 0; i < 2; i++)
{
k = 0;
for (int j = 0; j < 2; j++)
{
if (Matrica[i, j] == 0)
k++;
}
if (k == 2)
y++;
}
int rang = 2 - y;
return rang;
}
private double Function_for_search_extremum(d
{
double Fx = Math.Pow((y[0] + t * u[0]), 3) + Math.Pow((y[1] + t * u[1]), 2) - 3 * (y[0] + t * u[0]) - 2 * (y[1] + t * u[1]) + 2;
return Fx;
}