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

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

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

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

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Q&A

解決済

1回答

1716閲覧

SciPy.Optimize.minimizeで双スプライン補間した関数を拘束条件にしたときのエラーの対応について

naaahaaa

総合スコア10

Python 3.x

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

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

0グッド

0クリップ

投稿2019/03/25 13:14

編集2019/03/25 15:05

前提・実現したいこと

離散データの双スプライン補間で得た関数z=f(x,y)において, zが最小となる(x,y)を求めるために,
SciPy.Optimize.minimize で(x,y)を求めるプログラムをPython 3.7.2で作成しています.

拘束条件を設定して実行すると, 3*x[0]**2-5*x[1]などの多項式関数では実行可能ですが,
双スプライン補間で得た関数を拘束条件に含めるとエラーが発生します.
エラーの解決方法ありましたらお願いします.

該当のソースコード

Python

1import numpy as np 2from scipy import interpolate 3from scipy.optimize import minimize, NonlinearConstraint 4xl= np.array([[0.0,100.0,200.0,300.0,400.0]]) 5yl= np.array([[0.0,25.0,50.0,75.0,100.0]]) 6a = np.array([[60.0,60.0,60.0,60.0,60.0], \ 7 [100.0,90.0,70.0,45.0,40.0], \ 8 [120.0,110.0,80.0,35.0,15.0], \ 9 [130.0,120.0,100.0,40.0,5.0], \ 10 [140.0,130.0,110.0,50.0,20.0], \ 11 ]) 12b = np.array([[0.0,0.0, 0.0, 0.0, 0.0], \ 13 [60.0, 70.0, 60.0, 45.0, 2.0], \ 14 [110.0,150.0,150.0,100.0,5.0], \ 15 [160.0,210.0,230.0,170.0,8.0], \ 16 [200.0,270.0,300.0,240.0,10.0], \ 17 ]) 18c = np.array([[100.0,100.0,100.0,100.0,100.0], \ 19 [200.0,180.0,140.0,120.0,120.0], \ 20 [300.0,250.0,200.0,180.0,170.0], \ 21 [350.0,310.0,250.0,240.0,230.0], \ 22 [400.0,360.0,300.0,320.0,310.0], \ 23 ]) 24 25A_sp = interpolate.RectBivariateSpline(xl, yl, a) 26B_sp = interpolate.RectBivariateSpline(xl, yl, b) 27C_sp = interpolate.RectBivariateSpline(xl, yl, c) 28#(値の取りうる範囲) 0≦x≦400, 0≦y≦100 29def A(x): 30 return A_sp(x[0],x[1]) 31def B(x): 32 return B_sp(x[0],x[1]) 33def func(x): 34 return C_sp(x[0],x[1]) 35def cons_f(x): 36 return [A_sp(x[0],x[1]),B_sp(x[0],x[1])] 37lb = [-np.inf, 30.00] 38ub = [50.00, np.inf] 39 40x0 = np.array([300.0,70.0], dtype=float) 41cons = NonlinearConstraint(cons_f, lb, ub, jac="2-point") 42result = minimize(func, x0, 43 constraints = cons, 44 bounds=((0, 500), (0, 100)), 45 method="trust-constr", 46 jac="2-point") 47print(result)

発生しているエラーメッセージ

raise ValueError("`f0` passed has more than 1 dimension.") ValueError: `f0` passed has more than 1 dimension.

試したこと

拘束条件部分を1つに減らしても同じエラーが発生しました.

Python

1def cons_f(x): 2 return A_sp(x[0],x[1]) 3lb = -np.inf 4ub = 500.00

拘束条件の記述を次のように変更しても同様のエラーが発生しました.

Python

1cons = ( 2 {'type': 'ineq', 'fun': lambda x: 50.0 - A_sp(x[0],x[1])}, 3 {'type': 'ineq', 'fun': lambda x: B_sp(x[0],x[1]) - 30} 4)

上記の記述に変更かつmethod="slsqp"と変更すると, 同様のエラーが発生します.

以下の場合ではエラーは発生しません.

Python

1cons = ( 2 {'type': 'ineq', 'fun': lambda x:np.array(x[0]**2-x[1])} 3) 4 5method="slsqp"

補足情報(FW/ツールのバージョンなど)

Python 3.7.2
SciPy 1.2.1
Spyder 3 で作成および実行

######参考にしたサイト

  1. 公式リファレンスガイド
  2. scipy.optimize.minimizeにおけるconstraintsオプションの与え方と意味について
  3. Python SciPy : 多変数スカラー関数の制約付き局所的最適化
  4. SciPyによる最適化(scipy.optimize)②|SciPy入門 #6

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

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

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

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

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

tiitoi

2019/03/25 13:18

コードはコピペで動かせる状態のものを載せてください。 現状のコードですと、NameError: name 'x' is not defined となります。
guest

回答1

0

自己解決

Python3.7.2

1def A(x): 2 return A_sp(x[0],x[1]).flatten()

でエラーが解消しました.

投稿2019/03/29 10:19

naaahaaa

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問