Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Інститут комп’ютерних наук та інформаційних технологій
Кафедра АСУ
Лабораторна робота №1
на тему:
« »
з дисципліни
«Моделювання систем»
Мета роботи
Вивчення і застосування методу лінійного програмування для рішення задач оптимального керування, у яких цільова функція, модель процесу й обмеження є лінійними функціями.
Варіант індивідуального завдання
Варіант 2
Цільова функція
Модель процесу
Обмеження
Математична модель задачі
Цільова функція мого індивідуального завдання має вигляд: G(x) = 31x1-74x2 . Для знаходження вектору напрямку збільшення цільової функції потрібно взяти часткові похідні від заданої функції по x1 та x2 , отримані значення дорівнюють проекціям вектору на відповідні осі координат:
Для знаходження мінімуму та максимуму потрібно зміщувати лінію паралельні до нашої функції вздовж вектору поки вона не перетнеться з областю допустимих значень. Перше входження цієї ліній в задану область буде її мінімумом, а останнє буде максимумом. Зміщені лінії паралельні до цільої функції називаються лініями рівня.
В результаті обчислень отримуємо точки оптимуму нашої функції, та підставивши їх у її рівняння отримаємо мінімальне та максимальне значення функції.
В результаті обчислень я отримав точки вершин многокутника області допустимих значень:A(1.57,3.48);B(1.43,4.57);C(3.00,3.00);
Мінімум функції G(x) у точці A , де функція приймає значення 305.913.
Максимум у точці B , де значення функції дорівнює 382.5714
Блок-схема алгоритму рішення задачі
Текст програми
#include <conio.h>
#include <stdio.h>
#define BR 0 //Bilshe Rivno >=
#define MR 1 //Menshe Rivno <=
int main()
{
clrscr();
double buf,Fmin,Fmax,detA,detA1,detA2;
int index=0,vOblasti,maxI,minI,count=9,i,j,k;
maxI=minI=0;
int G[2]={31,74};
int A[20][4]= { {0,1,12,MR},
{8,1,16,BR},
{1,-1,-10,BR},
{1,3,10,BR},
{1,3,12,BR},
{-1,-1,-6,BR},
{-4,3,-48,BR},
{1,0,16,MR},
{1,4,56,MR}};
double Tochku[30][2];
for ( i=0; i < count; i++)
for (j= i+1; j<count; j++) {
detA=A[i][0]*A[j][1]-A[i][1]*A[j][0];
if(detA==0)continue;
detA1=A[i][2]*A[j][1]-A[i][1]*A[j][2];
detA2=A[i][0]*A[j][2]-A[i][2]*A[j][0];
Tochku[index][0]=detA1/detA;
Tochku[index][1]=detA2/detA;
vOblasti=1;
for (k = 0;( k < count)&&vOblasti; k++) {
double buf=Tochku[index][0]*A[k][0]+Tochku[index][1]*A[k][1];
if(A[k][3]==0)//Bilshe Rivne >=
vOblasti=buf>=A[k][2];
if(A[k][3]==1)//Menshe Rivno <=
vOblasti=buf<=A[k][2];
}
if (vOblasti)index++;
}
printf("\tG(x)=49x1-7x2\n");
printf("Results:\n");
for (i = 0; i < index; i++) {
printf("\t%c(%.2lf,%.2lf)\n",65+i,Tochku[i][0],Tochku[i][1]);
}
Fmin=G[0]*Tochku[0][0]+G[1]*Tochku[0][1];
Fmax=Fmin;
for (i = 1; i <index; i++) {
buf=G[0]*Tochku[i][0]+G[1]*Tochku[i][1];
if(Fmin>buf){Fmin=buf;minI=i;}
if(Fmax<buf){Fmax=buf;maxI=i;}
}
printf("\tMin %c(%.2lf,%.2lf) de G(x)=%.4lf\n",'A'+minI,
Tochku[minI][0],Tochku[minI][1],Fmin);
printf("\tMax %c(%.2lf,%.2lf) de G(x)=%.4lf\n",'A'+maxI,
Tochku[maxI][0],Tochku[maxI][1],Fmax);
getch();
return 0;
}
// ---------------------------------------------------------------------------
Графічне рішення задачі
G(x) = 31x1-74x2
Скріншот виконання програми
Висновки
На цій лабораторній роботі я вивчав і застосовував метод лінійного програмування для рішення задач оптимального керування, у яких цільова функція, модель процесу й обмеження є лінійними функціями.