0,3 | 24 | -0,816581347038974 | -0,778554392565042 | -0,743674553224567 | 0,3 | 25 | -0,816581347038974 | -0,842357998475409 | -0,743674553224567 | 0,3 | 26 | -0,845848412956476 | -0,846177360374865 | -0,838238020383463 | 0,075 | 27 | -0,846177360374865 | -0,845848412956476 | -0,843154372435278 | 0,075 | 28 | -0,846616455690446 | -0,845848412956476 | -0,843154372435278 | 0,075 | 29 | -0,848017017695877 | -0,847087728053341 | -0,846597987664592 | 0,0375 | 30 | -0,848017017695877 | -0,847980516275042 | -0,847811621576176 | 0,01875 | 31 | -0,848017017695877 | -0,848085062414109 | -0,847811621576176 | 0,01875 |
Т.к подальше зменшення α неможливо (α / 2 <ε) і в ε околиці отриманої на 31 кроці точці ми не отримуємо покращення (зменшення значення) функції, то приймемо x = 0,248249999999998 і y = 0,408289729858682 Z (x, y) = -0,847811621576176. 2.4 Метод деформованого симплекса Алгоритм мінімізації по правильному симплекс можна модифікувати, додавши до процедури відображення при побудові нового симплекса процедури стиснення і розтягування. А саме, положення нової вершини y замість вершини xn, відповідної найбільшим значенням функції, знаходиться порівнянням і вибором найменшого серед значень цільової функції в точках: z1 = xc - a (xc - xn), 0 <a <1; z 2 = xc + a (xc - xn), 0 <a <1; z3 = xc + b (xc - xn), b наближено дорівнює 1; z4 = xc + g (xc - xn), g <1. Геометрична ілюстрація цих процедур для двовимірного простору наведена на малюнку 7. Нові симплекс отримані в результаті процедури стиснення (a, b); відображення (c); розтягування (d) Так як величина a належить інтервалу (0; 1), то вибір точок z1 і z2 відповідає стисненню симплекса; b наближено дорівнює 1, тому вибір точки z3 відповідає відображенню, а g> 1 і вибір точки z4 призводить до розтягування симплекса. Відзначимо, що при деформаціях втрачається властивість правильності вихідного симплекса. Алгоритм методу пошуку точки мінімуму функції з деформівній симплекс Початковий етап. Вибрати параметр точності eps, параметри a, b і g, базову точку x0, параметр a і побудувати початковий симплекс. Обчислити значення функції f (x0). Основний етап. Крок 1. Обчислити значення функції в вершинах симплекса x1 ,..., xn. Крок 2. Упорядкувати вершини симплекса x0 ,..., xn так, щоб f (x0) <= f (x1 )<=...<= f (x [n-1]) <= f (xn). Крок 3. Перевірити умова (1 / n) Sum [f (xi)-f (x0)] ^ 2 <e ^ 2, i = [1, n]. Це одне з можливих умов зупину. При його виконанні "дисперсія" значень f (x) в вершинах симплекса стає менше e2, що, як правило, відповідає або малому ребру a симплекса, або потрапляння точки мінімуму x * всередину симплекса, або того й іншого одновременно.Еслі ця умова виконана, то обчислення припинити, вважаючи x *= x0. В іншому випадку перейти до кроку 4. Крок 4. Знайти xс і пробні точки zk, k = 1 ,..., 4 по формулам (2). Знайти f (z *) = minf (zk). Якщо f (z *) <f (xn), то покласти xn = z * і перейти до кроку 2. Інакше - перейти до кроку 5. Крок 5. Зменшити симплекс, вважаючи xi = (xi + x0) / 2, i = 1 ,..., n перейти до кроку 1. На практиці добре зарекомендував себе наступний набір параметрів a = 1 / 2, b = 1, g = 2, тому він і був використаний в програмі. Таблиця 5 - Метод деформованого симплекса № кроку | Z (x0, y0) | Z (x1, y1) | Z (x2, y2) | 1 | 5,25127562399313 | 5,35273629457997 | 4,72465845389651 | 2 | 4,47048359472409 | 5,52371793491734 | 4,32427361628427 | 3 | 4,26941489330181 | 4,56183485018145 | 2,53610076197985 | 4 | 2,53610076197985 | 4,26941489330181 | 2,54614140634749 | 5 | 2,60406550474582 | 2,62414679348111 | 0,650136727095332 | 6 | 0,873172338270091 | 4,78102989357106 | -0,460995375774572 | 7 | -0,460995375774572 | -0,183165198484471 | -0,647802169588968 | 8 | -0,647802169588968 | -0,460995375774572 | -0,752046189909185 | 9 | -0,752046189909185 | -0,647802169588968 | -0,743774186218157 | 10 | -0,824978188986428 | -0,820842187140914 | -0,807869388437316 | 11 | -0,848148148136976 | -0,848148148106495 | -0,848148148103467 | 12 | -0,848148148146818 | -0,848148148131578 | -0,848148148135116 | 13 | -0,848148148146818 | -0,848148148135116 | -0,848148148139001 | 14 | -0,848148148136976 | -0,848148148106495 | -0,848148148103467 | 15 | -0,848148148148147 | -0,848148148148145 | -0,848148148148146 | 16 | -0,848148148148148 | -0,848148148148147 | -0,848148148148147 |
T.к. <Ε, то приймемо x = 0,237037034153931 і y = 0,407407409218273 Z (x, y) = -0,848148148148148 Порівнявши всі методи, ми бачимо, що для даної функції краще підходить метод деформованого симплекса, т.к. він швидше призводить до оптимального рішення. 3. Умовна оптимізація Завдання умовної оптимізації в загальному випадку записується у відомому вигляді: Таке завдання оптимізації, крім цільової функції, включає додаткові умови у вигляді обмежень і граничних умов. На малюнку 12 представлена фігура, об'єм, якої необхідно максимізувати при заданій площі поверхні Рисунок 12 - Постать для максимізації обсягу при заданій площі поверхні Знайдемо повну площу поверхні даної фігури (без верхньої поверхні): , знайдемо обсяг фігури: Це завдання є приклад завдання умовної оптимізації: необхідно знайти максимальний об'єм при заданому значенні площі поверхні. Це завдання можна вирішити двома методами: Метод перетворення цільової функції, метод штрафних функцій. 3.1 Метод перетворення цільової функції Т.к. покладено обмеження типу рівності, то з цього обмеження одну змінну висловимо через іншу і підставимо отриману залежність в цільову функцію і отримаємо перетворену цільову функцію, але без обмежень. V = 4 / 3 ∙ a2 ∙ h2 +7 / 3 ∙ h1 ∙ a2 → max (1) S = 6 ∙ a ∙ h1 +4 ∙ h2 ∙ a (2) Висловимо a з (2) і підставимо в (1), отримаємо: V = s2 ∙ (4 ∙ h2 +7 ∙ h1) / 3 ∙ (6 ∙ h1 +4 ∙ h2) 2 Тепер, задавши початкові умови, значення площі поверхні, і вибравши потрібну точність можна вирішити завдання будь-яким методом безумовної оптимізації. Візьмемо, наприклад, метод правильного симплекса, і задамо початкові умови: а = 1м, h1 = 3м, h2 = 4м, s = 34м. Для методу симплекса виберемо точність ε = 0,001. Тобто максимальний обсяг V = 12,7151461307724, при заданій площі виходить при h1 = 2,946875, і h2 = 3,83229490168751 3.2 Метод штрафних функцій Методи штрафних функцій відносяться до групи непрямих методів вирішення задач нелінійного програмування: f (x) -> min; gi (x) 0, i 1, ..., k; hj (x) 0, j 1, ..., m; a x b. Вони перетворять завдання з обмеженнями в послідовність завдань безумовної оптимізації деяких допоміжних функцій. Останні виходять шляхом модифікації цільової функції за допомогою функцій-обмежень таким чином, щоб обмеження в явному вигляді в задачі оптимізації не фігурували. Це забезпечує можливість застосування методів безумовної оптимізації. У загальному випадку допоміжна функція має вигляд F (x, a) f (x) + rS (x) Тут f (x) - цільова функція задачі оптимізації; S (x) - спеціальним чином обрана функція штрафу, де r-множник, значення якого можна змінювати в процесі оптимізації .. Крапку безумовного мінімуму функції F (x, a) будемо позначати через х (а). Серед методів штрафних функцій розрізняють методи внутрішньої і зовнішньої точки. Відповідно до методів внутрішньої точки (інакше званим методами бар'єрних функцій), вихідну для пошуку точку можна вибирати тільки всередині допустимої області, а для методів зовнішньої точки як всередині, так і поза допустимої області (важливо лише, щоб у ній функції цільова та обмежень були б визначені ). 3.2 Методи штрафних функцій Ці методи застосовуються для вирішення задач нелінійного програмування з обмеженнями-нерівностями. У розглянутих методах функції Ф (x, а) підбирають такими, щоб їх значення необмежено зростали при наближенні до кордону допустимої області G (Малюнок 14). Іншими словами, наближення до кордону "штрафується" різким збільшенням значення функції F (x, а). На кордоні G побудований "бар'єр", що перешкоджає порушення обмеження в процесі безумовної мінімізації F (x, a). Пошук мінімуму допоміжної функції F (x, а) необхідно починати з внутрішньої точки області G. Таким чином, внутрішня штрафна функція Ф (х, а) може бути визначена таким чином: Тут dG-межа області G. Рисунок 14 - Внутрішня штрафна функція Методи зовнішніх штрафних функцій Дані методи застосовуються для вирішення задачі оптимізації при наявності як обмежень-нерівностей, так і обмежень-рівностей. У розглянутих методах функції Ф (х, а) вибирають такими, що їх значення рівні нулю всередині і на кордоні допустимої області G, а поза її позитивні і зростають тим більше, чим сильніше порушуються обмеження (Малюнок 15). Таким чином, тут "штрафується" видалення від допустимої області G. Малюнок - 15 Зовнішня штрафна функція Зовнішня штрафна функція Ф (х, а) у загальному випадку може бути визначена таким чином: Для даного курсового проекту штрафна функція для обсягу даної фігури має вигляд: , де - Параметр штрафу, С - повна площа поверхні, задана спочатку, V (a, h1, h2) = 4 / 3 ∙ a2 ∙ h2 +7 / 3 ∙ h1 ∙ a2, S (a, h1, h2) = 6 ∙ a ∙ h1 +4 ∙ h2 ∙ a. Задача була вирішена методом правильного тривимірного симплекса. Ми бачимо, що при збільшенні значення параметра штрафу, значення функції зменшується (погіршується), а при зменшенні - збільшується (поліпшується). 4. Симплекс таблиці Для його застосування необхідно, щоб знаки в обмеженнях були виду «менше або дорівнює», а компоненти вектора b - позитивні. Алгоритм рішення зводиться до наступного: Приведення системи обмежень до канонічного виду шляхом введення додаткових змінних для приведення нерівностей до рівності. Якщо у вихідній системі обмежень були присутні знаки «дорівнює» або «більше або дорівнює», то в зазначені обмеження додаються штучні змінні, які так само вводяться і в цільову функцію зі знаками, що визначаються типом оптимуму. Формується симплекс-таблиця. Розраховуються симплекс-різниці. Приймається рішення про закінчення або продовженні рахунку. При необхідності виконуються ітерації. 7 На кожній ітерації визначається вектор, що вводиться в базис, і вектор, виведений з базису. Перераховується таблиця. Дана функція виду: f (x) = 4x1 +2 x2 Підберемо k геометричним способом рішення так, щоб область допустимих значень була п'ятикутником. k = 7 Малюнок - 16 Область допустимих значень Наведемо запис завдання лінійного програмування до стандартної форми, введемо нових змінних, всі обмеження крім обмеження на знак представимо у вигляді рівності, тоді ця задача набуде вигляду. 4у1 +2 у2 +0 +0 у3 у4 +0 У5 = (0, 0, 8, 12, 7) - початкові допустимі базисні рішення Маючи початковий базис, складаємо симплекс таблицю для нульової ітерації. Ітерація | Базисна змінна | Значення | у1 | у2 | у3 | у4 | У5 | 0 | у3 | 8 | 1 | 2 | 1 | 0 | 0 |
| У4 | 12 | 4 | 1 | 0 | 1 | 0 |
| У5 | 7 | 2 | 1 | 0 | 0 | 1 |
| -F | 0 | 4 | 2 | 0 | 0 | 0 |
Вводимо в базис у1, а виводимо з базису у4.
| Базисна змінна | Значення | у1 | у2 | у3 | у4 | У5 | 1 | У3 | 5 | 0 | 1,75 | 1 | -0,25 | 0 |
| У1 | 3 | 1 | 0,25 | 0 | 0,25 | 0 |
| У5 | 1 | 0 | 0,5 | 0 | -0,5 | 1 |
| -F | -12 | 0 | 1 | 0 | -1 | 0 |
Вводимо в базис у2, а виводимо з базису У5. Ітерація | Базисна змінна | Значення | у1 | у2 | у3 | у4 | У5 | 2 | У3 | 1,5 | 0 | 0 | 1 | -2 | -3,5 |
| У1 | 2,5 | 1 | 0 | 0 | 0,5 | -0,5 |
| У2 | 2 | 0 | 1 | 0 | -1 | 2 |
| -F | -14 | 0 | 0 | 0 | 0 | -2 |
Т.к. f <0, то зупиняємося на другий ітерації. Виходячи з графіка ОДЗ, можна визначити, що оптимальним рішенням є відрізок прямої , Що входить в ОДЗ, перевіримо: 2,5 * 2 +2 = 7. x1 = 2,5, x2 = 2 f (x) = 14. Висновок Метою даного курсового проекту було вивчення методів оптимізації функції. Методів одномірної оптимізації: метод дихотомії, золотого перерізу; багатовимірної безумовної оптимізації: покоординатного циклічний спуск, метод Хука - Дживса, правильний симплекс, деформований симплекс, а також методів умовної оптимізації Метод перетворення цільової функції, метод штрафних функцій, табличний симплекс - метод. Список використаної літератури А. Г. Трифонов. Постановка задачі оптимізації і чисельні методи її вирішення; Б. Банді. Методи оптимізації. Вступний курс., 1988; Мендікенов К.К. Лекції
Додаток А using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace lab1 { public partial class Form1: Form { class global { private global () {} public static double a = 0.64; public static double b = 1.77; public static double e = 0.0001; public static double al = 0.00001; public static double x = 0; public static double y = 0; public static int iter = 0; } public Form1 () {InitializeComponent ();} private void textBox1_TextChanged (object sender, EventArgs e) {Global.e = Convert.ToDouble (textBox1.Text);} private void textBox2_TextChanged (object sender, EventArgs e) {Global.al = Convert.ToDouble (textBox2.Text);} public double F (double x) {Return (Math.Pow ((2.5 - x), 2) + 3.1 * x);} public double Z (double x, double y) {Return (2.5 * Math.Pow (x, 2) + 2 * x * y + 3.1 * Math.Pow (y, 2) -2 * x-3 * y);} public double Dixotom () { global.iter = 1; global.a = Convert.ToDouble (textBox4.Text); global.b = Convert.ToDouble (textBox3.Text); richTextBox1.Text = richTextBox1.Text + "a =" + Convert.ToString (global.a) + "; b =" + Convert.ToString (global.b) + (char) 13; while (true) { double x1 = (global.a + global.b) / 2-global.al; double x2 = (global.a + global.b) / 2 + global.al; if (F (x1) <F (x2)) global.b = x2; else global.a = x1; richTextBox1.Text = richTextBox1.Text + Convert.ToString (global.iter) + ") x1 =" + Convert.ToString (x1) + "; x2 =" + Convert.ToString (x2) + "; f (x1) = "+ Convert.ToString (F (x1)) +"; f (x2) = "+ Convert.ToString (F (x2)) +"; a = "+ Convert.ToString (global.a) +"; b = "+ Convert.ToString (global.b) + (char) 13; global.iter + +; if (Math.Abs (global.b - global.a) <global.e) break; } Return (global.a + global.b) / 2; } public double Zolot () {Global.iter = 1; global.a = Convert.ToDouble (textBox4.Text); global.b = Convert.ToDouble (textBox3.Text); richTextBox1.Text = richTextBox1.Text + "a =" + Convert.ToString (global.a) + "; b =" + Convert.ToString (global.b) + (char) 13; double x2 = global.a +0.618 * (global.b - global.a); double x1 = global.a + (1-0.618) * (global.b - global.a); while (true) { if (Math.Abs (global.b - global.a) <global.e) break; richTextBox1.Text = richTextBox1.Text + Convert.ToString (global.iter) + ") a =" + Convert.ToString (global.a) + "; b =" + Convert.ToString (global.b) + "; x1 = "+ Convert.ToString (x1) +"; x2 = "+ Convert.ToString (x2) +"; f (x1) = "+ Convert.ToString (F (x1)) +"; f (x2) = " + Convert.ToString (F (x2)) + (char) 13; if (F (x2)> F (x1)) {Global.b = x2; x2 = x1; x1 = global.a + 0.372 * (global.b - global.a);} else {global.a = x1; x1 = x2; x2 = global.a + 0.618 * (global.b - global.a);} global.iter + +; } return (global.a + global.b) / 2; } private void button1_Click (object sender, EventArgs e) {RichTextBox1.Text = ""; global.al = Convert.ToDouble (textBox2.Text); global.e = Convert.ToDouble (textBox1.Text); if (radioButton1.Checked) global.x = Dixotom (); if (radioButton2.Checked) global.x = Zolot (); label2.Text = "Мінімум: x *=" + Convert.ToString (global.x) + "; y (x *) =" + Convert.ToString (F (global.x)) + ", число ітерацій: "+ Convert.ToString (global.iter-1); } public void Spusk (double x, double y) { while (true) / / йдемо вправо {X = x + global.al; if (Z (x, y)> Z (x - global.al, y)) break; global.iter + +; richTextBox2.Text = richTextBox2.Text + Convert.ToString (global.iter) + ") x =" + Convert.ToString (x) + "; y =" + Convert.ToString (y) + "; z (x, y ) = "+ Convert.ToString (Z (x, y)) +"; al = "+ Convert.ToString (global.al) + (char) 13; x = x - global.al; / / повертаємося на невдалий крок while (true) / / йдемо вліво {X = x - global.al; if (Z (x, y)> Z (x + global.al, y)) break; global.iter + +; richTextBox2.Text = richTextBox2.Text + Convert.ToString (global.iter) + ") x =" + Convert.ToString (x) + "; y =" + Convert.ToString (y) + "; z (x, y ) = "+ Convert.ToString (Z (x, y)) +"; al = "+ Convert.ToString (global.al) + (char) 13;} x = x + global.al; / / повертаємося на невдалий крок global.x = x; global.y = y; SpuskV (x, y); } public void SpuskV (double x, double y) { while (true) / / йдемо вгору {Y = y + global.al; if (Z (x, y)> Z (x, y - global.al)) break; global.iter + +; richTextBox2.Text = richTextBox2.Text + Convert.ToString (global.iter) + ") x =" + Convert.ToString (x) + "; y =" + Convert.ToString (y) + "; z (x, y ) = "+ Convert.ToString (Z (x, y)) +"; al = "+ Convert.ToString (global.al) + (char) 13;} y = y - global.al; / / повертаємося на невдалий крок while (true) / / йдемо вниз {Y = y - global.al; if (Z (x, y)> Z (x, y + global.al)) break; global.iter + +; richTextBox2.Text = richTextBox2.Text + Convert.ToString (global.iter) + ") x =" + Convert.ToString (x) + "; y =" + Convert.ToString (y) + "; z (x, y ) = "+ Convert.ToString (Z (x, y)) +"; al = "+ Convert.ToString (global.al) + (char) 13;} y = y + global.al; / / повертаємося на невдалий крок global.x = x; global.y = y; if (global.al / 2> global.e) {global.al = global.al / 2; Spusk (x, y);} } public void Hyg (double x, double y) {While (true) {Int min = Vibor (x, y); if (min == 1) {x = x + 2 * global.e; y = y + 2 * global.e; if (Z (x - 2 * global.e, y - 2 * global.e) <Z (x, y)) break;} if (min == 2) {x = x - 2 * global.e; y = y + 2 * global.e; if (Z (x + 2 * global.e, y - 2 * global.e) <Z (x, y)) break;} if (min == 3) {x = x - 2 * global.e; y = y - 2 * global.e; if (Z (x + 2 * global.e, y + 2 * global.e) <Z (x, y)) break;} if (min == 4) {x = x + 2 * global.e; y = y - 2 * global.e; if (Z (x - 2 * global.e, y + 2 * global.e) <Z (x, y)) break;} global.iter + +; richTextBox2.Text = richTextBox2.Text + Convert.ToString (global.iter) + ") x =" + Convert.ToString (x) + "; y =" + Convert.ToString (y) + "; z (x, y ) = "+ Convert.ToString (Z (x, y)) + (char) 13;} global.x = x; global.y = y; } public int Vibor (double x, double y) {Int min = 0; if (Z (x + global.e, y + global.e) <Z (x, y)) min = 1; if (Z (x + global.e, y - global.e) <Z (x, y)) min = 2; if (Z (x - global.e, y - global.e) <Z (x, y)) min = 3; if (Z (x - global.e, y + global.e) <Z (x, y)) min = 4; return min;} public void Sym (double x, double y) {Double x0 = x; double y0 = y; double x1 = x0 + global.al; double y1 = y0; double x2 = x0 + (global.al) / 2; double y2 = y0 + global.al * Math.Sin (60); richTextBox2.Text = richTextBox2.Text + Convert.ToString (global.iter) + ") z (x0, y0) =" + Convert.ToString (Z (x0, y0)) + "z (x1, y1) =" + Convert.ToString (Z (x1, y1)) + "z (x2, y2) =" + Convert.ToString (Z (x2, y2)) + "al =" + Convert.ToString (global.al) + (char ) 13; while (true) {/ / Пошук найменшого double mx0 = x0; double my0 = y0; double mx1 = x1; double my1 = y1; double mx2 = x2; double my2 = y2; double z1 = Z (mx0, my0); double z2 = Z (mx1, my1); double z3 = Z (mx2, my2); if ((z1 <z2) & & (z2 <z3) & & (z3> z1)) {x0 = mx0; x1 = mx1; x2 = mx2; y0 = my0; y1 = my1; y2 = my2;} if ((z1 <z2) & & (z2> z3) & & (z3> z1)) {x0 = mx0; x1 = mx2; x2 = mx1; y0 = my0; y1 = my2; y2 = my1;} if ((z1> z2) & & (z2 <z3) & & (z3 <z1)) {x0 = mx1; x1 = mx2; x2 = mx0; y0 = my1; y1 = my2; y2 = my0;} if ((z1> z2) & & (z2 <z3) & & (z3> z1)) {x0 = mx1; x1 = mx0; x2 = mx2; y0 = my1; y1 = my0; y2 = my2;} if ((z1 <z2) & & (z2> z3) & & (z3 <z1)) {x0 = mx2; x1 = mx0; x2 = mx1; y0 = my2; y1 = my0; y2 = my1;} if ((z1> z2) & & (z2> z3) & & (z3 <z1)) {x0 = mx2; x1 = mx1; x2 = mx0; y0 = my2; y1 = my1; y2 = my0;} / / Перевірка на вихід if (global.al <= global.e) break; while (true) {/ / Відображення відносно 3 double kx = (x0 + x1)-x2; double ky = (y0 + y1) - y2; if (Z (x2, y2)> Z (kx, ky)) {x2 = kx; y2 = ky; global.iter + +; break;} / / Відображення відносно 2 kx = (x0 + x2) - x1; ky = (y0 + y2) - y1; if (Z (x1, y1)> Z (kx, ky)) {x1 = kx; y1 = ky; global.iter + +; break;} / / Відображення відносно 1 kx = (x1 + x2) - x0; ky = (y1 + y2) - y0; if (Z (x0, y0)> Z (kx, ky)) {x0 = kx; y0 = ky; global.iter + +; break;} / / Зменшуємо трикутник global.al = global.al / 2; x1 = (x0 + x1) / 2; y1 = (y0 + y1) / 2; x2 = (x0 + x2) / 2; y2 = (y0 + y2) / 2; } richTextBox2.Text = richTextBox2.Text + Convert.ToString (global.iter) + ") x0 =" + Convert.ToString (x0) + "x1 =" + Convert.ToString (x1) + "x2 =" + Convert.ToString (x2) + "; y0 =" + Convert.ToString (y0) + "y1 =" + Convert.ToString (y1) + "y2 =" + Convert.ToString (y2) + "z (x0, y0) =" + Convert.ToString (Z (x0, y0)) + "z (x1, y1) =" + Convert.ToString (Z (x1, y1)) + "z (x2, y2) =" + Convert.ToString (Z (x2, y2)) + "al =" + Convert.ToString (global.al) + (char) 13;} global.x = x0; global.y = y0;} private void button2_Click (object sender, EventArgs e) {Global.iter = 0; global.al = Convert.ToDouble (textBox7.Text); global.e = Convert.ToDouble (textBox8.Text); if (radioButton4.Checked) {Spusk (Convert.ToDouble (textBox6.Text), Convert.ToDouble (textBox5.Text));} if (radioButton3.Checked) Hyg (Convert.ToDouble (textBox6.Text), Convert.ToDouble (textBox5.Text)); if (radioButton5.Checked) Sym (Convert.ToDouble (textBox6.Text), Convert.ToDouble (textBox5.Text)); label9.Text = "Мінімум: (" + Convert.ToString (global.x) + ";" + Convert.ToString (global.y) + "f (x, y) =" + Convert.ToString (Z (global. x, global.y)) + "), число ітерацій: "+ Convert.ToString (global.iter);}}} Додаток Б procedure TForm1.Button1Click (Sender: TObject); begin a: = false; l: = 0.05; al: = 1; e: = 0.01; gm: = 2; bt: = 0.5; x: = 1.16166; y: = 1.15185; iter: = 0; xl: = x; yl: = y; xg: = xl + l; yg: = yl; xh: = xl + l / 2; yh: = yl + l * Sin (60); Sym (x, y); ZZ (x, y); / / вважаємо значення функції в знайденої точці end; procedure TForm1.Sym (x, y: real); label ext, B; begin / / Пошук найменшого B: mx0: = xl; my0: = yl; mx1: = xg; my1: = yg; mx2: = xh; my2: = yh; ZZ (mx0, my0); z1: = z; ZZ (mx1, my1); z2: = z; ZZ (mx2, my2); z3: = z; if ((z1 <z2) and (z2 <z3) and (z3> z1)) then begin xl: = mx0; xg: = mx1; xh: = mx2; yl: = my0; yg: = my1; yh: = my2; end; if ((z1 <z2) and (z2> z3) and (z3> z1)) then begin xl: = mx0; xg: = mx2; xh: = mx1; yl: = my0; yg: = my2; yh: = my1; end; if ((z1> z2) and (z2 <z3) and (z3 <z1)) then begin xl: = mx1; xg: = mx2; xh: = mx0; yl: = my1; yg: = my2; yh: = my0; end; if ((z1> z2) and (z2 <z3) and (z3> z1)) then begin xl: = mx1; xg: = mx0; xh: = mx2; yl: = my1; yg: = my0; yh: = my2; end; if ((z1 <z2) and (z2> z3) and (z3 <z1)) then begin xl: = mx2; xg: = mx0; xh: = mx1; yl: = my2; yg: = my0; yh: = my1; end; if ((z1> z2) and (z2> z3) and (z3 <z1)) then begin xl: = mx2; xg: = mx1; xh: = mx0; yl: = my2; yg: = my1; yh: = my0; end; Richedit1.Lines.Add (IntToStr (iter)); Richedit1.Lines.Add (FloatToStr (xl) + '' + FloatToStr (yl) + '' + FloatToStr (zl)); Richedit1.Lines.Add (FloatToStr (xg) + '' + FloatToStr (yg) + '' + FloatToStr (zg)); Richedit1.Lines.Add (FloatToStr (xh) + '' + FloatToStr (yh) + '' + FloatToStr (zh)); Richedit1.Lines.Add (''); x0: = (xl + xg) / 2; y0: = (yl + yg) / 2; xr: = (1 + al) * x0-al * xh; yr: = (1 + al) * y0-al * yh; ZZ (xl, yl); zl: = z; ZZ (xg, yg); zg: = Z; ZZ (xh, yh); zh: = z; ZZ (xr, yr); zr: = z; if zr <zl then {1} begin / / Розтягнення xe: = gm * xr + (1-gm) * x0; ye: = gm * yr + (1-gm) * y0; ZZ (xe, ye); ze: = z; if ze <zl then {2} begin xh: = xe; yh: = ye; ZZ (xh, yh); zh: = z; xl: = gm * xl + (1-gm) * x0; yl: = gm * yl + (1-gm) * y0; ZZ (xl, yl); zl: = z; xg: = gm * xg + (1-gm) * x0; yg: = gm * yg + (1-gm) * y0; ZZ (xg, yg); zg: = z; Shod (xl, xg, xh, yl, yg, yh); if a = true then goto ext else begin inc (iter); goto B; end; {2} end else {3} begin xh: = xr; yh: = yr; ZZ (xh, yh); zh: = z; Shod (xl, xg, xh, yl, yg, yh); if a = true then goto ext else begin inc (iter); goto B; end; {3} end; {1} end; if ((zr> zl) and (zr <= zg)) then begin xh: = xr; yh: = yr; ZZ (xh, yh); zh: = z; Shod (xl, xg, xh, yl, yg, yh); if a = true then goto ext else begin inc (iter); goto B; end; end; if ((zr> zl) and (zr> zg)) then {4E} begin if zr <zh then begin xh: = xr; yh: = yr; ZZ (xh, yh); zh: = z; end; / / Стиснення xc: = bt * xh + (1-bt) * x0; yc: = bt * yh + (1-bt) * y0; ZZ (xc, yc); zc: = z; if zc <xh then {5 Ж} begin xh: = xc; yh: = yc; ZZ (xh, yh); zh: = z; xl: = bt * xl + (1-bt) * x0; yl: = bt * yl + (1-bt) * y0; ZZ (xl, yl); zl: = z; xg: = bt * xg + (1-bt) * x0; yg: = bt * yg + (1-bt) * y0; ZZ (xg, yg); zg: = z; Shod (xl, xg, xh, yl, yg, yh); if a = true then goto ext else begin inc (iter); goto B; end; {5} end {6 З} else begin / / Зменшення l: = l / 2; xh: = (xl + xh) / 2; xh: = (xl + xh) / 2; ZZ (xh, yh); zh: = z; xg: = (xl + xg) / 2; yg: = (yl + yg) / 2; ZZ (xg, yg); zg: = z; {6} end; Shod (xl, xg, xh, yl, yg, yh); if a = true then goto ext else begin inc (iter); goto B; end; {4} end; ext: Richedit1.Lines.Add (FloatToStr (xl)); Richedit1.Lines.Add (FloatToStr (yl)); Richedit1.Lines.Add (FloatToStr (zl)); Richedit1.Lines.Add (IntToStr (iter)); end; procedure TForm1.ZZ (x, y: real); begin z: = 2.5 * x * x + 2 * x * y + 3.1 * y * y -2 * x-3 * y; end; procedure TForm1.Shod (xl, xg, xh, yl, yg, yh: real); var sigma: real; begin ZZ (xl, yl); zl: = z; ZZ (xg, yg); zg: = Z; ZZ (xh, yh); zh: = z; sigma: = sqrt ((sqr (zl-((zl + zg + zh) / 2 +1)) + sqr (zl-((zl + zg + zh) / 2 +1)) + sqr (zg-(( zl + zg + zh) / 2 +1)) + sqr (zh-((zl + zg + zh) / 2 +1))) / 3); if sigma <e then a: = true; end; Додаток В unit Unit1; type procedure Button1Click (Sender: TObject); procedure ZZ (x, y, z: real); procedure Sym (x, y, z: real); end; var X, y, z: real; z_: real; / / значення функції iter: integer; / / число ітерацій s, gm, x0, x1, x2, x3: real; / / координати точок y0, y1, y2, y3: real; z0, z1, z2, z3: real; / / трикутника al, e: real; / / довжина сторони сімплікса (трикутника) kx, ky, kz, zz1, zz2: real; / / координати точки k a, b: boolean; / / для циклу implementation procedure TForm1.Sym (x, y, z: real); label l; var a: array [1 .. 4,1 .. 4] of real; / / z () xyz; 1234 k, i: integer; buf: real; changed: boolean; {1} begin x0: = x; y0: = y; z0: = z; x1: = x0 + al; y1: = y0; z1: = z; x2: = x0 + al / 2; y2: = y0 + al * Sin (60); z2: = z; x3: = x0 + al / 2; y3: = y0; z3: = z0 + al * Sin (60); while (true) do / / For i: = 1 to 100 do {2} begin ZZ (x0, y0, z0); a [1,1]: = z_; a [2,1]: = x0; a [3,1]: = y0; a [4,1]: = z0; ZZ (x1, y1, z1); a [1,2]: = z_; a [2,2]: = x1; a [3,2]: = y1; a [4,2]: = z1; ZZ (x2, y2, z2); a [1,3]: = z_; a [2,3]: = x2; a [3,3]: = y2; a [4,3]: = z2; ZZ (x3, y3, z3); a [1,4]: = z_; a [2,4]: = x3; a [3,4]: = y3; a [4,4]: = z3; / / Сортування repeat changed: = FALSE; for k: = 1 to 3 do if a [1, k]> a [1, k +1] then begin buf: = a [1, k]; a [1, k]: = a [1, k +1]; a [1, k +1]: = buf; buf: = a [2, k]; a [2, k]: = a [2, k +1]; a [2, k +1]: = buf; buf: = a [3, k]; a [3, k]: = a [3, k +1]; a [3, k +1]: = buf; buf: = a [4, k]; a [4, k]: = a [4, k +1]; a [4, k +1]: = buf; changed: = TRUE; end; until not changed; x0: = a [2,1]; y0: = a [3,1]; z0: = a [4,1]; x1: = a [2,2]; y1: = a [3,2]; z1: = a [4,2]; x2: = a [2,3]; y2: = a [3,3]; z2: = a [4,3]; x3: = a [2,4]; y3: = a [3,4]; z3: = a [4,4]; ZZ (x3, y3, z3); / / Перевірка на вихід if (al <= e) or (z_ <0) then break; while (true) do {3} begin / / Відображення відносно 0 kx: = 2 / 3 * (x2 + x1 + x3)-x0; ky: = 2 / 3 * (y2 + y1 + y3)-y0; kz: = 2 / 3 * (z2 + z1 + z3)-z0 ; ZZ (x0, y0, z0); zz1: = z_; ZZ (kx, ky, kz); zz2: = z_; if (z_ <0) then goto l; if (zz1 <zz2) and (kx> 0) and (ky> 0) and (kz> 0) and ((6 * kx * ky +4 * kz * kx) <= s) then begin x0: = kx; y0: = ky; z0: = kz; inc (iter); break; end; / / Відображення відносно 1 kx: = 2 / 3 * (x2 + x0 + x3)-x1; ky: = 2 / 3 * (y2 + y0 + y3)-y1; kz: = 2 / 3 * (z2 + z0 + z3)-z1 ; ZZ (x1, y1, z1); zz1: = z_; ZZ (kx, ky, kz); zz2: = z_; if (z_ <0) then goto l; if (zz1 <zz2) and (kx> 0) and (ky> 0) and (kz> 0) and ((6 * kx * ky +4 * kz * kx) <= s) then begin x1: = kx; y1: = ky; z1: = kz; inc (iter); break; end; / / Відображення відносно 2 kx: = 2 / 3 * (x0 + x1 + x3)-x2; ky: = 2 / 3 * (y0 + y1 + y3)-y2; kz: = 2 / 3 * (z0 + z1 + z3)-z2 ; ZZ (x2, y2, z2); zz1: = z_; ZZ (kx, ky, kz); zz2: = z_; if (z_ <0) then goto l; if (zz1 <zz2) and (kx> 0) and (ky> 0) and (kz> 0) and ((6 * kx * ky +4 * kz * kx) <= s) then begin x2: = kx; y2: = ky; z2: = kz; inc (iter); break; end; / / Відображення відносно 3 kx: = 2 / 3 * (x2 + x1 + x0)-x3; ky: = 2 / 3 * (y2 + y1 + y0)-y3; kz: = 2 / 3 * (z2 + z1 + z0)-z3 ; ZZ (x3, y3, z3); zz1: = z_; ZZ (kx, ky, kz); zz2: = z_; if (z_ <0) then goto l; if (zz1 <zz2) and (kx> 0) and (ky> 0) and (kz> 0) and ((6 * kx * ky +4 * kz * kx) <= s) then begin x3: = kx; y3: = ky; z3: = kz; inc (iter); break; end; / / Зменшуємо трикутник al: = al / 2; x1: = x0 + al; y1: = y0; z1: = z0; x2: = x0 + al / 2; y2: = y0 + al * Sin (60); z2: = z0; x3: = x0 + al / 2; y3: = y0; z3: = z0 + al * Sin (60); break; inc (iter); {3} end; {2} end; l: x: = x3; y: = y3; {1} end; procedure TForm1.ZZ (x, y, z: real); begin z_: = (4 / 3 * x * x * z +7 / 3 * y * x * x)-gm * sqr (s-(6 * x * y +4 * z * x)); end; procedure TForm1.Button1Click (Sender: TObject); begin RichEdit1.Text :=''; iter: = 0; gm: = StrToFloat (Edit1.Text); s: = StrToFloat (Edit2.Text); al: = 0.05; e: = 0.01; x: = StrToFloat (Edit3.Text); y: = StrToFloat (Edit4.Text); z: = StrToFloat (Edit5.Text); Sym (x, y, z); ZZ (x3, y3, z3); / / вважаємо значення функції в знайденої точці RichEdit1.Text: = RichEdit1.Text + 'Кількість ітерацій '+ IntToStr (iter) + # 13; RichEdit1.Text: = RichEdit1.Text + 'x3 =' + FloatToStr (x1) + '; y3 =' + FloatToStr (y1) + 'z3 =' + FloatToStr (z1) + # 13; ZZ (x3, y3, z3); RichEdit1.Text: = RichEdit1.Text + 'f (x, y, z) =' + FloatToStr (z_) +'('+ FloatToStr (6 * x3 * y3 +4 * z3 * x )+')'+ # 13; end; end.
Додати в блог або на сайт
Цей текст може містити помилки. Математика | Курсова 191.1кб. | скачати
Схожі роботи: Порівняльний аналіз методів господарського обліку Дослідження методів оптимізації Аналіз оптимізації оподаткування Формування портфеля цінних паперів і аналіз його прибутковості порівняльний аналіз Аналіз витрат підприємства торгівлі та шляхи їх оптимізації Аналіз та шляхи оптимізації характеристик навчання споживачів Аналіз ефективності інвестиційних проектів і проблеми оптимізації капіталовкладень Аналіз фінансового стану комерційного банку шляхи його оптимізації Аналіз та шляхи оптимізації діяльності членів екіпажу ПС в конкретній ситуації в польоті
|