質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3436閲覧

(pythonライブラリ cvxpyを使った) 最適化問題の計算について

NR4200

総合スコア41

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2019/12/26 02:25

編集2019/12/26 04:13

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/12/31 01:26

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エラーが出ます。 制約の加え方がわからない、ということでしょうか?
NR4200

2020/01/03 14:20

プログラム内 constr = [x[:, t + 1] == A * x[:, t] + B * u[:, t], norm(u[:, t], 'inf') <= 1] で制約条件を入れるのはわかっているのですが,以下のホームページでは https://myenigma.hatenablog.com/entry/2016/07/25/214014 後から制約条件を加えることができると書かれていたのですが
guest

回答1

0

ベストアンサー

記事が書かれたのが2016-07-25、当時のcvxpyは0.4.2
現在2020-01-04現在、最新のcvxpyは1.0.25
バージョンがだいぶ変わって文法や用法が変わったものと思われます。


私のコメントにありますように、shapeがおかしいことに気づいた人が既に別の問題でこれ関係のバグ報告をしていました。

結果、

  • CVXPY v0.4.10では動く
  • 新しいバージョンではcreate後の変更は許可されない

だそうで、サンプルの更新が行われたそうです。
一例として別の問題ではありますが動くサンプルが公開されています。


ですので、一番早い解決策は古いcvxpyをインストールするです。
古いバージョンにはバグが含まれている可能性がありますので、新しいバージョンのチュートリアルを参考にされた方が良いかと思います。

投稿2020/01/03 19:34

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NR4200

2020/01/04 11:43

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問