TomSym

TomSym
Utvecklare Tomlab Optimization Inc.
Stabil frisättning
7.8 / 16 december 2011 ( 2011-12-16 )
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.

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  ); 

externa länkar