Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Інститут комп’ютерних наук та інформаційних технологій
Кафедра АСУ
Лабораторна робота №1
на тему:
« »
з дисципліни
«Моделювання систем»
Мета роботи
Вивчення і застосування методу лінійного програмування для рішення задач оптимального керування, у яких цільова функція, модель процесу й обмеження є лінійними функціями.
Варіант індивідуального завдання
Варіант 1
Цільова функція
Модель процесу
Обмеження
Математична модель задачі
Цільова функція мого індивідуального завдання має вигляд: G(x) = 16x1+32x2 . Для знаходження вектору напрямку збільшення цільової функції потрібно взяти часткові похідні від заданої функції по x1 та x2 , отримані значення дорівнюють проекціям вектору на відповідні осі координат:
Для знаходження мінімуму та максимуму потрібно зміщувати лінію паралельні до нашої функції вздовж вектору поки вона не перетнеться з областю допустимих значень. Перше входження цієї ліній в задану область буде її мінімумом, а останнє буде максимумом. Зміщені лінії паралельні до цільої функції називаються лініями рівня.
В результаті обчислень отримуємо точки оптимуму нашої функції, та підставивши їх у її рівняння отримаємо мінімальне та максимальне значення функції.
В результаті обчислень я отримав точки вершин многокутника області допустимих значень:
A(3.2,13.2);B(22.48,8.38);C(0.22,10.22);D(1.68,-1.44);E(16.29,3.43);
Мінімум функції G(x) у точці D , де функція приймає значення -19.2.
Максимум у точці B , де значення функції дорівнює 627.8095.
Блок-схема алгоритму рішення задачі
Текст програми
#include <conio.h>
#include <stdio.h>
int main()
{
clrscr();
double buf,Fmin,Fmax,detA,detA1,detA2;
int index=0,vOblasti,maxI,minI,count=5,i,j,k;
maxI=minI=0;
int G[2]={16,32};
int A[20][4]= {{1,4,56,1},{1,-1,-10,0},{8,1,12,0},{-1,3,-6,0},{-4,5,-48,0}};
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)=16x1+32x2\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;
}
// ---------------------------------------------------------------------------
Графічне рішення задачі
1)x1 +4x2<=56; 2) x1-x2>=-10; 3) 8x1+x2>=12; 4)-x1+3x2>=-6; 5)-4x1+5x2>=-48;
G(x)=16x1+32x2;
Cкріншот виконання програми:
Висновки
На цій лабораторній роботі я вивчав і застосовував метод лінійного програмування для рішення задач оптимального керування, у яких цільова функція, модель процесу й обмеження є лінійними функціями.