Метод сопряженных направлений
Сущность сопряженных направлений, знакомство с основными алгоритмами. Особенности поиска минимума функции методом Пауэлла. Разработка приложений с графическим интерфейсом. Исследование квадратичных функций, решение задач методом сопряженных направлений.
Рубрика | Математика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 14.07.2012 |
Размер файла | 2,8 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
"Метод сопряженных направлений"
Введение
сопряженный направление пауэлл квадратичный
Оптимизация как раздел математики существует достаточно давно. Оптимизация - это выбор, т.е. то, чем постоянно приходиться заниматься в повседневной жизни. Термином «оптимизация» в литературе обозначает процесс или последовательность операций, позволяющих получить уточненное решение. Хотя конечной целью оптимизации является отыскание наилучшего или «оптимального» решения, обычно приходится довольствоваться улучшением известных решений, а не доведением их до совершенства. Поэтому под оптимизацией понимают скорее стремление к совершенству, которое, возможно, и не будет достигнуто.
Необходимость принятия наилучших решений так же стара, как само человечество. Испокон веку люди, приступая к осуществлению своих мероприятий, раздумывали над их возможными последствиями и принимали решения, выбирая тем или другим образом зависящие от них параметры - способы организации мероприятий. Но до поры, до времени решения могли приниматься без специального математического анализа, просто на основе опыта и здравого смысла.
Цель данной курсовой работы:
- проанализировать и обработать теоретические и экспериментальные данные по теме метод сопряженных направлений;
- анализ собранной информации;
- сравнительный анализ с другими методами;
- разработка программы, реализующая данный метод.
Метод сопряженных направлений. Постановка задачи
Требуется найти безусловный минимум функции f(x) многих переменных, т.е. найти точку
Определение. Пусть H - симметрическая матрица размера n x n. Векторы называются H-сопряженными или просто сопряженными, если при всех .
Стратегия поиска
В методе сопряженных направлений (методе Пауэлла [Powell M.J.D.] ) используется факт, что минимум квадратичной функции может быть найден не более чем за n шагов при условии, что поиск ведется вдоль сопряженных относительно матрицы Гессе направлений. Так как достаточно большой класс целевых функций может быть предоставлен в окрестности точки минимума своей квадратичной аппроксимацией, описанная идея применяется и для неквадратичных функций. Задается начальная точка и направления , совпадающие с координатами. Находится минимум f(x) при последовательном движении по (n + 1) направления с помощью одного из методов одномерной минимизации. При этом полученная ранее точка минимума берется в качестве исходной для поиска по совершенно нового направлению, а направление используется как при первом , так и последнем поиске. Находится новое направление поиска, сопряженное с . Оно проходит через точки, полученные при последнем поиске. Заменяется на , на и т.д. Направление заменяется сопряженным направлением, после чего повторяется поиск по (n+1) направлениям, уже не содержащим старого направления .
Для квадратичных функций последовательностью n2 одномерных поисков приводит к точке минимума (если все операции выполнены точно). Построение сопряженного направления для квадратичной функции при n = 2 изображено на рисунке 1.1. Оно проходит через точки 1 и 3.
Рисунок 1.1 - Построение сопряженного направления для квадратичной функции
Описание алгоритма метода напряженных направлений
Шаг 1. Задать начальную точку х 0 , число е>0 для окончания алгоритма, начальные направления поиска
Положим 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 (,...,)= п , то новая система направлений линей-но независима. В этом случае положить: 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.
Входные данные
Задать начальную точку , к примеру , число е > 0 для окончания алгоритма, к примеру е =0,1, начальные направления поиска:
Положить d0 = d2= , i = 0, у0 = х0, k= 0.
Пример поиска минимума функции методом Пауэлла
Пример. Найти минимум функции f(x) = 4(х1 -5)2 +(х2 -6) > min мето-дом Пауэлла.
? 1°. Зададим начальную точку х° = (8,9)T,, е=0,1. По-ложим d0=dn= d2 ; у0 = х0 , i=0, k = 0.
2°. Получаем у1 = у0 +t0d0 = (8,9)T + t0(0,1)T = (8,9 + t0)T - Найдем мини-мум функции f(8,9 + t0) = 36 + (3 + t0)2 по t0. Очевидно, t0 = -3, а у1 = (8,6)T.
3°. Имеем i = 0 < 2 = n, поэтому i = i + 1 = 1 и перейдем к шагу 2.
21. Получаем у2 = у1 + t1d1 = (8,6)T + ti(l,0)T = (8 + t1,6)T. Найдем минимум функции f(8 + t1 , 6) = 4(3 +t1)2 по t1. Очевидно, он достигается при t1 =-3. Тогда у2 =(5,6)T.
31. Имеем i = 1 = n-1, уn - у2 * у0, поэтому i = i + 1 = 2 и переходим к шагу 2.
22. Получаем у3 = у2 +t2d2 = (5,6)T +t2(0,1)T =(5,6 + t2)T. Найдем минимум функции f(5,6 +t2) = t22 по t2. Очевидно, t2 = 0, а у3 = у2 =(5,6)T.
32. Имеем i = 2 = n, у3 * у1. Перейдем к шагу 4.
4°. Находим x1 =y3=(5,6)T, ||х1 -x0|| =4,24>е. Поло-жим d0=dn=d2 = у3-у1 =(5,6)T-(8,6)T =(-3,0)T; . Так как rang =2 = n, то система векторов линейно независима. По-ложим d2 = d2 = (-3,0), d1 = d1 = (0,1), d0 = d0 = (-3,0), k = k +1, i = 0, y0 = x1= =(5,6)T и перейдем к шагу 2.
23. Получаем у1 = y0 + t0d0 = (5,6)T +t0(-3,0)T =(5-3t0, 6)T. Найдем мини-мум функции f(5 - 3t0,6) =36t02 по t0. Так как t0 = 0, то у1 = (5,6)T = у0.
33. Имеем i = 0 < n -1 = 1, поэтому i =i +1 =1 и перейдем к шагу 2.
24. Получаем у2 = у1 +tldl = (5,6)T +t1(0,1)T =(5,6 + t1)T. Минимум функ-ции f(5,6 + t1) = t12 по t1 достигается при t1 = 0. Тогда у2 -(5,6)T = у1 = у0.
34. Имеем i = 1 = n -1, у2 = у0 , поэтому поиск завершается: x* = y2 = (5,6)T; f(x*) = 0.
Блок схема алгоритма метода сопряженных направлений
Рассмотрим алгоритм метода сопряженных направлений, представленный в виде блок схемы. Алгоритм начинается с ввода данных , где x0 - это координата начальной точки, е - число для окончания алгоритма (е > 0), d1 и d2 -начальные направления поиска (). Выход их алгоритма возможен в трех случаях:
1. При минимум функции будет найден в т. .
2. При минимум функции будет найден в т. .
3. При |||| < минимум функции будет найден в т. .
Рисунок 2.1 - Блок схема алгоритма метода сопряженных направлений
Рисунок 2.1 - Продолжение блок схемы алгоритма методом сопряженных направлений
Описание программной части. Выбор среды программирования
Для создания программного продукта использовалась интегрированная среда разработки приложений с графическим интерфейсом технологии Win-dows Form Visual Studio 2005 на языке C#.
C# -- объектно-ориентированный язык программирования. Разработан в 1998--2001 годах группой инженеров под руководством Андерса Хейлс-берга в компании Microsoft.
C# относится к семье языков с C-подобным синтаксисом, из них его син-таксис наиболее близок к C++ и Java.
Переняв многое от своих предшественников -- языков C++, Ja-va, Delphi, Модула и Smalltalk -- С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# не поддержи-вает множественное наследование классов (в отличие от C++).
Название «Си шарп» (До диез) происходит от музыкальной нотации, где знак диез, прибавляемый к основному обозначению ноты, означает повышение соответствующего этой ноте звука на полутон.[4] Это аналогично названию языка C++, где «++» обозначает, что переменная должна быть увеличена на 1.
Вследствие технических ограничений на отображение (стандартные шрифты, браузеры и т. д.) и того обстоятельства, что знак диез Ѓт? не представ-лен на стандартной клавиатуре, знак номера # был выбран для представления знака диез при записи имени языка программирования.[5] Это соглашение отражено в Спецификации Языка C# ECMA-334.[6] Тем не менее, на практике (например, при размещении рекламы и коробочном дизайне[7]), Майкрософт использует предназначенный музыкальный знак.
Названия языков программирования не принято переводить, поэтому зачастую язык называют по-английски «Си шарп».
C# является мощным объектным языком с возможностями наследования и универсализации.
C# является наследником языков С/С++, сохраняя лучшие черты этих популярных языков программирования. Общий с этими языками синтаксис, знакомые операторы языка облегчают переход программистов от C++ к С#.
Входные и выходные данные
После запуска программного продукта для нахождения минимума функции пользователю необходимо ввести данные в элементы управления текстовых полей textbox:
- начальная точка x0 записывается в массив, в котором хранятся начальные координаты точки,
double[] x = new double[2];
x[0] = Convert.ToDouble(textX0.Text);
x[1] = Convert.ToDouble(textX1.Text);
где x[0] - это координата x начальной точки, x[1] - координата y.
- число е записывается в переменную E. Значение данного числа должно быть больше нуля. В случае некорректного вода даны, будет показано сообщение об ошибке.
double E;
E = Convert.ToDouble(textE.Text);
- начальные направления поиска d1, d2, d0 записываются в массивы d1, d2, d0.
double[] d1 = new double[2];
double[] d2 = new double[2];
double[] d0 = new double[2];
d1[0] = Convert.ToDouble(textD1x0.Text);
d1[1] = Convert.ToDouble(textD1x1.Text);
d2[0] = Convert.ToDouble(textD2x0.Text);
d2[1] = Convert.ToDouble(textD2x1.Text);
d0[0] = d2[0];
d0[1] = d2[1];
Выходными значениями будут элементы массива x, в котором хранятся результаты вычислений алгоритма.
richTextBox1.Text += "y3 = y1\nПоиск завершен х* = y3 = (" + y[0].ToString() + ";" + y[1].ToString() + ")\n\n\tВсего итераций " + j.ToString();
Описание программы
Рассмотрим основные фрагменты программного продукта, реализующий «метод сопряженных направлений».
Функция Function содержит в себе математическую формулу для нахождения значения функции: f(x) = x13 + x22 - 3x1 - 2x2 + 2 min.
private double Function(double x1, double x2)
{
return Math.Pow(x1, 3) + Math.Pow(x2, 2) - 3 * x1 - 2 * x2 + 2;
}
Нахождение экстремума функции 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(y, u, s) <= Function_for_search_extremum(y, u, w))
{
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[] y, double[] u, double t)
{
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.Length > 0)
{
richTextBox1.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.UnicodePlainText);
}
}
А так же контролируются вводимые данные в элементы управления 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;
}
Контрольный пример. Решения задачи методом сопряженных направлений
Найти минимум функции методом сопряженных направлений Пауэлла.
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.
Результаты работы программы
Найти минимум функции методом сопряженных направлений программно. Результат работы представлен на рисунке 4.1.
Рисунок 4.1 - Результат нахождения минимума функции метод сопряженных направления программой
Рисунок 4.1 - Продолжение результата нахождения минимума функции методом сопряженных направлений
Заключение
В данной курсовой работе был рассмотрен метод сопряженного направления, описан его алгоритм и приведены несколько примеров решений по алгоритму, как ручного вычисления, так и с помощью ЭВМ.
Рассматривая и сравнивая выше приведенные примеры решений и их результаты, можно сказать, что минимум квадратичной функции был найден с минимальной погрешностью.
Данный метод ориентирован на исследование квадратичных функций. Основная его идея заключается в том, что бы, приведя квадратичную функцию n переменных к виду суммы полных квадратов, был найден ее оптимум в результате n одномерных поисков по преобразованным координатным направлениям.
В программном продукте были реализованы следующие функции:
- решение заданной функции методом сопряженных направлений;
- вывод результата и ход решения в текстовый объект;
- вывод ошибок, при условии, что вводимые данные не корректны;
- запись решения функции в текстовый файл.
сопряженный направление пауэлль квадратичный
Список использованной литературы
1.Акулич И.Л. Математическое программирование в примерах и задачах: Учеб. пособие. - М.: Высш. шк., 1986.
2.Банди Б. Методы оптимизации вводный курс. М.: Радио и связь,1988.
3.Белецкая С.Ю. Решение задач математического программирования: Учеб. пособие. - Воронеж, 2001.
4.Карманов В.Г. Математическое программирование. - М.: Наука, 1975.
5.А.В.Пантелеев, Летова Т.А. Методы оптимизации в примерах и задачах: Учебное пособие - 2-е изд., исправл. - M.:Высш. Шк., 2005. - 544с.
Приложение А
Руководство пользователя
Для решения задачи методом сопряженных направлений следует запустить программу, кликнув на файл с названием Метод сопряженных направле-ний.exe.
После запуска программного продукта приложение примет вид как показано на рисунке А.1.
Рисунок А.1 - Главное окно программы
Для решения задачи необходимо заполнить все текстовые поля.
При нажатии на кнопку «Решить» в текстовом объекте richTextBox будет выведено решение метода сопряженных направлений (рис. А.2).
Рисунок А.2. - Пример работы программы
Для сохранения решения задачи нужно нажать на кнопку «Сохранить в файл», после чего откроется диалоговое окно (рис. А.3) для выбора места хранения файла и его (файла) названия. Решение примера будет сохранено в текстовый файл с разрешением *.txt.
Рисунок А.3 - Диалоговое окно сохранения файла.
В данном реализованном продукте можно воспользоваться справкой, где расположен алгоритм решения задачи методом сопряженных направлений. Что бы ее вызвать, нужно нажать на иконку . После чего откроется диалоговое окно с рассоложенной на ней необходимой информацией (рис А.4).
Рисунок А.4 - Диалоговое окно «Справка».
Приложение Б
Листинг программы
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.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
namespace Метод_сопряженных_направлений
{
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 void Form1_Load(object sender, EventArgs e)
{
}
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(double[] y, double[] u, double t)
{
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;
}
private double Function(double x1, double x2)
{
return Math.Pow(x1, 3) + Math.Pow(x2, 2) - 3 * x1 - 2 * x2 + 2;
}
private void button1_Click(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
x[0] = 8;
x[1] = 9;
E = 0.1;
d1[0] = 1;
d1[1] = 0;
d2[0] = 0;
d2[1] = 1;
d0[0] = d2[0];
d0[1] = d2[1];
textX0.Text = x[0].ToString();
textX1.Text = x[1].ToString();
textE.Text = E.ToString();
textD1x0.Text = d1[0].ToString();
textD1x1.Text = d1[1].ToString();
textD2x0.Text = d2[0].ToString();
textD2x1.Text = d2[1].ToString();
}
else
{
x[0] = Convert.ToDouble(textX0.Text);
x[1] = Convert.ToDouble(textX1.Text);
E = Convert.ToDouble(textE.Text);
d1[0] = Convert.ToDouble(textD1x0.Text);
d1[1] = Convert.ToDouble(textD1x1.Text);
d2[0] = Convert.ToDouble(textD2x0.Text);
d2[1] = Convert.ToDouble(textD2x1.Text);
d0[0] = d2[0];
d0[1] = d2[1];
}
richTextBox1.Text = "";
double t=0;
i = 0;
y[0] = x[0];
y[1] = x[1];
y0[0] = y[0];
y0[1] = y[1];
k = 0;
j = 0;
if (E >= 0.1)
{
if(j==0)
richTextBox1.Text += "\t\t\tИтерация " + Convert.ToString(j + 1) + "\n\n\tШаг 1. \nНачальная точка х = (" + x[0].ToString() + " ; " + x[1].ToString() + "), е = " + E.ToString() + "\nd1 = (" + d1[0].ToString() + ";" + d1[1].ToString() + ") d2 = (" + d2[0].ToString() + ";" + d2[1].ToString() + ") d0 = dn\ni = " + i.ToString() + " k=" + k.ToString() + " y = x = (" + x[0].ToString() + ";" + x[1].ToString() + ")\n";
step_2:
if(j!=0)
richTextBox1.Text += "\n\t\t\tИтерация " + Convert.ToString(j + 1) + "\n";
if (checkBox1.Checked)
{
switch (j)
{
case 0: t = -8; break;
case 1: t = -7; break;
case 2: t = 0; break;
case 3: t = 0; break;
case 4: t = 0; break;
}
if (i == 0)
{
y[0] = y[0] + t * d0[0];
y[1] = y[1] + t * d0[1];
y1[0] = y[0];
y1[1] = y[1];
}
else
if (i == 2)
{
y[0] = y[0] + t * d2[0];
y[1] = y[1] + t * d2[1];
}
else
{
y[0] = y[0] + t * d1[0];
y[1] = y[1] + t * d1[1];
}
}
else
{
if (i == 0)
{
t = extremum(d0);
y[0] = y[0] + t * d0[0];
y[1] = y[1] + t * d0[1];
}
if (i == 2)
{
t = extremum(d2);
y[0] = y[0] + t * d2[0];
y[1] = y[1] + t * d2[1];
}
else
{
t = extremum(d1);
y[0] = y[0] + t * d1[0];
y[1] = y[1] + t * d1[1];
y1[0] = y[0];
y1[1] = y[1];
}
}
j++;
richTextBox1.Text += "\n\tШаг 2.\n y = (" + y[0].ToString() + " ; " + y[1].ToString() + ")\tt" + i.ToString() + " = " + t.ToString() + "\n";
//Шаг 3
richTextBox1.Text += "\n\tШаг 3.\n";
if (i < n - 1)
{
i++;
richTextBox1.Text += "Т.к. i=" + Convert.ToString(i - 1) + "< n-1 = 1, положим i = i+1 = "+Convert.ToString(i+1);
goto step_2;
}
else
if (i == n - 1)
{
richTextBox1.Text += "y2=(" + y[0].ToString() + ";" + y[1].ToString() + ")\ty0=(" + y0[0].ToString() + ";" + y0[1].ToString() + ")";
if (y[0] == y0[0] && y[1] == y0[1])
{
//то поиск завершить
richTextBox1.Text += "\ni = "+i.ToString()+"\ni=n-1\ny2=y0\nПоиск завершен х* = (" + y[0].ToString() + ";" + y[1].ToString() + ")\n\n\tВсего итераций " + j.ToString();
}
else
{
richTextBox1.Text += "\ni = "+i.ToString()+"\ni=n-1\ny2 != y0\n Положим i = i+1 = 2 и перейдем к шагу 2\n";
i++;
goto step_2;
}
}
else
{
if (i == n)
{
richTextBox1.Text += "\ni = " + i.ToString() + "\ti = n";
richTextBox1.Text += "\ny3 = (" + y[0].ToString() + ";" + y[1].ToString() + ")\ty1 = (" + y1[0].ToString() + ";" + y1[1].ToString() + ")";
if (y[0] == y1[0] && y[1] == y1[1])
{
//то поиск завершить
richTextBox1.Text += "y3 = y1\nПоиск завершен х* = y3 = (" + y[0].ToString() + ";" + y[1].ToString() + ")\n\n\tВсего итераций " + j.ToString();
}
else
{
richTextBox1.Text += "\ny3 !=y1\nПерейдем к шагу 4 для построения сопряженного направления";
//step_4:
richTextBox1.Text += "\n\n\tШаг 4. \n";
x_st[0] = x[0];
x_st[1] = x[1];
x[0] = y[0];
x[1] = y[1];
richTextBox1.Text += "k = " + k.ToString() + " Положим x_k+1 = y = (" + x[0].ToString() + ";" + x[1].ToString() + ") и проверим условие окончания\n";
if (Math.Sqrt(Math.Pow((x_st[0] - x[0]), 2) + Math.Pow((x_st[1] - x[1]), 2)) < E)
{
//то поиск завершить
richTextBox1.Text += "||x_k+1 - x_k|| < е\n||(" + x[0].ToString() + ";" + x[1].ToString() + ") - (" + x_st[0].ToString() + ";" + x_st[1].ToString() + ")|| = " + Math.Sqrt(Math.Pow((x_st[0] - x[0]), 2) + Math.Pow((x_st[1] - x[1]), 2)) + " < " + E.ToString();
richTextBox1.Text += "\nПоиск завершен х* = x_k+1 = (" + x[0].ToString() + ";" + x[1].ToString() + ")\n\n\tВсего итераций " + j.ToString();
}
else
{
richTextBox1.Text += "||x_k+1 - x_k|| >= е\n||(" + x[0].ToString() + ";" + x[1].ToString() + ") - (" + x_st[0].ToString() + ";" + x_st[1].ToString() + ")|| = " + Math.Sqrt(Math.Pow((x_st[0] - x[0]), 2) + Math.Pow((x_st[1] - x[1]), 2)) + " >= " + E.ToString();
d2_n[0] = y[0] - y1[0];
d2_n[1] = y[1] - y1[1];
d0_n[0] = d2_n[0];
d0_n[1] = d2_n[1];
d1_n[0] = d2[0];
d1_n[1] = d2[1];
richTextBox1.Text += "\nПоложим новое направление _d0 = _dn = y3-y1 = (" + y[0].ToString() + ";" + y[1].ToString() + ") - (" + y1[0].ToString() + ";" + y1[1].ToString() + ") = (" + d2_n[0].ToString() + ";" + d2_n[1].ToString() + ")\n";
richTextBox1.Text += "\nИсключим старое направление _d1 = d2 = (" + d1_n[0].ToString() + ";" + d1_n[1].ToString() + ")";
Matrica[0, 0] = d1_n[0];
Matrica[0, 1] = d2_n[0];
Matrica[1, 0] = d1_n[1];
Matrica[1, 1] = d2_n[1];
if (Rang_matrici(Matrica) == n)
{
richTextBox1.Text += "Т.к. rang(" + d1_n[0].ToString() + ", " + d1_n[1].ToString() + " ; " + d2_n[0].ToString() + ", " + d2_n[1].ToString() + ")=" + n.ToString() + " новая система направлений линейно независима\n";
d0[0] = d0_n[0];
d0[1] = d0_n[1];
d1[0] = d1_n[0];
d1[1] = d1_n[1];
d2[0] = d2_n[0];
d2[1] = d2_n[1];
k++;
i = 0;
y[0] = x[0];
y[1] = x[1];
y0[0] = y[0];
y0[1] = y[1];
richTextBox1.Text += "Положим \n\td1 = _d1 = (" + d1_n[0].ToString() + ";" + d1_n[1].ToString() + ")\n\t d2 = _d2 = (" + d2_n[0].ToString() + ";" + d2_n[1].ToString() + ")\n\tk=" + k.ToString() + " i=" + i.ToString();
richTextBox1.Text += "\ty0=(" + y[0].ToString() + ";" + y[1].ToString() + ")\n";
goto step_2;
}
if (Rang_matrici(Matrica) < n)
{
richTextBox1.Text += "Т.к. rang(" + d1_n[0].ToString() + ", " + d1_n[1].ToString() + " ; " + d2_n[0].ToString() + ", " + d2_n[1].ToString() + ")=" + Rang_matrici(Matrica) + " < " + n.ToString() + " новая система направлений линейно зависима\n";
y[0] = x[0];
y[1] = x[1];
y0[0] = y[0];
y0[1] = y[1];
k++;
i = 0;
richTextBox1.Text += "Положим: k=" + k.ToString() + " i=" + i.ToString() + " y0 = (" + y[0].ToString() + ";" + y[1].ToString() + ") и перейдем к шагу 2\n";
goto step_2;
}
}
}
}
}
}
else
MessageBox.Show("Введите е >=0,1","Просьба!");
}
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(y, u, s) <= Function_for_search_extremum(y, u, w))
{
b = w;
}
else
{
a = s;
}
if (Math.Abs(b - a) <= l)
return (a + b) / 2;
else
{
g++;
goto step_3;
}
}
private void button2_Click(object sender, EventArgs e)
{
textE.Clear();
textX0.Clear();
textX1.Clear();
}
private void button1_Click_1(object sender, EventArgs e)
{
MenuFileSaveAs();
}
private void MenuFileSaveAs()
{
saveFileDialog1.Filter = "Text files|*.txt";
if (saveFileDialog1.ShowDialog() == DialogResult.OK && saveFileDialog1.FileName.Length > 0)
{
richTextBox1.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.UnicodePlainText);
}
}
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;
}
private void textX1_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;
}
private void textE_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;
}
private void textD1x0_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;
}
private void textD1x1_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;
}
private void textD2x0_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;
}
private void textD2x1_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;
}
private void panel1_Click(object sender, EventArgs e)
{
info form = new info();
form.ShowDialog();
}
}
}
Размещено на Allbest.ru
Подобные документы
Рассмотрение эффективности применения методов штрафов, безусловной оптимизации, сопряженных направлений и наискорейшего градиентного спуска для решения задачи поиска экстремума (максимума) функции нескольких переменных при наличии ограничения равенства.
контрольная работа [1,4 M], добавлен 16.08.2010Анализ теорем сопряженных функторов. Естественное преобразование как семейство морфизмов. Характеристика свойств рефлективных подкатегорий. Знакомство с универсальными стрелками. Рассмотрение особенностей метода построения сопряженных функторов.
курсовая работа [3,1 M], добавлен 27.01.2013Методика преобразования вращения и ее значение в решении алгебраических систем уравнений. Получение результирующей матрицы. Ортогональные преобразования отражением. Итерационные методы с минимизацией невязки. Решение методом сопряженных направлений.
реферат [116,3 K], добавлен 14.08.2009Методы решения систем линейных алгебраических уравнений, их характеристика и отличительные черты, особенности и сферы применения. Структура метода ортогонализации и метода сопряженных градиентов, их разновидности и условия, этапы практической реализации.
курсовая работа [197,8 K], добавлен 01.10.2009Численные методы поиска безусловного экстремума. Задачи безусловной минимизации. Расчет минимума функции методом покоординатного спуска. Решение задач линейного программирования графическим и симплексным методом. Работа с программой MathCAD.
курсовая работа [517,9 K], добавлен 30.04.2011Формирование функции Лагранжа, условия Куна и Таккера. Численные методы оптимизации и блок-схемы. Применение методов штрафных функций, внешней точки, покоординатного спуска, сопряженных градиентов для сведения задач условной оптимизации к безусловной.
курсовая работа [1,8 M], добавлен 27.11.2012Математическая модель задачи. Решение транспортной задачи методом потенциалов. Значение целевой функции. Система, состоящая из 7 уравнений с 8-ю неизвестными. Решение задач графическим методом. Выделение полуплоскости, соответствующей неравенству.
контрольная работа [23,5 K], добавлен 12.06.2011Методы нахождения минимума функции одной переменной и функции многих переменных. Разработка программного обеспечения вычисления локального минимума функции Химмельблау методом покоординатного спуска. Поиск минимума функции методом золотого сечения.
курсовая работа [95,1 K], добавлен 12.10.2009Решение систем линейных алгебраических уравнений методом простой итерации. Полиномиальная интерполяция функции методом Ньютона с разделенными разностями. Среднеквадратическое приближение функции. Численное интегрирование функций методом Гаусса.
курсовая работа [2,4 M], добавлен 14.04.2009Основные сведения о симплекс-методе, оценка его роли и значения в линейном программировании. Геометрическая интерпретация и алгебраический смысл. Отыскание максимума и минимума линейной функции, особые случаи. Решение задачи матричным симплекс-методом.
дипломная работа [351,2 K], добавлен 01.06.2015