Таке завдання оптимізації, крім цільової функції, включає додаткові умови у вигляді обмежень і граничних умов.
На малюнку 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)
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)
} 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)
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)
if (min == 2) {x = x - 2 * global.e; y = y + 2 * global.e; if (Z (x + 2 * global.e, y - 2 * global.e)
if (min == 3) {x = x - 2 * global.e; y = y - 2 * global.e; if (Z (x + 2 * global.e, y + 2 * global.e)
if (min == 4) {x = x + 2 * global.e; y = y - 2 * global.e; if (Z (x - 2 * global.e, y + 2 * global.e)
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)
if (Z (x + global.e, y - global.e)
if (Z (x - global.e, y - global.e)
if (Z (x - global.e, y + global.e)
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 z1)) {x0 = mx0; x1 = mx1; x2 = mx2; y0 = my0; y1 = my1; y2 = my2;}
if ((z1 z3) & & (z3> z1)) {x0 = mx0; x1 = mx2; x2 = mx1; y0 = my0; y1 = my2; y2 = my1;}
if ((z1> z2) & & (z2
if ((z1> z2) & & (z2 z1)) {x0 = mx1; x1 = mx0; x2 = mx2; y0 = my1; y1 = my0; y2 = my2;}
if ((z1 z3) & & (z3
if ((z1> z2) & & (z2> z3) & & (z3
/ / Перевірка на вихід
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 z1)) then begin xl: = mx0; xg: = mx1; xh: = mx2; yl: = my0; yg: = my1; yh: = my2; end;
if ((z1 z3) and (z3> z1)) then begin xl: = mx0; xg: = mx2; xh: = mx1; yl: = my0; yg: = my2; yh: = my1; end;
if ((z1> z2) and (z2
if ((z1> z2) and (z2 z1)) then begin xl: = mx1; xg: = mx0; xh: = mx2; yl: = my1; yg: = my0; yh: = my2; end;
if ((z1 z3) and (z3
if ((z1> z2) and (z2> z3) and (z3
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
{1} begin
/ / Розтягнення
xe: = gm * xr + (1-gm) * x0; ye: = gm * yr + (1-gm) * y0; ZZ (xe, ye); ze: = z;
if ze
{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
/ / Стиснення
xc: = bt * xh + (1-bt) * x0; yc: = bt * yh + (1-bt) * y0; ZZ (xc, yc); zc: = z;
if zc
{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
Додаток В
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 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 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 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 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.