Extra
bivillkor
För att få rimliga körtider måste man hjälpa fmincon,
eftersom rutinen annars lätt tar helt vansinniga steg. Rutinen borde
kunna få den hjälpen från de enkla gränserna, men det verkar inte
räcka, så använd följande uppsättning ickelinjära olikhetsbivillkor som
gör susen (åtminstone i mina tester).
Vi har variablerna xk, yk,
k = 1, ..., n. Låt mx vara medelvärdet av de
aktuella x-värdena (help mean) analogt för my.
Notera att mx och my
ändras när rutinen söker sig fram mot minimum. Låt r vara en
uppskattning av radien i inhägnaden (du vet ju omkretsen, använd inte
det värde på omkretsen som du räknar ut i rutinen utan använd det värde
som är givet i lab-pm, en konstant med andra ord). (Inhägnaden
är inte alltid
cirkelformad, med det spelar mindre roll.) Inför de n bivillkoren (inte ett bivillkor, med andra ord):
(xk- mx)2
+ (yk- my)2 <=
2 r2, k = 1, ..., n
Observera att dessa vilkor är till för att begränsa rutinens
steglängd, men vi vill inte att bivillkoren direkt skall påverka
inhägnadens form. Inget av ovanstående villkor skall alltså
vara aktivt i minimum, dvs inget av villkoren skall vara uppfyllt med
likhet, eftersom det då (sannolikt) har begränsat stängslets form. När fmincon är färdig skall man alltså inte ha fått en utskrift i stil med:
Active inequalities (to within options.TolCon = 1e-06):
lower upper ineqlin ineqnonlin
1
30
I detta fall är två ickelinjära olikhetsbivillkor (ineqnonlin), 1 och 30, aktiva (Active inequalities).
Denna kolumn skall dock vara tom. Andra kolumner behöver inte alltid
vara tomma (det beror på vilken av labuppgifterna det rör sig om).