МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра автоматизованих систем управління
Лабораторна робота №1
з дисципліни “Моделювання систем”
на тему
«ОПТИМАЛЬНЕ КЕРУВАННЯ ПРОЦЕСАМИ З ЗАСТОСУВАННЯМ
МЕТОДУ ЛІНІЙНОГО ПРОГРАМУВАННЯ»
Мета роботи: вивчення і застосування методу лінійного програмування для рішення задач оптимального керування, у яких цільова функція, модель процесу й обмеження є лінійними функціями.
ТЕОРЕТИЧНІ ПОЛОЖЕННЯ
Лінійне програмування - розділ математичного програмування, що вивчає задачу знаходження максимуму (мінімуму) лінійної функції при лінійних обмеженнях у виді рівностей або нерівностей. Загальна задача лінійного програмування формулюється так: потрібно знайти максимум лінійної функції n змінних х1,х2, ... ,хn
/1/
при обмеженнях
, i=1,2,…,m /2/
, j=1,2,…,n. /3/
де G - цільова функція, kj (j=1,…,n). aij (i=1,…,n; j=1,…,n), bi (i=1,…,m) - задане число. Задача мінімізації цільової функції /1/ зводиться до задачі максимізації шляхом заміни знаків усіх коефіцієнтів kj, на протилежні.
Найбільше поширеним прикладом задачі лінійного програмування є задача планування роботи підприємства, що випускає деякий однорідний продукт. Ця задача ставиться наступним чином: є n різноманітних технологій і m ресурсів (робоча сила, сировина, енергія, транспорт і т.д.) виробництва. Відомі: kj - кількість одиниць продукту, що можна одержати при використанні j-ї технології в одиницю часу (j=1,...n), аij - виграти і-го ресурсу при використанні j-ї технології (і=1,...,m); (j=1,...,n), bi - загальний запас і-го ресурсу (і=1,...,m), хj - час, протягом якого виробництво ведеться по j-й технології.
Потрібно відшукати план Х=(x1, x2,..., хn), при якому з наявних запасів випускалася б максимальна кількість продукту, тобто G=>тах.
Призначення моделей фізичних процесів при рішенні питання оптимізації складається у встановленні зв'язків між змінними стану і змінними керування, причому оптимізується завжди цільова функція, а не модель процесу. Цільова функція і обмеження звичайно є функціями як змінних стану, так і змінних керування. Визначення цільової функції і перебування її екстремального значення є суттю проблеми оптимізації. На відміну від моделей фізичних процесів цільові функції звичайно виражають нефізичні величини, наприклад, прибуток, вартість, якість і т.п.
У найпростішому випадку цільова функція, модель фізичного процесу й обмеження є лінійними функціями. Оптимальне керування в задачах такого роду може бути знайдене за допомогою методу лінійного програмування.
Розглянемо лінійну цільову функцію з одною змінною і одною змінною стану:
F(у,х)=А+Вх+Су, /4/
де Х - змінна керування, у - змінна стану. Нехай при цьому лінійна модель фізичного процесу виражається як
у=D+Ех, /5/
де А, В, С,D, Е - задані числа.
Підставивши /5/ в /4/, одержимо цільову функцію, що залежить тільки від змінної керування
G(х)=А+Вх+СD+СEх /6/
або
G(х)=К0+К1X, /7/
де
К0=А+СD; К1=В+СЕ.
Лінійні цільові функції при відсутності обмеженні не мають кінцевого оптимуму. Тому в задачах оптимізації цільової функції обмеження грають принципову роль.
Оптимальне керування з лінійною цільовою функцією при наявності лінійних обмежень можна уявити як задачу оптимізації функції
/8/
при обмеженнях
; j=1,…,n /9/
; j=1,…,n /10/
де Rін і Rjb - нижня і верхня границі обмеження j-ї змінної керування; Qін, Qib ocі - нижня і верхня границі і-го обмеження на змінні стану, виражені у вигляді залежності між змінними керування; Kij - позитивна константа.
Нижня межа змінної керування, як правило, дорівнює нулю, а верхня границя є її фізичною границею (наприклад, цілком відкритий клапан).
Обмеження, що накладаються на межі зміни змінних керування, можна висловити у виді рівностей за допомогою введення позитивних допоміжних змінних:
Xj+Zj=Кjb; Хj-2j=Кjн.
Розмір Хj знаходиться на границі обмежень, коли Zjb=0 або Zjн=0.
Нерівність /10/ можна перетворити в рівність за допомогою введення допоміжних позитивних змінних Wib і Wiн:
;
;
Наприклад, для цільової функції з двома змінними керування таке обмеження, що накладається на кожну з змінних керування, можна висловити таким чином:
;
;
Вважаючи W1B=0, а потім W1н=0, можна отримати границі обмежень:
/11/
для роботи на верхній границі і
/12/
для роботи на нижній границі.
На мал.1 рівняння /11/ і /12/ представлені у вигляді прямих із кутовими коефіцієнтом - k1(k2). Лінія верхнього обмеження перетинає вісь Х2 в точці МB(0, Q1B/К2), у лінія нижнього обмеження - в точці Мн(0, Q1н/К2). На мал.2 показаний випадок трьох обмежень, що виражають залежність між змінними керування, нанесеними на площину (Х1,Х2). Областю можливих значень є ділянка (А, В, С, D, Е, F) оскільки він відповідає всім трьом обмеженням. Обмеження границь зміни змінних керування забезпечують невід'ємність величин Х1 і Х2.
Обмеження, що виражають залежність між змінними керування, можуть іноді взагалі заборонити будь-яке рішення. Так могло б трапитися, наприклад, якби нижня границя 3-го обмеження (Мал.2) розташувалася вище точки С.
Лініями рівного рівня цільових функцій є лінії, що з'єднують точки, у яких значення цільової функції рівні між собою. Для лінійної цільової функції з двома змінними керування.
лінії рівного рівня, нанесені на площину (Х1,Х2), являють собою множину паралельних прямих ліній:
, r=1,2....,8
або
Відрізком, що відганяється кожною r-ю прямою на осі X2, є (Lr-К0)/К2, а її кутовий коефіцієнт дорівнює – К1/К2.
Розглядаючи область обмеження і лінії рівного рівня цільової функції, легко зауважити, що максимум (або мінімум) цільовій функції знаходиться на одному з перетинів ліній обмеження і цільової функції. Наприклад, на мал.3 областю допустимих значень змінних керування є, ділянка АВСDEF, причому максимум досягається в точці С, а мінімум у точці F. Оптимум може бути знайдений обчисленням значень цільової функції в різноманітних вершинах області обмежень.
Таким чином, сукупність будь-якого числа лінійних обмежень виділяє в n-мірному просторі X1,Х2,...,Хn деякий опуклий багатогранник, що є областю допустимих значень змінних керування. Екстремум цільової функції досягається, як правило, в одній з його вершин. Проте навіть у порівняно простих задачах кількість вершин багатогранника може обчислюватися мільйонами або мільярдами. Перебрати таку величезну кількість вершин і зазначити ту, в якій значення цільової функції максимальне (або мінімальне), практично неможливо навіть при великій швидкодії ЕОМ керування процесом. Застосування методу лінійного програмування дозволяє швидко знаходити екстремум цільової функції, відмовившись від повного перебору усіх вершин.
Якщо кількість змінних керування більше двох або трьох, то для рішення задач лінійного програмування зручно використовувати ітераційну процедуру, що іменується сиплекс-методом [1].
Завданння
Варіант 3
Цільова функція
Модель процесу
Обмеження
Перетворення
F(x,y)= 49x1-7x2
Обмеженя
Визначення максимуму
Розв’язок :
Крок 1
Розглянемо нерівність 1 системи обмежень.
x212
Побудуємо пряму.
Замінимо знак нерівності на знак рівності.
x2 = 12
Пряма проходить паралельно осі X1.
Які точки нас цікавлять?
x212
Знак нерівності менше або дорівнює нуля, отже, нас цікавлять точки які лежать нижче побудованої нами прямої.
Область допустимих значень виділена штрихуванням.
Точки які належать області допустимих значень: A (0, 0),B (0, 12)
Крок 2
Розглянемо нерівність 2 системи обмежень.
x1- x2-10
Побудуємо пряму.
Замінимо знак нерівності на знак рівності.
x1- x2=-10
Кожен член рівняння помножимо на -1.
- x1+ x2=10
На осі X1 малюємо точку з координатою -10.
На осі X2 малюємо точку з координатою 10.
З'єднуємо отримані точки і отримуємо необхідну пряму.
Які точки нас цікавлять?
x1
- x2
-10
- x1
+ x2
10
x2
x1
+ 10
Знак нерівності менше або дорівнює нулю, отже, нас цікавлять точки які лежать нижче побудованої нами прямої.
Об'єднаємо отриману півплощину з раніше знайденими обмеженнями, отримаємо малюнок, наведений нижче.
Область допустимих значень виділена штрихуванням.
Точки належать області допустимих значень:
A (0, 0)
C (0, 10)
D (2, 12)
Крок 3
Розглянемо нерівність 3 системи обмежень.
8 x1+ x216
Побудуємо пряму.
Замінимо знак нерівності на знак рівності.
8 x1 + x2 = 16
На осі X1 малюємо точку з координатою 2.
На осі X2 малюємо точку з координатою 16.
З'єднуємо отримані точки і отримуємо необхідну пряму.
Які точки нас цікавлять?
8 x1
+ x2
16
x2
-8 x1
+ 16
Знак нерівності більше або дорівнює нуля, отже, нас цікавлять точки які лежать вище побудованої нами прямої.
Об'єднаємо отриману півплощину з раніше знайденими обмеженнями, отримаємо малюнок, який наведений ничже.
Область допустимих значень виділена штрихуванням.
Точки належать області допустимих значень:
E (2, 0)
D (2, 12)
F (2/3, 32/3)
Крок 4
Розглянемо нерівність 4 системи обмежень.
x1+ 2 x210
Побудуємо пряму.
Замінимо знак нерівності на знак рівності.
x1+ 2 x2=10
На осі X1 малюємо точку з координатою 10.
На осі X2 малюємо точку з координатою 5.
З'єднуємо отримані точки і отримуємо необхідну пряму.
Які точки нас цікавлять?
x1
+ 2 x2
10
2 x2
- x1
+ 10
x2
-1/2 x1
+ 5
Знак нерівності більше або дорівнює нуля, отже, нас цікавлять точки які лежать вище побудованої нами прямої.
Об'єднаємо отриману півплощину з раніше знайденими обмеженнями, отримаємо малюнок, який наведений ничже.
Область допустимих значень виділена штрихуванням.
Точки належать області допустимих значень:
G (10 , 0)
D (2 , 12)
F (2/3 , 32/3)
H (22/15 , 64/15)
Крок 5
Розглянемо нерівність 5 системи обмежень.
x1+ 3 x212
Побудуємо пряму.
Замінимо знак нерівності на знак рівності.
x1+ 3 x2=12
На осі X1 малюємо точку з координатою 12.
На осі X2 малюємо точку з координатою 4.
З'єднуємо отримані точки і отримуємо необхідну пряму.
Які точки нас цікавлять?
x1
+ 3 x2
12
3 x2
- x1
+ 12
x2
-1/3 x1
+ 4
Знак нерівності більше або дорівнює нуля, отже, нас цікавлять точки які лежать вище побудованої нами прямої.
Об'єднаємо отриману півплощину з раніше знайденими обмеженнями, отримаємо малюнок, який наведений ничже.
Область допустимих значень виділена штрихуванням.
Точки належать області допустимих значень:
M (12 , 0)
D (2 , 12)
F (2/3 , 32/3)
H (22/15 , 64/15)
N (6 , 2)
Крок 6
Розглянемо нерівність 6 системи обмежень.
-4 x1+ 3 x2-48
Побудуємо пряму.
Замінимо знак нерівності на знак рівності.
-4 x1+ 3 x2=-48
На осі X1 малюємо точку з координатою 12.
На осі X2 малюємо точку з координатою -16.
З'єднуємо отримані точки і отримуємо необхідну пряму.
Які точки нас цікавлять?
-4 x1
+ 3 x2
-48
3 x2
4 x1
- 48
x2
4/3 x1
-16
Знак нерівності більше або дорівнює нуля, отже, нас цікавлять точки які лежать вище побудованої нами прямої.
Об'єднаємо отриману півплощину з раніше знайденими обмеженнями, отримаємо малюнок, який наведений ничже.
Область допустимих значень виділена штрихуванням.
Точки належать області допустимих значень:
M (12 , 0)
D (2 , 12)
K (21 , 12)
F (2/3 , 32/3)
H (22/15 , 64/15)
N (6 , 2)
Крок 7
Розглянемо нерівність 7 системи обмежень.
-5 x1+ 3 x2-6
Побудуємо пряму.
Замінимо знак нерівності на знак рівності.
-5 x1+ 3 x2=-6
На осі X1 малюємо точку з координатою 6/5.
На осі X2 малюємо точку з координатою -2.
З'єднуємо отримані точки і отримуємо необхідну пряму.
Які точки нас цікавлять?
-5 x1
+ 3 x2
-6
3 x2
5 x1
- 6
x2
5/3 x1
-2
Знак нерівності більше або дорівнює нуля, отже, нас цікавлять точки які лежать вище побудованої нами прямої.
Об'єднаємо отриману півплощину з раніше знайденими обмеженнями, отримаємо малюнок, який наведений ничже.
Область допустимих значень виділена штрихуванням.
Точки належать області допустимих значень:
D (2 , 12)
M(42/5 , 12)
F (2/3 , 32/3)
H (22/15 , 64/15)
N(42/13 , 44/13)
Визначення максимуму
Розглянемо цільову функцію задачі F = 49x1-7x2 → max.
Побудуємо пряму, що відповідає значенню функції F = +0: F = 49x1-7x2 = 0. Будемо рухати цю пряму паралельним чином. Оскільки нас цікавить max, тому рухаємо пряму до останнього дотику з точками позначеної області. На графіку ця пряма позначена непунктирною лінією.
Область допустимих значень являє собою багатокутник.
Пряма F (x) = const перетинає область у точці M. Так як точка M отримана в результаті перетину прямих (1) і (7), то її координати задовольняють рівнянням цих прямих:
x2 ≤ 12
-5x1 +3 x2 ≥ -6
Розв’язавши систему рівнянь, отримаємо: x1 = 8.4, x2 = 12
Звідки знайдемо максимальне значення цільової функції:
F (X) = 49 * 8.4 - 7 * 12 = 327.6
F(max)= 327.6
Визначення мінімуму
Розглянемо цільову функцію задачі F = 49x1-7x2 → min.
Побудуємо пряму, що відповідає значенню функції F = 0: F = 49x1-7x2 = 0. Будемо рухати цю пряму паралельним чином. Оскільки нас цікавить мінімальне значення, то рухаємо пряму до першого дотику з позначеною областю.
Пряма F (x) = const перетинає область у точці F. Так як точка F отримана в результаті перетину прямих (2) і (3), то її координати задовольняють рівняння цих прямих:
x1-x2 ≥ -10
8x1 + x2 ≥ 16
Розв’язавши систему рівнянь, отримаємо: x1 = 0.6667, x2 = 10.6667
Звідки знайдемо мінімальне значення цільової функції:
F (X) = 49 * 0.6667 - 7 * 10.6667 = -42
F(min)=-42;
Алгоритм програми наступний :
введимо всі потрібні вхідні дані;
знаходимо всі точки перетину прямих що описують обмеження;
серед них вибираємо точки, які входять в область і при цьому цільова функція набирає максимальне і мінімальне значення;
перевіряємо чи немає інших екстремумів при яких цільова функція набирає максимальне або мінімальне значення;
виводимо значення max і min .
Блок схема алгоритму
Умови роботи програми
Програма написана мовою C++ з використанням віконного інтерфейсу в середовищі C++ Builder 06 . Програма може розв’язати задачу лінійного програмування з кількістю рівнянь менше 100. Щоб правильно виконати поставлене завдання необхідно ввести дані цільової функції , і всі решта рівняння. У програмі є можливість повертання до попереднього кроку виконання, де можна видалити останнє рівняння і змінити розв’язок системи рівнянь.
Код програми
Лістинг файлу Linpr.cpp
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("LinUn.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
Лістинг файлу Linun.cpp
#include <vcl.h>
#include <string.h>
#pragma hdrstop
#include "LinUn.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "XPManifest"
#pragma resource "*.dfm"
TForm1 *Form1;
float aij[4][100]={0}, fy[3]={0}, y[2]={0}, f[2]={0}, point[2][1000]={0}, F=0, Fmin=0, Fmax=0, bij[3]={0};
int k_ob=0, k_pt=0, k_min=-1, k_max=-1, max[2]={0}, min[2]={0};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool NotPoint(float a, float b)
{
for(int i=0; i<k_pt; i++)
if ((point[0][i]==a)&&(point[1][i]==b)) return false;
return true;
}
//---------------------------------------------------------------------------
bool PointInPlace(float a, float b)
{
float del=0.000001;
int k_tr=0;
for(int i=0; i<k_ob; i++)
{
float res=aij[0][i]*(a-del)+aij[1][i]*(b-del), res_p=aij[0][i]*(a+del)+aij[1][i]*(b+del);
switch((int)aij[3][i])
{
case 0:
if ((res>=aij[2][i])||(res_p>=aij[2][i])) k_tr++;
break;
case 1:
if ((res<=aij[2][i])||(res_p<=aij[2][i])) k_tr++;
break;
default:
break;
}
}
if (k_tr==k_ob)return true;
else return false;
}
//---------------------------------------------------------------------------
bool IsExtr(float a, float b, bool minim=true)
{
float aa=a, bb, del=0.1, d, d1, d2;
if (((f[0]>0)&&(minim==false))||((f[0]<0)&&(minim==true))) aa+=del;
else aa-=del;
float fb=f[1]*a/f[0];
bb=f[1]*aa/f[0]+(b-fb);
bij[0]=f[0]/f[1];
bij[1]=1;
bij[2]=f[0]/f[1]*aa+bb;
for (int j=0; j<k_ob; j++)
{
d=bij[0]*aij[1][j]-aij[0][j]*bij[1];
if (d!=0)
{
d1=aij[1][j]*bij[2]-bij[1]*aij[2][j];
d2=bij[0]*aij[2][j]-aij[0][j]*bij[2];
if (PointInPlace(d1/d,d2/d)) return false;
}
}
return true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if (fa1->Text.Length()&&fa2->Text.Length()&&fa3->Text.Length())
{
Button2->Enabled=true;
ListBox2->Items->Delete(0);
ListBox2->Items->Insert(0,Label3->Caption+fa1->Text+
Label6->Caption+fa2->Text+
Label7->Caption+fa3->Text+Label9->Caption);
fy[0]=StrToFloat(fa1->Text);
fy[1]=StrToFloat(fa2->Text);
fy[2]=StrToFloat(fa3->Text);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (ya1->Text.Length()&&ya2->Text.Length())
{
Button1->Enabled=true;
ListBox2->Items->Delete(1);
ListBox2->Items->Insert(1,Label10->Caption+ya1->Text+
Label4->Caption+ya2->Text+
Label5->Caption);
y[0]=StrToFloat(ya1->Text);
y[1]=StrToFloat(ya2->Text);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (a1->Text.Length()&&a2->Text.Length()&&b->Text.Length())
{
ListBox1->Items->Add(a1->Text+Label1->Caption+
a2->Text+Label2->Caption+
zn->Text+b->Text);
aij[0][k_ob]=StrToFloat(a1->Text);
aij[1][k_ob]=StrToFloat(a2->Text);
aij[2][k_ob]=StrToFloat(b->Text);
aij[3][k_ob++]=zn->ItemIndex;
}
if (k_ob>1) Button5->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
ListBox1->Items->Delete(ListBox1->Items->Count-1);
k_ob--;
if (k_ob>1) Button5->Enabled=true;
else Button5->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::fa1KeyPress(TObject *Sender, char &Key)
{
if ((Key < '0' || Key > '9') && Key != 8 && Key != '.' && Key != '-') Key= 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if (Key==46)
{
for (int i=ListBox1->ItemIndex; i<k_ob-1; i++)
for (int j=0; j<4; j++)
aij[j][i]=aij[j][i+1];
ListBox1->Items->Delete(ListBox1->ItemIndex);
k_ob--;
}
if (k_ob>1) Button5->Enabled=true;
else Button5->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
for (int i=1; i<StringGrid1->RowCount; i++)
for (int j=0; j<StringGrid1->ColCount; j++)
StringGrid1->Cells[j][i]="";
StringGrid1->RowCount=2;
k_pt=0;
k_min=-1;
k_max=-1;
f[0]=fy[0]+fy[2]*y[0];
f[1]=fy[1]+fy[2]*y[1];
float d, d1, d2;
int i;
for (i=0; i<k_ob-1; i++)
for (int j=i+1; j<k_ob; j++)
{
d=aij[0][i]*aij[1][j]-aij[0][j]*aij[1][i];
if (d!=0)
{
d1=aij[1][j]*aij[2][i]-aij[1][i]*aij[2][j];
d2=aij[0][i]*aij[2][j]-aij[0][j]*aij[2][i];
point[0][k_pt]=d1/d;
point[1][k_pt]=d2/d;
if(NotPoint(point[0][k_pt],point[1][k_pt]))
{
k_pt++;
StringGrid1->Cells[0][k_pt]=FloatToStr(point[0][k_pt-1]);
StringGrid1->Cells[1][k_pt]=FloatToStr(point[1][k_pt-1]);
StringGrid1->RowCount++;
}
}
}
for(i=0;i<k_pt;i++)
if (PointInPlace(point[0][i],point[1][i]))
{
k_max++; k_min++;
min[k_min]=max[k_max]=i;
F=f[0]*point[0][i]+f[1]*point[1][i];
StringGrid1->Cells[2][i+1]=FloatToStr(F);
Fmin=Fmax=F;
break;
}
for (i=min[k_min]+1;i<k_pt;i++)
{
if (PointInPlace(point[0][i],point[1][i]))
{
F=f[0]*point[0][i]+f[1]*point[1][i];
StringGrid1->Cells[2][i+1]=FloatToStr(F);
if(F==Fmin) min[++k_min]=i;
if(F<Fmin){k_min=0;min[k_min]=i;Fmin=F;}
if(F==Fmax) max[++k_max]=i;
if(F>Fmax){k_max=0;max[k_max]=i;Fmax=F;}
}
}
for (i=0;i<=k_max;i++)
{
if(!IsExtr(point[0][max[i]],point[1][max[i]],false)) continue;
StringGrid1->Cells[3][max[i]+1]=" max";
}
for (i=0;i<=k_min;i++)
{
if(!IsExtr(point[0][min[i]],point[1][min[i]])) continue;
char *str = StringGrid1->Cells[3][min[i]+1].c_str(), str_s[10];
StrCopy(str_s, str);
StrCat(str_s," min");
StringGrid1->Cells[3][min[i]+1]=AnsiString(str_s);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
StringGrid1->Cells[0][0]="x1";
StringGrid1->Cells[1][0]="x2";
StringGrid1->Cells[2][0]="F(x,y)";
StringGrid1->Cells[3][0]="extr";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
Лістинг файлу Linun.h
#ifndef LinUnH
#define LinUnH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include <Grids.hpp>
#include "XPManifest.h"
#include <jpeg.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TPanel *Panel1;
TLabel *Label1;
TEdit *a1;
TEdit *a2;
TLabel *Label2;
TComboBox *zn;
TEdit *b;
TButton *Button1;
TPanel *Panel2;
TLabel *Label4;
TLabel *Label5;
TEdit *ya1;
TEdit *ya2;
TButton *Button2;
TPanel *Panel3;
TLabel *Label6;
TLabel *Label7;
TEdit *fa1;
TEdit *fa2;
TButton *Button3;
TLabel *Label3;
TLabel *Label8;
TEdit *fa3;
TLabel *Label9;
TLabel *Label10;
TLabel *Label11;
TLabel *Label12;
TListBox *ListBox1;
TButton *Button4;
TButton *Button5;
TListBox *ListBox2;
TStringGrid *StringGrid1;
TXPManifest *XPManifest1;
TLabel *Label13;
TImage *Image1;
void __fastcall Button3Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button4Click(TObject *Sender);
void __fastcall fa1KeyPress(TObject *Sender, char &Key);
void __fastcall ListBox1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift);
void __fastcall Button5Click(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
void __fastcall Image1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Вигляд форми Linun.dfm
Скріншюти виконання програми
Малюнок 1. Послідовне обчислення
Малюнок 2 . Розв’язок задачі лінійного програмування.
Висновок : я вивчив і застосував метод лінійного програмування для рішення задач оптимального керування, у яких цільова функція, модель процесу й обмеження є лінійними функціями.