Метод сопряженных направлений
"Метод
сопряженных направлений"
Введение
сопряженный направление
пауэлл квадратичный
Оптимизация как раздел математики существует
достаточно давно. Оптимизация - это выбор, т.е. то, чем постоянно приходиться
заниматься в повседневной жизни. Термином «оптимизация» в литературе обозначает
процесс или последовательность операций, позволяющих получить уточненное
решение. Хотя конечной целью оптимизации является отыскание наилучшего или
«оптимального» решения, обычно приходится довольствоваться улучшением известных
решений, а не доведением их до совершенства. Поэтому под оптимизацией понимают
скорее стремление к совершенству, которое, возможно, и не будет достигнуто.
Необходимость принятия наилучших решений так же
стара, как само человечество. Испокон веку люди, приступая к осуществлению
своих мероприятий, раздумывали над их возможными последствиями и принимали
решения, выбирая тем или другим образом зависящие от них параметры - способы
организации мероприятий. Но до поры, до времени решения могли приниматься без
специального математического анализа, просто на основе опыта и здравого смысла.
Цель данной курсовой работы:
проанализировать и обработать теоретические и
экспериментальные данные по теме метод сопряженных направлений;
анализ собранной информации;
сравнительный анализ с другими методами;
разработка программы, реализующая данный метод.
Метод сопряженных направлений.
Постановка задачи
Требуется найти безусловный минимум функции 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.
°. Получаем у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.
°. Имеем 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.
3.
Получаем у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 -начальные
направления поиска (). Выход их
алгоритма возможен в трех случаях:
. При минимум
функции будет найден в т. .
. При минимум
функции будет найден в т. .
. При ||||
<
минимум функции будет найден в т. .
Рисунок 2.1 - Блок схема алгоритма метода
сопряженных направлений
Рисунок 2.1 - Продолжение блок схемы алгоритма
методом сопряженных направлений
Описание программной части. Выбор
среды программирования
Для создания программного продукта
использовалась интегрированная среда разработки приложений с графическим
интерфейсом технологии Win-dows
Form Visual Studio 2005 на языке C#.# -
объектно-ориентированный
язык
программирования. Разработан в 1998-2001
годах
группой
инженеров под руководством Андерса
Хейлс-берга в компании
Microsoft.#
относится к семье языков с C-подобным
синтаксисом, из них его син-таксис наиболее близок к
C++
и
Java.
Переняв многое от своих предшественников -
языков
C++,
Ja-va,
Delphi,
Модула
и
Smalltalk
- С#, опираясь на практику их использования, исключает некоторые модели,
зарекомендовавшие себя как проблематичные при разработке программных систем,
например, C# не поддержи-вает множественное
наследование классов (в отличие
от C++).
Название «Си шарп» (До
диез)
происходит от музыкальной
нотации, где знак диез, прибавляемый
к основному обозначению ноты, означает
повышение соответствующего этой ноте звука
на
полутон.[4]
Это
аналогично названию языка C++, где «++»
обозначает, что переменная должна быть
увеличена на 1.
Вследствие технических ограничений на
отображение (стандартные шрифты, браузеры и т. д.) и того обстоятельства, что
знак диез ♯ не представ-лен на стандартной
клавиатуре, знак номера # был выбран для представления знака диез при записи
имени языка программирования.[5] Это соглашение отражено в
Спецификации Языка C# ECMA-334.[6] Тем не менее, на практике
(например, при размещении рекламы и коробочном дизайне[7]),
Майкрософт использует предназначенный музыкальный знак.
Названия языков программирования не принято
переводить, поэтому зачастую язык называют по-английски «Си шарп».
C# является мощным
объектным языком с возможностями наследования и универсализации.
C# является
наследником языков С/С++, сохраняя лучшие черты этих популярных языков
программирования. Общий с этими языками синтаксис, знакомые операторы языка
облегчают переход программистов от C++
к С#.
Входные и выходные данные
начальная точка x0
записывается в массив, в котором хранятся начальные координаты точки,
[] x = new double[2];[0] =
Convert.ToDouble(textX0.Text);[1] = Convert.ToDouble(textX1.Text);
где x[0]
- это координата x начальной
точки, x[1] - координата y.
число ε
записывается в переменную E.
Значение данного числа должно быть больше нуля. В случае некорректного вода
даны, будет показано сообщение об ошибке.
E;= Convert.ToDouble(textE.Text);
начальные направления поиска d1, d2,
d0 записываются в массивы d1, d2, d0.
[]
d1 = new double[2];[] d2 = new double[2];[] d0 = new double[2];[0] =
Convert.ToDouble(textD1x0.Text);[1] = Convert.ToDouble(textD1x1.Text);[0] =
Convert.ToDouble(textD2x0.Text);[1] = Convert.ToDouble(textD2x1.Text);[0] =
d2[0];[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.
double Function(double x1, double x2)
{Math.Pow(x1, 3) + Math.Pow(x2, 2) - 3 * x1 - 2
* x2 + 2;
}
Нахождение экстремума функции f(yi
+
ti
di
) по ti
осуществляется функцией Extremum одним из методов одномерной минимизации:
«Фибоначи».
double extremum(double[]u) // u[] это d[]
{a = -2 * y[0];b = 2 * y[0];eps = (b-a)/50;l =
(b-a)/10;g = 0; //счетчикs; //yw; //z_3: s = (a + b - eps) / 2;= (a + b + eps)
/ 2;(Function_for_search_extremum(y, u, s) <= Function_for_search_extremum(y,
u, w))
{= w;
}
{= s;
}(Math.Abs(b - a) <= l)(a + b) / 2;
{++;step_3;
}
}
Функция Function_for_search_extremum необходима
для нахождения значения функции при поиске экстремума.
double Function_for_search_extremum(double[] y,
double[] u, double t)
{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;Fx;
}
Для вычисления ранга матрицы используется метод
Rang_matrici.
int Rang_matrici(double [,]Matrica)
{(Matrica[1,0] != 0)(int i = 1; i < 2; i++)
{mnojitel = (Matrica[0, 0] / Matrica[i, 0]) *
(-1);(int j = 0; j < 2; j++)
{[i, j] = Matrica[i,j] * mnojitel + Matrica[i-1,
j];
}
}k;y = 0;(int i = 0; i < 2; i++)
{= 0;(int j = 0; j < 2; j++)
{(Matrica[i, j] == 0)++;
}(k == 2)++;
}rang = 2 - y;rang;
}
Запись полученного решения, хранящееся в объекте
RichTextBox1, записывается в текстовый файл спомощью функции MenuFileSaveAs().
void MenuFileSaveAs()
{.Filter = "Text
files|*.txt";(saveFileDialog1.ShowDialog() == DialogResult.OK &&
saveFileDialog1.FileName.Length > 0)
{.SaveFile(saveFileDialog1.FileName,
RichTextBoxStreamType.UnicodePlainText);
}
}
А так же контролируются вводимые данные в
элементы управления Text-Box.
Пользователь может вводить только цифры и запятую. Проверка осуществляется при
нажатии любой клавиши.
void textX0_KeyPress(object sender,
KeyPressEventArgs e)
{(e.KeyChar != 8 && (e.KeyChar < 48
|| e.KeyChar > 57 )).Handled = true;(e.KeyChar == 44).Handled = false;
}
Контрольный пример. Решения задачи
методом сопряженных направлений
Найти минимум функции методом
сопряженных направлений Пауэлла.
10 x0 =
(8;9)T, , ε
= 0,1, y0 = x0 = (8;9)T
i=0, k=0;
0 y1
= y0 +t0 d0 = (8;9)T + t0
(0;1)T = (8, 9 + t0);(8, 9 + t0) = 83
+ (9 + t0)2 - 24 - 2(9 + t0) + 2 = t02
+ 16t0 + 553;0 = -8; y1 = (8;1)T;
0 Т.к.
i < n-1 положим i=1 и
перейдем
к
шагу
2;
1 y2
= y1 + t1 d1 = (8;1)T + t1
(1;0)T = (8 + t1;1)T;(8 + t1;1) = t13
+ 24t12 + 189t1;1 = -7; y2
= (1;1);
1 i
= n-1; y2 ≠ y0, i =2;
2
y3 = y2 + t2 d2 = (1;1)T
+ t2 (0;1)T = (1; 1+t2);2 = 0; y3
= (1;1)T;
2 i
= n = 2;3 ≠ y1;
0 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;1
= = (0;1)T;2
= = (-7;0)T;=
0, k = 1, y0 = x1 = (1;1)T;
3 y1
= y0 +t0 d0 = (1;1)T + t0
(-7;0)T = (1 - 7t0 ;1);o = 0; y1 = (1;1);
3 i < n-1 положим i=1 и
перейдем к шагу 2;
24 y2 = y1
+ t1 d1 = (1;1)T + t1 (0;1)T
= (1;1 + t1)T;1 = 0; y2 = (1;1);
x* = y2 = (1;1)T.
Результаты работы
программы
Найти минимум функции методом
сопряженных направлений программно. Результат работы представлен на рисунке
4.1.
Рисунок 4.1 - Результат нахождения минимума
функции метод сопряженных направления программой
Рисунок 4.1 - Продолжение результата нахождения
минимума функции методом сопряженных направлений
Заключение
В данной курсовой работе был рассмотрен метод
сопряженного направления, описан его алгоритм и приведены несколько примеров
решений по алгоритму, как ручного вычисления, так и с помощью ЭВМ.
Рассматривая и сравнивая выше приведенные
примеры решений и их результаты, можно сказать, что минимум квадратичной
функции был найден с минимальной погрешностью.
Данный метод ориентирован на исследование
квадратичных функций. Основная его идея заключается в том, что бы, приведя
квадратичную функцию n
переменных к виду суммы полных квадратов, был найден ее оптимум в результате n
одномерных поисков по преобразованным координатным направлениям.
В программном продукте были реализованы
следующие функции:
решение заданной функции методом сопряженных
направлений;
вывод результата и ход решения в текстовый
объект;
вывод ошибок, при условии, что вводимые данные
не корректны;
запись решения функции в текстовый файл.
сопряженный направление
пауэлль квадратичный
Список использованной литературы
.Акулич
И.Л. Математическое программирование в примерах и задачах: Учеб. пособие. - М.:
Высш. шк., 1986.
.Банди
Б. Методы оптимизации вводный курс. М.: Радио и связь,1988.
.Белецкая
С.Ю. Решение задач математического программирования: Учеб. пособие. - Воронеж,
2001.
.Карманов
В.Г. Математическое программирование. - М.: Наука, 1975.
.А.В.Пантелеев,
Летова Т.А. Методы оптимизации в примерах и задачах: Учебное пособие - 2-е
изд., исправл. - M.:Высш. Шк., 2005. - 544с.
Приложение А
Руководство пользователя
Для решения задачи методом сопряженных
направлений следует запустить программу, кликнув на файл с названием Метод
сопряженных направле-ний.exe.
После запуска программного продукта приложение
примет вид как показано на рисунке А.1.
Рисунок А.1 - Главное окно программы
Для решения задачи необходимо заполнить все
текстовые поля.
При нажатии на кнопку «Решить» в текстовом
объекте richTextBox будет выведено решение метода сопряженных направлений (рис.
А.2).
Рисунок А.2. - Пример работы программы
Для сохранения решения задачи нужно нажать на
кнопку «Сохранить в файл», после чего откроется диалоговое окно (рис. А.3) для
выбора места хранения файла и его (файла) названия. Решение примера будет
сохранено в текстовый файл с разрешением *.txt.
Рисунок А.3 - Диалоговое окно сохранения файла.
В данном реализованном продукте можно
воспользоваться справкой, где расположен алгоритм решения задачи методом
сопряженных направлений. Что бы ее вызвать, нужно нажать на иконку .
После чего откроется диалоговое окно с рассоложенной на ней необходимой
информацией (рис А.4).
Рисунок А.4 - Диалоговое окно «Справка».
Приложение Б
Листинг программы
using
System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Text;System.Windows.Forms;System.IO;System.Net;System.Net.Sockets;System.Runtime.Serialization;System.Runtime.Serialization.Formatters;System.Runtime.Serialization.Formatters.Binary;Метод_сопряженных_направлений
{partial class Form1 : Form
{[,] Matrica = new double[2, 2];[] x = new
double[2];E;[] d1 = new double[2];[] d2 = new double[2];[] d0 = new
double[2];i;k;n = 2;j;[] y = new double[2];[] y1 = new double[2];[] y0 = new
double[2];[] x_st = new double[2];[] d1_n = new double[2];[] d2_n = new
double[2];[] d0_n = new double[2];Form1()
{();
}void Form1_Load(object sender, EventArgs e)
{
}int Rang_matrici(double [,]Matrica)
{(Matrica[1,0] != 0)(int i = 1; i < 2; i++)
{mnojitel = (Matrica[0, 0] / Matrica[i, 0]) *
(-1);(int j = 0; j < 2; j++)
{[i, j] = Matrica[i,j] * mnojitel + Matrica[i-1,
j];
}
}k;y = 0;(int i = 0; i < 2; i++)
{= 0;(int j = 0; j < 2; j++)
{(Matrica[i, j] == 0)++;
}(k == 2)++;
}rang = 2 - y;rang;
}double Function_for_search_extremum(double[] y,
double[] u, double t)
{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;Fx;
}double Function(double x1, double x2)
{Math.Pow(x1, 3) + Math.Pow(x2, 2) - 3 * x1 - 2
* x2 + 2;
}void button1_Click(object sender, EventArgs e)
{(checkBox1.Checked)
{[0]
= 8;[1] = 9;= 0.1;[0] = 1;[1] = 0;[0] = 0;[1] = 1;[0] = d2[0];[1] = d2[1];.Text
= x[0].ToString();.Text = x[1].ToString();.Text = E.ToString();x0.Text =
d1[0].ToString();x1.Text = d1[1].ToString();x0.Text = d2[0].ToString();x1.Text
= d2[1].ToString();
}
{[0]
= Convert.ToDouble(textX0.Text);[1] = Convert.ToDouble(textX1.Text);=
Convert.ToDouble(textE.Text);[0] = Convert.ToDouble(textD1x0.Text);[1] =
Convert.ToDouble(textD1x1.Text);[0] = Convert.ToDouble(textD2x0.Text);[1] =
Convert.ToDouble(textD2x1.Text);[0] = d2[0];[1] = d2[1];
}.Text
= "";t=0;= 0;[0] = x[0];[1] = x[1];[0] = y[0];[1] = y[1];= 0;= 0;(E
>= 0.1)
{(j==0).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";_2:(j!=0).Text += "\n\t\t\tИтерация " +
Convert.ToString(j + 1) + "\n";(checkBox1.Checked)
{(j)
{0:
t = -8; break;1: t = -7; break;2: t = 0; break;3: t = 0; break;4: t = 0; break;
{[0]
= y[0] + t * d0[0];[1] = y[1] + t * d0[1];[0] = y[0];[1] = y[1];
}(i
== 2)
{[0]
= y[0] + t * d2[0];[1] = y[1] + t * d2[1];
}
{[0]
= y[0] + t * d1[0];[1] = y[1] + t * d1[1];
}
}
{(i
== 0)
{=
extremum(d0);[0] = y[0] + t * d0[0];[1] = y[1] + t * d0[1];
}
(i
== 2)
{=
extremum(d2);[0] = y[0] + t * d2[0];[1] = y[1] + t * d2[1];
}
{=
extremum(d1);[0] = y[0] + t * d1[0];[1] = y[1] + t * d1[1];[0] = y[0];[1] =
y[1];
}
}++;.Text
+= "\n\tШаг 2.\n y = (" + y[0].ToString() + " ; " +
y[1].ToString() + ")\tt" + i.ToString() + " = " +
t.ToString() + "\n";
//Шаг
3.Text += "\n\tШаг 3.\n";(i < n - 1)
{++;.Text
+= "Т.к. i=" + Convert.ToString(i - 1) + "< n-1 = 1, положим
i = i+1 = "+Convert.ToString(i+1);step_2;
}(i
== n - 1)
{.Text
+= "y2=(" + y[0].ToString() + ";" + y[1].ToString() +
")\ty0=(" + y0[0].ToString() + ";" + y0[1].ToString() +
")";(y[0] == y0[0] && y[1] == y0[1])
{
//то
поиск завершить.Text += "\ni =
"+i.ToString()+"\ni=n-1\ny2=y0\nПоиск завершен х* = (" +
y[0].ToString() + ";" + y[1].ToString() + ")\n\n\tВсего итераций
" + j.ToString();
}
{.Text
+= "\ni = "+i.ToString()+"\ni=n-1\ny2 != y0\n Положим i = i+1 =
2 и перейдем к шагу 2\n";++;step_2;
}
}
{(i
== n)
{.Text
+= "\ni = " + i.ToString() + "\ti = n";.Text += "\ny3
= (" + y[0].ToString() + ";" + y[1].ToString() + ")\ty1 =
(" + y1[0].ToString() + ";" + y1[1].ToString() + ")";(y[0]
== y1[0] && y[1] == y1[1])
{
//то
поиск завершить.Text += "y3 = y1\nПоиск завершен х* = y3 = (" +
y[0].ToString() + ";" + y[1].ToString() + ")\n\n\tВсего итераций
" + j.ToString();
}
{.Text
+= "\ny3 !=y1\nПерейдем к шагу 4 для построения сопряженного
направления";
//step_4:.Text
+= "\n\n\tШаг 4. \n";_st[0] = x[0];_st[1] = x[1];[0] = y[0];[1] =
y[1];.Text += "k = " + k.ToString() + " Положим x_k+1 = y =
(" + x[0].ToString() + ";" + x[1].ToString() + ") и
проверим условие окончания\n";
(Math.Sqrt(Math.Pow((x_st[0]
- x[0]), 2) + Math.Pow((x_st[1] - x[1]), 2)) < E)
{
//то
поиск завершить.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();.Text += "\nПоиск завершен х* = x_k+1 =
(" + x[0].ToString() + ";" + x[1].ToString() +
")\n\n\tВсего итераций " + j.ToString();
}
{.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();_n[0] = y[0] - y1[0];_n[1] = y[1] -
y1[1];_n[0] = d2_n[0];_n[1] = d2_n[1];_n[0] = d2[0];_n[1] = d2[1];.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";.Text += "\nИсключим
старое направление _d1 = d2 = (" + d1_n[0].ToString() + ";" +
d1_n[1].ToString() + ")";[0, 0] = d1_n[0];[0, 1] = d2_n[0];[1, 0] =
d1_n[1];[1, 1] = d2_n[1];(Rang_matrici(Matrica) == n)
{.Text
+= "Т.к. rang(" + d1_n[0].ToString() + ", " +
d1_n[1].ToString() + " ; " + d2_n[0].ToString() + ", " +
d2_n[1].ToString() + ")=" + n.ToString() + " новая система
направлений линейно независима\n";[0] = d0_n[0];[1] = d0_n[1];[0] =
d1_n[0];[1] = d1_n[1];[0] = d2_n[0];[1] = d2_n[1];++;= 0;[0] = x[0];[1] =
x[1];[0] = y[0];[1] = y[1];.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();.Text +=
"\ty0=(" + y[0].ToString() + ";" + y[1].ToString() +
")\n";step_2;
}(Rang_matrici(Matrica)
< n)
{.Text
+= "Т.к. rang(" + d1_n[0].ToString() + ", " +
d1_n[1].ToString() + " ; " + d2_n[0].ToString() + ", " +
d2_n[1].ToString() + ")=" + Rang_matrici(Matrica) + " <
" + n.ToString() + " новая система направлений линейно
зависима\n";[0] = x[0];[1] = x[1];[0] = y[0];[1] = y[1];++;= 0;.Text +=
"Положим: k=" + k.ToString() + " i=" + i.ToString() +
" y0 = (" + y[0].ToString() + ";" + y[1].ToString() +
") и перейдем к шагу 2\n";step_2;
}
}
}
}
}
}.Show("Введите
е >=0,1","Просьба!");
}double
extremum(double[]u) // u[] это d[]
{a
= -2 * y[0];b = 2 * y[0];eps = (b-a)/50;l = (b-a)/10;g = 0; //счетчикs; //yw;
//z_3: s = (a + b - eps) / 2;= (a + b + eps) / 2;(Function_for_search_extremum(y,
u, s) <= Function_for_search_extremum(y, u, w))
{=
w;
}
{=
s;
}(Math.Abs(b
- a) <= l)(a + b) / 2;
{++;step_3;
}
}void
button2_Click(object sender, EventArgs e)
{.Clear();.Clear();.Clear();
}void
button1_Click_1(object sender, EventArgs e)
{();
}void
MenuFileSaveAs()
{.Filter
= "Text files|*.txt";(saveFileDialog1.ShowDialog() == DialogResult.OK
&& saveFileDialog1.FileName.Length > 0)
{.SaveFile(saveFileDialog1.FileName,
RichTextBoxStreamType.UnicodePlainText);
}
}void
textX0_KeyPress(object sender, KeyPressEventArgs e)
{(e.KeyChar
!= 8 && (e.KeyChar < 48 || e.KeyChar > 57 )).Handled =
true;(e.KeyChar == 44).Handled = false;
}void
textX1_KeyPress(object sender, KeyPressEventArgs e)
{(e.KeyChar
!= 8 && (e.KeyChar < 48 || e.KeyChar > 57)).Handled =
true;(e.KeyChar == 44).Handled = false;
}void
textE_KeyPress(object sender, KeyPressEventArgs e)
{(e.KeyChar
!= 8 && (e.KeyChar < 48 || e.KeyChar > 57)).Handled =
true;(e.KeyChar == 44).Handled = false;
}void
textD1x0_KeyPress(object sender, KeyPressEventArgs e)
}void
textD1x1_KeyPress(object sender, KeyPressEventArgs e)
{(e.KeyChar
!= 8 && (e.KeyChar < 48 || e.KeyChar > 57)).Handled =
true;(e.KeyChar == 44).Handled = false;
}void
textD2x0_KeyPress(object sender, KeyPressEventArgs e)
{(e.KeyChar
!= 8 && (e.KeyChar < 48 || e.KeyChar > 57)).Handled =
true;(e.KeyChar == 44).Handled = false;
}void
textD2x1_KeyPress(object sender, KeyPressEventArgs e)
{(e.KeyChar
!= 8 && (e.KeyChar < 48 || e.KeyChar > 57)).Handled =
true;(e.KeyChar == 44).Handled = false;
}void
panel1_Click(object sender, EventArgs e)
{form
= new info();.ShowDialog();
}
}
}