如何解决具有python和错误ValueError的MPC:传递的`f0`具有多个维度
我用python编写了一个MPC,并且以前可以使用。长时间后,我想再次使用它,但出现此错误
传递的f0
具有多个维度。
但是我没有改变我的鳕鱼。这有点奇怪。
他是我的鳕鱼:
import numpy as np
import numpy.linalg as npl
import matplotlib.pyplot as plt
from scipy.optimize import minimize
def mpcAugment(Am,Bm,Cm ):
"Function for Augmented Model"
nx,nu = Bm.shape
ny = Cm.shape[0]
A = np.zeros((nx+ny,nx+ny))
A[0:nx,0:nx] = Am
A[nx:nx+ny,0:nx] = Cm@Am
A[nx:nx+ny,nx:nx+ny] = np.eye(ny)
B = np.zeros((nx+ny,nu))
B[0:nx,:nu] = Bm
B[nx:nx+ny,:nu] = Cm@Bm
C = np.zeros((ny,nx+ny))
C[:ny,nx:nx+ny] = np.eye(ny)
return A,B,C
'Define Parameters'
k = 0.4
AICB = 153.8
mcp = 8.8e4
vamb1 = 30
vamb2 = 45
a = -k*AICB/mcp
b = -1/mcp
Ts = 20
VICBref = -5.0
Am = np.array([[1+Ts*a]])
Bm = np.array([[Ts*b]])
Gm = np.array([[-Ts*a]])
Cm = np.array([[1]])
A,C = mpcAugment(Am,Cm)
A,G,Gm,Cm)
nx,nu = B.shape
ny = C.shape[0]
nd = G.shape[1]
Np = 20
Nu = 5
F = np.zeros((NP*ny,nx))
PHI = np.zeros((NP*ny,Nu*nu))
PHIw = np.zeros((NP*ny,NP*nd))
for i in range(0,Np):
Ai = npl.matrix_power(A,i+1)
F[i*ny:(i+1)*ny,:] = C@Ai
for j in range(0,Nu):
if j <= i:
Aij = np.linalg.matrix_power(A,i-j)
PHI[i*ny:(i+1)*ny,j*nu:(j+1)*nu] = C@Aij@B
for j in range(0,Np):
if j <= i:
Aij = np.linalg.matrix_power(A,i-j)
PHIw[i*ny:(i+1)*ny,j*nd:(j+1)*nd] = C@Aij@G
umax = 3100
umin = 0
Q = np.eye(NP*ny)
R = 1e-2*np.eye(Nu*nu)
Rs = VICBref*np.ones((NP*ny,1))
Ainq = np.zeros((2*Nu*nu,Nu*nu))
binq = np.zeros((2*Nu*nu,1))
cinq = np.zeros((2*Nu*nu,1))
for i in range(0,Nu):
binq[i*nu:(i+1)*nu] = umax
binq[(i+Nu)*nu:(Nu+i+1)*nu] = 1
cinq[i*nu:(i+1)*nu] = 1
cinq[(i+Nu)*nu:(Nu+i+1)*nu] = -1
for j in range(0,i+1):
Ainq[i*nu:(i+1)*nu,j*nu:(j+1)*nu] = np.eye(nu)
Ainq[(i+Nu)*nu:(Nu+i+1)*nu,j*nu:(j+1)*nu] = np.eye(nu)
u0 = 0
def objective(du):
dU = np.array(du).reshape((len(du),1))
Y = F@x + PHI@dU + PHIw@w
return np.transpose((Rs-Y))@(Rs-Y)+np.transpose(dU)@R@(dU)
def constraint1(du):
dU = np.array(du).reshape((len(du),1))
return (binq - Ainq@dU - cinq*u0)[0]
#print(objective([1,1,1]))
ulim = (umin,umax)
bnds = np.kron(np.ones((Nu,1)),ulim)
#print(bnds)
Um = np.ones((nu*Nu,1))
Tsim = 5e4
time = np.arange(0,Tsim,Ts)
Nt = len(time)
xm = np.zeros((Nt,1))
um = np.zeros((Nt,nu))
ym = np.zeros((Nt,ny))
xm[0] = 0
ym[0] = Cm.dot(xm[0])
w = np.zeros((NP*nd,1))
print('Am = ',Am)
print('Bm = ',Bm)
print('Cm = ',Cm)
x = np.zeros((nx,1))
x[1] = xm[0]
vamb = vamb1
Vamb = np.zeros((Nt,1))
Ns = int(np.floor(Nt/2))
Vamb[0:Ns] = vamb1*np.ones((Ns,1))
Vamb[Ns:Nt] = vamb2*np.ones((Nt-Ns,1))
Vref = VICBref*np.ones((Nt,1))
con = {'type':'ineq','fun':constraint1}
for i in range(0,Nt-1):
sol = minimize(objective,Um,method = 'SLSQP',constraints = con)
if sol.success == False:
print('Error Cant solve problem')
exit()
Um = sol.x
um[i+1] = um[i] + Um[0]
u0 = um[i+1]
xm[i+1] = Am.dot(xm[i])+Bm.dot(um[i+1])+Gm.dot(Vamb[i])
ym[i+1] = Cm.dot(xm[i+1])
for j in range(0,Np):
if i+j < Nt:
Rs[j] = Vref[i+j]
w[j] = Vamb[i+j]-Vamb[i+j-1]
else:
Rs[j] = Vref[Nt-1]
w[j] = 0
x[0] = xm[i+1] - xm[i]
x[1] = xm[i+1]
print('Q = ',um[i+1],',VICB = ',xm[i+1],' vamb = ',Vamb[i])
hour = 60*60
plt.figure()
plt.subplot(2,1)
plt.plot(time/hour,ym)
plt.plot(time/hour,Vref,'--')
plt.xlabel('time(hours)')
plt.xlim([0,Tsim/hour])
plt.subplot(2,2)
plt.plot(time/hour,um)
plt.xlim([0,Tsim/hour])
plt.show()
关于一个控制器,它控制着一个冷却箱的温度。 simpy主鳕鱼有可能改变吗? 我认为问题出在最小化部分。
解决方法
我重新安装了所有库,并且一切正常
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。