DMC - Dynamic Matrix Control

154 days ago by PatrickHammer

Zusammenhänge
  x(t+1)=A*x(t)+B*u(t)
  y(t)=C*x(t)

Bezeichnungen
  r(t) in R^l          .. Die Werte die erreicht werden sollen  (Sollwert)
  x(t) in R^n        .. Umgebungs-Zustand
  u(t) in R^m      .. Stellgröße
  y(t) in R^l         .. Output/Messwert (Istwert)
  A Matrix           .. wie sich der vorherige Umgebungszustand auf den Nächsten auswirkt
  B Matrix           .. wie sich die Stellgröße auf den nächsten Umgebungszustand auswirkt
  C Matrix           .. wie aus der Umgebung gemessen wird

%hide %latex "Stellgröße" $u_1$ von der Folge $u:=\arg \min\limits_{u} ( \sum\limits_{t=1}^T{(w*(r_t-y_t)^2+(u_t-u_{t-1})^2)})$ 
       
def component_pow(x,p): return vector([a**p for a in x]) def component_abs(x): return vector([abs(a) for a in x]) class DMC: def __init__(self,A,B,C,x_0,T): self.x_0=x_0; self.x=x_0; self.T=T; self.A=A; self.B=B; self.C=C; self.dim=len(x_0) self.lasty=vector([0.0 for i in range(self.dim)]) def plant_reset(self): self.x=self.x_0 def plant_step(self,u): self.x=self.A*self.x+self.B*u self.lasty=self.C*self.x return self.lasty def x(self,t): return self.x_0 if t==0 else self.A*x(t-1)+self.B*u(t-1) def J(self,uarr): #qualität (todo wieder auf nxn verallgemeinern) def u(t): return vector([uarr[t]]) if t>0 else self.lasty #vector([uarr[t],uarr[t+1]]) val=vector([0.0 for i in range(self.dim)]) self.plant_reset(); z=0.0 for t in range(1,self.T+1): y=self.plant_step(u(t)) #val+=component_pow(u(t)-u(t-1),2.0)+self.w(t)*component_pow(y-self.r[t],2) #TODO downhill-simplex Du=component_abs(u(t)-u(t-1)) val+=Du+component_abs(y-self.r[t]) #linear if max(Du)>2: z+=1000#constraints rudimentär inzwischen return val.norm(1)+z def doStep(self,r,start,w): self.w=w; self.r=r solution=minimize(self.J,start,maxfun=100000) print "sol1",solution[1] self.plant_reset() self.plant_step(vector([solution[1]])) ##self.plant_step(vector([solution[0],solution[1]])) self.x_0=self.x #new base state of plant return solution 
       

Anwendung:

A=matrix([[1.0]]); B=matrix([[2.0]]); C=matrix([[3.0]]) T=8; x_0=vector([55.0]); dim=len(x_0) mpc=DMC(A,B,C,vector([55.0]),T) lastsolution=[0.0 for i in range(T+1)] lastpoint=(0,0); lastsoll=(0,0) pic=point(lastpoint) for k in range(7): val=90.0 if k>3: val=120 lastsolution=mpc.doStep([vector([val])for i in range(T+1)],lastsolution,lambda x:0.002) print "y",mpc.lasty,k P=(k,val); S=(k,mpc.lasty[0]) if k>0: pic+=line([lastpoint,P],color="red") pic+=line([lastsoll,S]) lastpoint=P; lastsoll=S show(pic) 
       
Optimization terminated successfully.
         Current function value: 1527.045670
         Iterations: 1200
         Function evaluations: 1986
sol1 -3.60485954731
y (143.370842716168) 0
Optimization terminated successfully.
         Current function value: 1159.069120
         Iterations: 707
         Function evaluations: 1088
sol1 -4.8446141587
y (114.303157763943) 1
Optimization terminated successfully.
         Current function value: 1118.002876
         Iterations: 410
         Function evaluations: 656
sol1 -3.0252707202
y (96.1515334427210) 2
Optimization terminated successfully.
         Current function value: 1105.576060
         Iterations: 503
         Function evaluations: 799
sol1 -1.02495513765
y (90.0018026168245) 3
Optimization terminated successfully.
         Current function value: 1144.418209
         Iterations: 1198
         Function evaluations: 1924
sol1 2.50958118815
y (105.059289745714) 4
Optimization terminated successfully.
         Current function value: 1121.637500
         Iterations: 641
         Function evaluations: 951
sol1 2.22221549594
y (118.392582721354) 5
Optimization terminated successfully.
         Current function value: 1120.996438
         Iterations: 479
         Function evaluations: 749
sol1 0.117018980809
y (119.094696606205) 6
Optimization terminated successfully.
         Current function value: 1527.045670
         Iterations: 1200
         Function evaluations: 1986
sol1 -3.60485954731
y (143.370842716168) 0
Optimization terminated successfully.
         Current function value: 1159.069120
         Iterations: 707
         Function evaluations: 1088
sol1 -4.8446141587
y (114.303157763943) 1
Optimization terminated successfully.
         Current function value: 1118.002876
         Iterations: 410
         Function evaluations: 656
sol1 -3.0252707202
y (96.1515334427210) 2
Optimization terminated successfully.
         Current function value: 1105.576060
         Iterations: 503
         Function evaluations: 799
sol1 -1.02495513765
y (90.0018026168245) 3
Optimization terminated successfully.
         Current function value: 1144.418209
         Iterations: 1198
         Function evaluations: 1924
sol1 2.50958118815
y (105.059289745714) 4
Optimization terminated successfully.
         Current function value: 1121.637500
         Iterations: 641
         Function evaluations: 951
sol1 2.22221549594
y (118.392582721354) 5
Optimization terminated successfully.
         Current function value: 1120.996438
         Iterations: 479
         Function evaluations: 749
sol1 0.117018980809
y (119.094696606205) 6