parent
bab97dd359
commit
a97d7f47e9
@ -0,0 +1,7 @@
|
||||
# NC=30
|
||||
# for p in range(NC):
|
||||
# print('p', p)
|
||||
# for q in range(p + 1):
|
||||
# print('q', q)
|
||||
|
||||
|
@ -0,0 +1,76 @@
|
||||
import numpy as np
|
||||
import scipy.linalg
|
||||
from cvxopt import solvers, matrix
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
A = np.array([[1, 1], [-1, 2]])
|
||||
n = A.shape[0]
|
||||
|
||||
B = np.array([[1, 1], [1, 2]])
|
||||
p = B.shape[1]
|
||||
|
||||
Q = np.array([[1, 0], [0, 1]])
|
||||
F = np.array([[1, 0], [0, 1]])
|
||||
R = np.array([[1, 0], [0, 0.1]])
|
||||
|
||||
k_steps = 100
|
||||
|
||||
X_k = np.zeros((n, k_steps))
|
||||
|
||||
X_k[:, 0] = [10, -10]
|
||||
|
||||
U_k = np.zeros((p, k_steps))
|
||||
|
||||
N = 5
|
||||
|
||||
|
||||
def cal_matrices(A, B, Q, R, F, N):
|
||||
n = A.shape[0]
|
||||
p = B.shape[1]
|
||||
|
||||
M = np.vstack((np.eye((n)), np.zeros((N * n, n))))
|
||||
C = np.zeros(((N + 1) * n, N * p))
|
||||
tmp = np.eye(n)
|
||||
|
||||
for i in range(N):
|
||||
rows = i * n + n
|
||||
C[rows:rows + n, :] = np.hstack((np.dot(tmp, B), C[rows - n:rows, 0:(N - 1) * p]))
|
||||
tmp = np.dot(A, tmp)
|
||||
M[rows:rows + n, :] = tmp
|
||||
|
||||
Q_bar_be = np.kron(np.eye(N), Q)
|
||||
Q_bar = scipy.linalg.block_diag(Q_bar_be, F)
|
||||
R_bar = np.kron(np.eye(N), R)
|
||||
|
||||
G = np.matmul(np.matmul(M.transpose(), Q_bar), M)
|
||||
E = np.matmul(np.matmul(C.transpose(), Q_bar), M)
|
||||
H = np.matmul(np.matmul(C.transpose(), Q_bar), C) + R_bar
|
||||
|
||||
return H, E
|
||||
|
||||
|
||||
def Prediction(M, T):
|
||||
sol = solvers.qp(M, T)
|
||||
U_thk = np.array(sol["x"])
|
||||
u_k = U_thk[0:2, :]
|
||||
|
||||
return u_k
|
||||
|
||||
|
||||
M, C = cal_matrices(A, B, Q, R, F, N)
|
||||
M = matrix(M)
|
||||
|
||||
for k in range(1, k_steps):
|
||||
x_kshort = X_k[:, k - 1].reshape(2, 1)
|
||||
u_kshort = U_k[:, k - 1].reshape(2, 1)
|
||||
T = np.dot(C, x_kshort)
|
||||
T = matrix(T)
|
||||
for i in range(2):
|
||||
U_k[i:, k - 1] = Prediction(M, T)[i, 0]
|
||||
|
||||
X_knew = np.dot(A, x_kshort) + np.dot(B, u_kshort)
|
||||
|
||||
for j in range(2):
|
||||
X_k[j:, k] = X_knew[j, 0]
|
||||
|
||||
print(X_k)
|
Loading…
Reference in New Issue