ОПТИМАЛЬНЕ КЕРУВАННЯ ПРОЦЕСАМИ З ЗАСТОСУВАННЯМ МЕТОДУ ЛІНІЙНОГО ПРОГРАМУВАННЯ

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Систем управління
Кафедра:
Не вказано

Інформація про роботу

Рік:
2012
Тип роботи:
Лабораторна робота
Предмет:
Інші
Група:
КН-32

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” АВТОМАТИЗОВАНІ СИСТЕМИ УПРАВЛІННЯ Лабораторна робота №1 ОПТИМАЛЬНЕ КЕРУВАННЯ ПРОЦЕСАМИ З ЗАСТОСУВАННЯМ МЕТОДУ ЛІНІЙНОГО ПРОГРАМУВАННЯ Мета роботи Вивчення і застосування методу лінійного програмування для рішення задач оптимального керування, у яких цільова функція, модель процесу й обмеження є лінійними функціями. Хід роботи ознайомитися з теоретичними зведеннями і прикладами використання методу лінійного програмування для рішення задач оптимального керування; представити цільову функцію і систему обмежень у вигляді функцій змінних керування шляхом заміни змінних стану змінних керування; скласти програму рішення задачі на мові С#; вивести на друк максимальне і мінімальне значення цільової функції, значення змінних керування; Індивідуальне завдання Варіант 4 Цільова функція  Модель процесу  Обмеження  Код програми using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Windows.Forms; namespace Lab1 { public partial class Form1 : Form { public int[,] A = { { 1, 0, 0 }, { 5, 1, 10 }, { 0, 1, 0 }, { -4, 3, -48 }, { -1, 0, -17 }, { -1, -4, -58 } }; public int[,] B = new int[6,2]; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Graphics g = pictureBox1.CreateGraphics(); int maxx1 = 0, maxx2 = 0, minx1 = 0, minx2 = 0; int cx = 250, cy = 250, k =4; Pen MyPen = new Pen(Color.Black); //Створення осей координат g.DrawLine(MyPen, cx, 0, cx, 500); g.DrawLine(MyPen, 1, cx, 500, cy); //Створення стрілок на кінцях осей SolidBrush MyBrush = new SolidBrush(Color.Black); Point p1 = new Point(250, 0); Point p2 = new Point(246, 15); Point p3 = new Point(254, 15); Point p4 = new Point(500, 250); Point p5 = new Point(485, 246); Point p6 = new Point(485, 254); Point[] Pt1 = { p1, p2, p3 }; Point[] Pt2 = { p4, p5, p6 }; FillMode FM = FillMode.Winding; g.FillPolygon(MyBrush, Pt1, FM); g.FillPolygon(MyBrush, Pt2, FM); //позначення точок на осі (по 10 значень в одному відрізку) for(int i=0;i<6;i++) { Rectangle Rect = new Rectangle(cx - 1 + i * k * 10, cy - 2, 5, 5); g.FillEllipse(MyBrush, Rect); Rectangle Rect1 = new Rectangle(cx + 1 - i * k*10, cy - 2, 5, 5); g.FillEllipse(MyBrush, Rect1); } // 0 <= x1 <= 17 minx1 = 0; maxx1 = 17; Brush CrossBrush = new HatchBrush(HatchStyle.ForwardDiagonal, Color.Red, Color.Transparent); g.FillRectangle(CrossBrush, cx, minx1, maxx1 * k, 500); Pen RedPen = new Pen(Color.Red); g.DrawLine(RedPen, cx + k * maxx1, minx1, cx + k * maxx1, 500); //5x1+x2>=10 =>x2=10-5x1 maxx2 = 100; maxx1 = (10 - maxx2) / 5; minx1 = 20; minx2 = 10 - 5 * minx1; Pen GreenPen = new Pen(Color.Green, 3); g.DrawLine(GreenPen, cx + maxx1 * k, cy - maxx2 * k, cx + minx1 * k, cy - minx2 * k); Brush GreenCrossBrush = new HatchBrush(HatchStyle.BackwardDiagonal, Color.Green, Color.Transparent); Point Gp1 = new Point(cx + maxx1 * k, cy - maxx2 * k); Point Gp2 = new Point(cx + minx1 * k, cy - minx2 * k); Point Gp3 = new Point(cx + ( minx1 + 30 * k ), cy - ( minx2 - 20 * k ) ); Point Gp4 = new Point(cx + ( maxx1 + 30 * k ), cy - ( maxx2 - 20 * k ) ); Point[] Gpt1 = { Gp1, Gp2, Gp3, Gp4 }; g.FillPolygon(GreenCrossBrush, Gpt1, FM); //-4x1+3x2>=-48 minx2 = -30; minx1 = (-48 - 3 * minx2) / -4; maxx1 = 30; maxx2 = (-48 + 4 * maxx1) / 3; Pen BluePen = new Pen(Color.Blue, 2); g.DrawLine(BluePen, cx + minx1 * k, cy - minx2 * k, cx + maxx1 * k, cy - maxx2 * k); Brush BlueCrossBrush = new HatchBrush(HatchStyle.Horizontal, Color.Blue, Color.Transparent); Point Bp1 = new Point(cx + minx1 * k, cy - minx2 * k); Point Bp2 = new Point(cx + maxx1 * k, cy - maxx2 * k); Point Bp3 = new Point(cx - (maxx1 - 30) * k, cy - (maxx2 + 30) * k); Point Bp4 = new Point(cx + (minx1 - 30) * k, cy - (minx2 + 30) * k); Point[] Bpt1 = { Bp1, Bp2, Bp3, Bp4 }; g.FillPolygon(BlueCrossBrush, Bpt1, FM); //x1+4x2<=58 minx1 = -20; minx2 = (58 - minx1) / 4; maxx2 = 0; maxx1 = 58 - 4 * maxx2; Pen YellowPen = new Pen(Color.Yellow,2); g.DrawLine(YellowPen, cx + minx1 * k, cy - minx2 * k, cx + maxx1 * k, cy - maxx2 * k); Brush YellowcrossBrush = new HatchBrush(HatchStyle.Vertical, Color.Yellow, Color.Transparent); Point Yp1 = new Point(cx + minx1 * k, cy - minx2 * k); Point Yp2 = new Point(cx + maxx1 * k, cy - maxx2 * k); Point Yp3 = new Point(cx + (maxx1 - 30) * k, cy - (maxx2 - 30) * k); Point Yp4 = new Point(cx + (minx1 - 30) * k, cy - (minx2 - 30) * k); Point[] Ypt1 = { Yp1, Yp2, Yp3, Yp4 }; g.FillPolygon(YellowcrossBrush, Ypt1, FM); //x2>=0 minx1 = -20; maxx1 = 20; minx2 = 0; maxx2 = 0; Pen VioletPen = new Pen(Color.Violet, 3); g.DrawLine(VioletPen, cx + minx1 * k, cy + minx2 * k, cx + maxx1 * k, cy + maxx2 * k); //точки перетину g.FillEllipse(MyBrush, cx - 0 * k - 3, cy - 10 * k - 3, 7, 7); g.FillEllipse(MyBrush, cx - 0 * k - 3, cy - 14.5F * k - 3, 7, 7); g.FillEllipse(MyBrush, cx + 2 * k - 3, cy - 0 * k - 3, 7, 7); g.FillEllipse(MyBrush, cx + 12 * k - 3, cy - 0 * k - 3, 7, 7); g.FillEllipse(MyBrush, cx + 17 * k - 3, cy - 6.6F * k - 3, 7, 7); g.FillEllipse(MyBrush, cx + 17 * k - 3, cy - 10.25F * k - 3, 7, 7); //головна функція //G(x)=21x1+5x2 => x2=-4.25x1 Pen BoldPen = new Pen(Color.Black, 3); minx1 = -15; minx2 = - 21 * minx1 / 5; maxx1 = 15; maxx2 = - 21 * maxx1 / 5; g.DrawLine(BoldPen, cx + minx1 * k, cy - minx2 * k, cx + maxx1 * k, cy - maxx2 * k); //градієнт minx2 = 0; minx1 = 0; maxx1 = 21; maxx2 = 5; Pen Pen2 = new Pen(Color.Black, 2); g.DrawLine(Pen2, cx + minx1 * k, cy - minx2 * k, cx + maxx1 * k, cy - maxx2 * k); //напрям градієнта Point Pl1 = new Point(cx + maxx1 * k, cy - maxx2 * k); Point Pl2 = new Point(cx + maxx1 * k - 13, cy - maxx2 * k - 3); Point Pl3 = new Point(cx + maxx1 * k - 11, cy - maxx2 * k + 9); Point[] P = { Pl1, Pl2, Pl3 }; g.FillPolygon(MyBrush, P, FM); int Delta = 0, d1 = 0, d2 = 0, x1 = 0, x2 = 0, i1 = 0; for(int i = 0; i < 5; i++) for(int j = i+1;j < 6; j++) { Delta = A[i,0] * A[j,1] - A[i,1] * A[j,0]; d1 = A[i,2] * A[j,1] - A[j,2] * A[i,1]; d2 = A[i,0] * A[j,1] - A[i,2] * A[j,0]; if (Delta != 0) { x1 = d1 / Delta; x2 = d2 / Delta; if (((A[0, 0] * x1 + A[0, 1] * x2) >= A[0, 2]) & ((A[1, 0] * x1 + A[1, 1] * x2) >= A[1, 2]) & ((A[2, 0] * x1 + A[2, 1] * x2) >= A[2, 2]) & ((A[3, 0] * x1 + A[3, 1] * x2) >= A[3, 2]) & ((A[4, 0] * x1 + A[4, 1] * x2) >= A[4, 2]) & ((A[5, 0] * x1 + A[5, 1] * x2) >= A[5, 2])) { B[i1,0] = x1; B[i1,1] = x2; i1++; } } } int mx1 = 0, mx2 = 0, nx1 = 0, nx2 = 0; int max = 21 * B[0, 0] + 5 * B[0, 1]; mx1 = B[0, 0]; mx2 = B[0, 1]; for (int i = 1; i < i1; i++) { if (21 * B[i, 0] + 5 * B[i, 1] > max) { max = 21 * B[i, 0] + 5 * B[i, 1]; mx1 = B[i, 0]; mx2 = B[i, 1]; } } int min = 21 * B[0, 0] + 5 * B[0, 1]; nx1 = B[0, 0]; nx2 = B[0, 1]; for (int i = 1; i < i1; i++) { if (21 * B[i, 0] + 5 * B[i, 1] < min) { min = 21 * B[i, 0] + 5 * B[i, 1]; nx1 = B[i, 0]; nx2 = B[i, 1]; } } label15.Text = Convert.ToString(mx1); label16.Text = Convert.ToString(mx2); label18.Text = Convert.ToString(nx1); label19.Text = Convert.ToString(nx2); } } } Результати роботи / Висновок: На даній лабораторній роботі я навчився запрограмовувати задачі оптимального керування, у яких цільова функція, модель процесу й обмеження є лінійними функціями. Програмно будувати їх графік, та визначати деякі максимальні і мінімальні точки .
Антиботан аватар за замовчуванням

20.02.2013 20:02-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!