前提・実現したいこと
離散データの双スプライン補間で得た関数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件
あなたの回答
tips
プレビュー