Delphi Линейное программирование: решение задач графическим методом

Ответить
Perf
Сообщения: 10
Зарегистрирован: 21 янв 2008, 21:51

Нужно написать программу в Delphi "Линейное программирование: решение задач графическим методом". За основу брал материал http://www.mathelp.spb.ru/applet/GraphicLP.htm . В основном задача мне понятна. Для программы выбрал отдельный случай 2 переменные и 3 ограничения. Для рисования использую метод Canvas на форме. Идея следующая рисовать прямые через Polygon на форме. Проблема в том , что я не понимаю как рассчитать координаты для Polygon: Polygon([point(Х- известен ,y-?), point (x-?,y- известен)]); .
Просьба: Дайте пожалуйста алгоритм вычисления координат. Если есть возможность, то исходник очень бы пригодился. Если данная задача где то обсуждалась, скиньте пожалуйста ссылку. Заранее благодарен.
Изображение
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Координаты вершин многоугольника - это точки пересечения уравнений неравенств.
Т.е. надо все ограничения (считая их просто уравнениями) брать попарно и решать как системы - совместно.

Либо попросту (раз решение графическое) построить все ограничения, а зетем разрешить пользователю двигать график целевой функции по рисунку. Я так понимаю, в графическом методе не нужно никаких аналитических вычислений. Надо чтобы юзер мог кликнуть в конкретное место поверх всех вспомогательных построений, а ему бы показали координаты этой точки.
Perf
Сообщения: 10
Зарегистрирован: 21 янв 2008, 21:51

Спасибо за идею с кликом по графику, но у меня проблемма именно с построением отрезков , а именно расётов начала и конца отрезков =( (Математику я подзабыл)
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Я тоже все забыл, попробую вспомнить "на ходу"
Сначала решим систему:

3x+2y=27
2x+4y=28

из первого уравнения
x=(27-2y)/3

подставляем во второе и решаем
2((27-2y)/3)+4y=28 -> 18-4y/3+4y=28 -> 8y/3=10 -> y=3,75

подставляем готовое число обратно в первое и снова решаем
x=(27-2*3,75)/3 = 6,5

==========================

Если в буквах:

Ax+By=C
Dx+Ey=F

A,B,C,D,E,F - даны

x=(C-By)/A

D(C-By)/A+Ey=F -> CD/A - BDy/A + Ey = F -> y(E-DB/A)=F-CD/A

Т.е. y вычисляем как y=(F-CD/A)/(E-DB/A)
Затем x, как x= (C-By)/A

Проверим формулу:
y=(28-27*2/3)/(4-2*2/3)=3.75
x=(27-2*3,75)/3 = 6,5

Значит всегда система вида
Ax+By=C
Dx+Ey=F

На паскале решается так
y:=(F-CD/A)/(E-DB/A);
x:=(C-By)/A;
Perf
Сообщения: 10
Зарегистрирован: 21 янв 2008, 21:51

Всё прогу сделал. Naeel Maqsudov огромное спасибо ,что мне тормазу всё на пальцах объяснил. Без тебя бы несправился.
MaxWert
Сообщения: 1
Зарегистрирован: 22 ноя 2009, 08:57

Perf, пожалуйста можешь помочь мне с той же программой. Такая же что что и у тебя. Как в программе отметить область выше или ниже прямой. Пожалуйста подскажи, или если осталась она у тебя, скинь пожа.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Область выше прямой: берется X, вычисляется Y, берутся все точки, для которых Х тот же, а Y больше найденного. Для области ниже прямой Y меньше найденного.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Ответить