Метод сопряженных направлений

Сущность сопряженных направлений, знакомство с основными алгоритмами. Особенности поиска минимума функции методом Пауэлла. Разработка приложений с графическим интерфейсом. Исследование квадратичных функций, решение задач методом сопряженных направлений.

Рубрика Математика
Вид курсовая работа
Язык русский
Дата добавления 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 = у31 =(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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.