前提・実現したいこと
pythonライブラリのcvxpyを使って最適化問題を解こうとしています.
cvxpyを使うのが初めてなので調べながらやっているのですが,
ネット上に乗っていたコードをそのまま実行してもエラーが出るので,
実行できるようにプログラムを変更しています.
まず初めに
プログラム内
x = Variable(n, T + 1)
u = Variable(m, T)
だと以下のエラーが出たので
PS C:\Users\N\Desktop> python test.py Simulation start Traceback (most recent call last): File "test.py", line 21, in <module> x = Variable(n, T + 1) File "C:\Users\N\AppData\Local\Programs\Python\Python37\lib\site-packages\cvxpy\expressions\variable.py", line 75, in __init__ raise TypeError("Variable name %s must be a string." % name) TypeError: Variable name 51 must be a string.
x = Variable((n, T + 1))
u = Variable((m, T))
に変更しました.
そして実行すると
プログラム上のprob.constraints += [x[:,T] == 0, x[:,0] == x_0]に対してエラーが出てたのですが,他のサイト等を調べても同様に書かれているのでどこが違うのかわかりません.
prob.constraints += [x[:,T] == 0, x[:,0] == x_0]を記述することで制約条件を2つ追加できるそうなのですが....
載せているソースコードは
x = Variable((n, T + 1))
u = Variable((m, T))
に変更したものを載せています.
発生している問題・エラーメッセージ
PS C:\Users\N\Desktop> python test.py Simulation start Traceback (most recent call last): File "test.py", line 32, in <module> prob.constraints += [x[:, T] == 0, x[:, 0] == x_0] File "C:\Users\N\AppData\Local\Programs\Python\Python37\lib\site-packages\cvxpy\expressions\expression.py", line 46, in cast_op return binary_op(self, other) File "C:\Users\N\AppData\Local\Programs\Python\Python37\lib\site-packages\cvxpy\expressions\expression.py", line 575, in __eq__ return Equality(self, other) File "C:\Users\N\AppData\Local\Programs\Python\Python37\lib\site-packages\cvxpy\constraints\zero.py", line 114, in __init__ self._expr = lhs - rhs File "C:\Users\N\AppData\Local\Programs\Python\Python37\lib\site-packages\cvxpy\expressions\expression.py", line 46, in cast_op return binary_op(self, other) File "C:\Users\N\AppData\Local\Programs\Python\Python37\lib\site-packages\cvxpy\expressions\expression.py", line 464, in __sub__ return self + -other File "C:\Users\N\AppData\Local\Programs\Python\Python37\lib\site-packages\cvxpy\expressions\expression.py", line 46, in cast_op return binary_op(self, other) File "C:\Users\N\AppData\Local\Programs\Python\Python37\lib\site-packages\cvxpy\expressions\expression.py", line 452, in __add__ return cvxtypes.add_expr()([self, other]) File "C:\Users\N\AppData\Local\Programs\Python\Python37\lib\site-packages\cvxpy\atoms\affine\add_expr.py", line 33, in __init__ super(AddExpression, self).__init__(*arg_groups) File "C:\Users\N\AppData\Local\Programs\Python\Python37\lib\site-packages\cvxpy\atoms\atom.py", line 45, in __init__ self._shape = self.shape_from_args() File "C:\Users\N\AppData\Local\Programs\Python\Python37\lib\site-packages\cvxpy\atoms\affine\add_expr.py", line 41, in shape_from_args return u.shape.sum_shapes([arg.shape for arg in self.args]) File "C:\Users\N\AppData\Local\Programs\Python\Python37\lib\site-packages\cvxpy\utilities\shape.py", line 49, in sum_shapes len(shapes)*" %s" % tuple(shapes)) ValueError: Cannot broadcast dimensions (4,) (4, 1)
該当のソースコード
python
1import time 2from cvxpy import * 3import numpy as np 4import matplotlib.pyplot as plt 5print("Simulation start") 6 7np.random.seed(1) 8n = 4 # state size 9m = 2 # input size 10T = 50 # number of horizon 11 12# simulation parameter 13alpha = 0.2 14beta = 5.0 15 16# Model Parameter 17A = np.eye(n) + alpha * np.random.randn(n, n) 18B = np.random.randn(n, m) 19x_0 = beta * np.random.randn(n, 1) 20 21x = Variable((n, T + 1)) 22u = Variable((m, T)) 23 24states = [] 25for t in range(T): 26 cost = sum_squares(x[:, t + 1]) + sum_squares(u[:, t]) 27 constr = [x[:, t + 1] == A * x[:, t] + B * u[:, t], 28 norm(u[:, t], 'inf') <= 1] 29 states.append(Problem(Minimize(cost), constr)) 30# sums problem objectives and concatenates constraints. 31prob = sum(states) 32prob.constraints += [x[:, T] == 0, x[:, 0] == x_0] 33 34start = time.time() 35result = prob.solve(verbose=True) 36elapsed_time = time.time() - start 37print ("calc time:{0}".format(elapsed_time) + "[sec]") 38 39if result == float("inf"): 40 print("Cannot optimize") 41 import sys 42 sys.exit() 43 # return 44 45#以下グラフの表示 46f = plt.figure() 47# Plot (u_t)_1. 48ax = f.add_subplot(211) 49u1 = np.array(u[0, :].value[0, :])[0].tolist() 50u2 = np.array(u[1, :].value[0, :])[0].tolist() 51plt.plot(u1, '-r', label="u1") 52plt.plot(u2, '-b', label="u2") 53plt.ylabel(r"$u_t$", fontsize=16) 54plt.yticks(np.linspace(-1.0, 1.0, 3)) 55plt.legend() 56plt.grid(True) 57 58# Plot (u_t)_2. 59plt.subplot(2, 1, 2) 60x1 = np.array(x[0, :].value[0, :])[0].tolist() 61x2 = np.array(x[1, :].value[0, :])[0].tolist() 62x3 = np.array(x[2, :].value[0, :])[0].tolist() 63x4 = np.array(x[3, :].value[0, :])[0].tolist() 64plt.plot(range(T + 1), x1, '-r', label="x1") 65plt.plot(range(T + 1), x2, '-b', label="x2") 66plt.plot(range(T + 1), x3, '-g', label="x3") 67plt.plot(range(T + 1), x4, '-k', label="x4") 68plt.yticks([-25, 0, 25]) 69plt.ylim([-25, 25]) 70plt.ylabel(r"$x_t$", fontsize=16) 71plt.xlabel(r"$t$", fontsize=16) 72plt.grid(True) 73plt.legend() 74plt.tight_layout() 75plt.show() 76
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
x_0のshapeは(4, 1)、x[:, 0]のshapeは(4,)ですので、
prob.constraints += [x[:, T] == 0, x[:, 0] == x_0.flatten()]
とすればshapeの問題は解決できます。
が、これではAttributeError: can't set attributeエラーが出ます。
制約の加え方がわからない、ということでしょうか?
プログラム内
constr = [x[:, t + 1] == A * x[:, t] + B * u[:, t],
norm(u[:, t], 'inf') <= 1]
で制約条件を入れるのはわかっているのですが,以下のホームページでは
https://myenigma.hatenablog.com/entry/2016/07/25/214014
後から制約条件を加えることができると書かれていたのですが
回答1件
あなたの回答
tips
プレビュー