微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有python和错误ValueError的MPC:传递的`f0`具有多个维度

如何解决具有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 举报,一经查实,本站将立刻删除。