Toto je starší verze dokumentu!


Cvičení 2

LinProg 101

Vše se dá rychle pochopit z tohoto PDF: http://dl.getdropbox.com/u/1469682/opt_linprog.pdf

Úloha 1

 f = [ 0; 0; 0; 0; 0; -1 ]
 % f [ x1; x2; x3; x4; x5; lambda ]
 A = [ -1.27 -1.02 0 0 0 1; 0 -1.02 -4.7 -3.09 0 1; 0 0 0 -3.09 -9 1 ]
 b = [ 0; 0; 0; ]
 Aeq = [ 1 1 1 1 1 0 ]
 beq = [ 3000 ]
 lb = [ 0; 0; 0; 0; 0; -inf ]
 [x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb)

Marek Sacha 2009/10/01 01:54

Úloha 2

%opet pridani pomocne promenne
f = [0;0;1]; % 1, protoze maximalizuju 2x
%pomocny vektor jednotek
jednicky = ones(50,1); 
%prvni pulka podminek
A1 = [ x jednicky -jednicky]; %leve strany
b1 = y; %prave strany
%druha pulka podminek
A2 = [ -x -jednicky -jednicky]; %leve strany
b2 = -y; %prave strany
%podminky - celek
A = [ A1; A2]; %leve strany
b = [b1;b2]; %prave strany
%zjisteni reseni
sol = linprog(f,A,b);
%vykresleni hodnot
hold on; 
plot(x, y,'bo'); %puvodni body
plot(x, x*sol(1)+sol(2),'r'); %vysledna aproximujici primka
plot(x, x*sol(1)+sol(2)+sol(3),'r:'); %horni omezujici primka
plot(x, x*sol(1)+sol(2)-sol(3),'r:'); %dolni omezujici primka
hold off;

Martin Průcha 2009/10/01 18:11

  • Dneska na cviku, kdyz jsme ty ulohy odevzdavali, tak nam bylo receno, ze je zbytecny pulit ty promenny z R a vskutku, z matlabu vypadl stejny vysledek. Nejak jsem uplne nepobrala proc to tak je, ale asi neco podobnyho jako kdyz je min f(x) = -max[-f(x)] a to minus pred max nejak nehraje roli, viz graficke vyjadreni mozna? Koser na zkousku nebo na pisemku je stejne asi to puleni, takze tak.
    • Cvicici rikal, ze ty dve nerovnice lze zapsat do jedne s vicero parametry, nicmene jinak se puleni musi zachovat, jinak by spravny vysledek byl otazkou nahody - odpovidajici usporadani bodu.
    • taky jsem se na to na cviku schválně ptala a bylo mi řečeno, že půlení se musí zachovat (alespoň pokud uvažujeme kód výše), protože jinak by to nevycházelo. z grafického ztvárnění, které mi k tomu namaloval cvičící, je to docela vidět: máme přímku (1.podmínka), a ty body jsou v polorovině napravo od ní. u druhé přímky (2.podmínka) jsou v polorovině nalevo, takže ty přímky vymezují pás, kde se body nacházejí. proto ty podmínky potřebujeme zadat obě - jinak bysme měli určenou jen (nekonečnou) polorovinu, kterou bysme samozřejmě nemohli proložit žádnou aproximační přímku.

Diskuze

Koukal už někdo na tu 1.úlohu? Zajímalo by mne, jak v MatLabu zapsat podmínku, že x1+…x5 = 3000… a jak má vypadat funkce f. Já jsem zatím vytvořil toto: f = [-1]; A=[1.27 1.02 0 0 0 0 1.02 4.7 3.09 0 0 0 0 3.09 9]; b=[1,1,1]; PS: jak se tu zalamuje? — Dominik Franek 2009/09/29 21:17

  • Zdravim. Ta podminka, ze soucet ma byt 3000 se pocita pomoci Aeq a Beq, coz jsou argumenty linprog. Do Aeq narves v matlabu vektor jednicek o velikosti n, tedy [1 1 1 1 1] a Beq je skalar 3000, ixovej nevyplnujes…tot vse :) — Jan Kváča 2009/09/29 23:30

Já řeším tu druhou polovinu první úlohy a vyhazuje mi to pořád error: Exiting: One or more of the residuals, duality gap, or total relative error has grown 100000 times greater than its minimum value so far: the dual appears to be infeasible (and the primal unbounded). (The primal residual < TolFun=1.00e-008.)

Výsledné hodnoty to přitom hodí nulové, což je špatně. Nestalo se vám to nikomu? — Martin Zachar 2009/09/30 00:12

Jak Vám to vyšlo? Můj výsledek je, že vsadím jen na 10 (2694,6) a na 2 (305,4)… a jistá výhra je asi 2748,5 Kč… Má někdo lepší řešení? Popř. popište, jak jste na to šli…

  • Vyšlo mi to úplně stejně. — Martin Zachar 2009/09/30 12:01

Tak už se mi nějak podařilo i to druhé. Vyšlo mi to: a = 0.4997; b = -0.6757; odchylka = 0.1751; — Martin Zachar 2009/09/30 12:54

  • Tak nové výsledky, které sjou snad již správné :) %a = 0.4740; %b = -0.5806; %odchylka = 0.0988 — Martin Zachar 2009/09/30 14:35

Nemaj byt ty sazky rozlozeny na jednotlivy moznosti nenulove? Je to i v omezujicich podminkach… jinak me tohle vyslo taky, ale nevim jestli je to spravny vysledek no… — Jan Kváča 2009/09/30 17:06

Myslím že ne, protože nám cvičící na cviku říkal, že máme najít takové řešení (jistou výhru), při které utržíme nejvyšší zisk. A pokud je tato varianta správně, pak by nemělo rozložení nic říkat.

  • omezujici podminky jsou podle me vetsi nebo rovno… cili je to splnene…
  • jojo, beru zpet, je tam vetsi rovno, tudiz podminka splnena :) vyslo mi to stejne — Jan Kváča 2009/09/30 20:47

mohli byste nejak nekdo prosim nastinit, jak jste postupovali? predevsim mi neni vubec jasne, co v 1.casti zadani znamena ta lambda, respektive, jak ziskat jeji hodnotu.. — Martin Průcha 2009/09/30 18:05

  • funkce f bude vektor [0 0 0 0 0 -1], kde -1 je tam proto, ze mas maximalizovat tzn., ze musis udelat -f (viz. triky z prednasek), ta 1 je tam pro tu lambdu, coz je nova promenna (viz. prednasky slajd 18). Pak uz jen udelas matici A (ale pozor, v podminkach je >= a musi se to prevest na ⇐ tedy vynasobit -1 cely radek), vektor b bude nulovy (po prevedeni lambda na levou stranu). Takze ve finale do matlabu vlozite neco takoveho a ste doma linprog([0;0;0;0;0;-1],[-1.27 -1.02 0 0 0 1; 0 -1.02 -4.7 -3.09 0 1; 0 0 0 -3.09 -9 1], [0;0;0], [1 1 1 1 1 0], 3000, zeros(6,1)). A ted na oplatku poradte s tou druhou ulohou :) THX wrm — Jan Kváča 2009/09/30 20:47
  • Druhá úloha je to stejné. Opět máš podmínky (teď jich máš 100 místo těch 4 v prvním polovině). Teď máš 3 proměnné (místo x1, x2, …, lambda) - a, b, lambda. Takže A budeš mít 100 řádků dlouhé se 3 sloupečky. Funkce bude vektor [0 0 1]. Výsledkový vektor bude jen sloupec ypsilonek. To je snad vše :) — Martin Zachar 2009/09/30 21:01
  • jasny, uz to fachci :) — Jan Kváča 2009/09/30 21:39
courses/a4b33opt/cviceni2.1254694718.txt.gz · Poslední úprava: 2025/01/03 18:23 (upraveno mimo DokuWiki)
Nahoru
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0