TomSym
Utvecklare | Tomlab Optimization Inc. |
---|---|
Stabil frisättning | 7.8 / 16 december 2011
|
Operativ system | TOMLAB - OS-stöd |
Typ | Teknisk beräkning |
Licens | Proprietär |
Hemsida | TomSym produktsida |
TomSym MATLABs symboliska modelleringsmotor är en plattform för modellering av tillämpad optimering och optimala kontrollproblem .
Beskrivning
TomSym är en komplett modelleringsmiljö i Matlab med stöd för de flesta inbyggda matematiska operatörer i Matlab. Det är en kombinerad modellering , kompilering och gränssnitt till TOMLAB- lösarna. Matrisderivatan av en matrisfunktion är en fjärderangstensor - det vill säga en matris vars poster var och en är en matris . Istället för att använda fyrdimensionella matriser för att representera detta, fortsätter TomSym att arbeta i två dimensioner. Detta gör det möjligt att dra nytta av den mycket effektiva hanteringen av glesa matriser i Matlab, som inte är tillgänglig för högre dimensionella matriser.
TomSym har en mängd olika funktioner, bland annat:
- Förmåga att transformera uttryck och generera analytiska första och andra ordningens derivator , inklusive sparsitetsmönster.
- Interface och kompatibel med MAD , dvs MAD kan användas när symbolisk modellering inte är lämplig.
- Numerisk differentiering kan användas till delar av modellen.
- Funktionalitet för att plotta och beräkna en mängd information för lösningen av problemet.
- Stöd för if, alltså else-påståenden.
- Förmåga att analysera p-kodade Matlab-filer.
- Automatiserad kodförenkling för till exempel genererade modeller.
- Multiplikation med 1 eller identitetsmatrisen elimineras: 1*A = A
- Addition / subtraktion av 0 elimineras: 0+A = A
- Alla samma matriser reduceras till skalärer : [3;3;3]+x = 3+x
- Skalärer flyttas åt vänster i addition/subtraktion: Ay = -y+A
- Inversa operationer avbryter: sqrt(x)^2 = x
Modellering
TomSym symboliska källtransformation gör det möjligt att definiera vilken som helst uppsättning beslutsvariabler (både kontinuerliga och heltal ) och vilken typ av begränsning som helst, såväl som skalärer och konstanta parametrar.
Linjär programmering
Ett exempel på linjärt programmeringsproblem skulle se ut så här:
0 0
c = [ -7 ; _ -5 ] ; A = [ 1 2 4 1 ]; b_U = [ 6 ; 12 ] ; x_L = [ ; ] ; toms 2x1 x lösning = ezsolve ( c '* x , { A * x <= b_U , x_L <= x });
Blandat heltals icke-linjär programmering
Ett MINLP-problem definieras precis som ett linjärt programmeringsproblem. Detta exempel visar också hur man konverterar modellen till ett allmänt TOMLAB-problem.
0
0
0 0 0
0
Namn = 'minlp1Demo - Kocis/Grossman.' ; toms 2x1 x toms 3 x1 heltal y objektiv = [ 2 3 1,5 2 - 0,5 ] * [ x ; y ]; begränsningar = { ... x ( 1 ) >= , ... x ( 2 ) >= 1e-8 , ... x <= 1e8 , ... <= y <= 1 , ... [ 1 1 ] * [ x ; y ] <= 1,6 , ... 1,333 * x ( 2 ) + y ( 2 ) <= 3 , ... [ - 1 - 1 1 ] * y <= , ... x ( 1 ) ^ 2 + y ( 1 ) == 1,25 , ... sqrt ( x ( 2 ) ^ 3 ) + 1,5 * y ( 2 ) == 3 , ... }; gissa = struct ( 'x' , ettor ( storlek ( x )), 'y' , ettor ( storlek ( y ))); optioner = struct ; alternativ . namn = Namn ; Prob = sym2prob ( 'minlp' , objektiv , begränsningar , gissning , alternativ ); Sannolikt . DUNDEE . optPar ( 20 ) = 1 ; Resultat = tomRun ( 'minlpBB' , Prob , 2 );
Multi-index modellering
tomSym gör det möjligt att bygga modeller med två eller flera variabla index i MATLAB. Följande exempel skapar en variabel 'flöde' med fyra index. Variabeln används sedan för att skapa en begränsning över två av indexen och för att summera multiplikationen med en tvådimensionell matris.
0
0
0
0
0
0
% Skapa indexen som används i modellen i = tomArrayIdx ( 'i' , 1 : 6 ); j = tomArrayIdx ( 'j' , 1 : 6 ); k = tomArrayIdx ( 'k' , 1 : 6 ); l = tomArrayIdx ( 'l' , 1 : 6 ); % Skapa en heltalsvariabel för fullängdsflöde = tom ( ' flöde' , 6 ^ 4 , 1 , 'int' ) ; % Konvertera variabeln till en matris med fyra index. flow = tomArray ( flöde ,[ 6 , 6 , 6 , 6 ]); % Skapa en begränsning som är giltig för alla i och j cons = { sum ( summa ( flöde ( i , j , k , l ), k ), l ) == 1 }; % Skapa en skalär baserat på multiplikationsavstånd med flera index = tomArray ([ 945 605 4667 4749 4394 ; ... 945 866 3726 3806 3448 ; ... 605 866 4471 4541 7 466 415 4541 7 415 415 15 ; .. 4749 3806 4541 109 431 ; ... 4394 3448 4152 415 431 ]) ; summatotal = summa ( vec (( avstånd ( i , k ) + avstånd ( l , j ) + ... avstånd ( k , l ) * .8 ) .* flöde ( i , j , k , l )));
Automatisk och numerisk differentiering
För funktioner som inte kan tolkas av tomSym är det möjligt att använda antingen automatisk differentiering eller numerisk differentiering. I följande exempel löses ett enkelt problem med de två metoderna.
0
toms x1 x2 alfa = 100 ; % ANVÄND MAD (AUTOMATISK DIFFERENTIERING) FÖR EN FUNKTION % % Skapa en omslagsfunktion. I det här fallet använder vi sin, men det kan vara vilken funktion som helst som stöds av % MAD. y = wrap ( struct ( 'roligt' , 'sin' , 'n' , 1 , 'sz1' , 1 , 'sz2' , 1 , 'JFuns' , 'MAD' ), x1 / x2 ); f = alfa * ( x2 - x1 ^ 2 ) ^ 2 + ( 1 - x1 ) ^ 2 + y ; % Ställ in och lös problemet c = - x1 ^ 2 - x2 ; con = { - 1000 <= c <= - 10 <= x1 <= 2 - 10 <= x2 <= 2 }; x0 = { x1 == - 1,2 x2 == 1 }; lösning1 = ezsolve ( f , con , x0 ); % ANVÄND NUMERISK DIFFERENTIERING FÖR EN FUNKTION % Skapa en ny omslagsfunktion. I det här fallet använder vi sin, men det kan vara % vilken funktion som helst eftersom vi använder numeriska derivator. y = wrap ( struct ( 'roligt' , 'sin' , 'n' , 1 , 'sz1' , 1 , 'sz2' , 1 , 'JFuns' , 'FDJac' ), x1 / x2 ); f = alfa * ( x2 - x1 ^ 2 ) ^ 2 + ( 1 - x1 ) ^ 2 + y ; lösning2 = ezsolve ( f , con , x0 );