##パイソンを使って等高線のグラフを書いております。
ですが、配列の数が合わないというエラーでうまく書くことができません。
下記のように、プロット関数に直接、関数を書いて出力すると、等高線がかけるのですが、
python
1import numpy as np 2import matplotlib.pyplot as plt 3 4rosenbrockfunction = lambda x,y: (1-x)**2+100*(y-x**2)**2 5X,Y=np.meshgrid(np.linspace(-5,5,100),np.linspace(-5,5,100)) 6Z=rosenbrockfunction(X,Y) 7cs=plt.contour(X,Y,Z,np.logspace(0,3.5,7,base=10)) 8plt.show()
ですが、
下記のように、関数を分けると、
_zは二次元行列です
_配列数が合いません
とエラーが出ます。
python
1import math 2import utils 3import utils2 4import numpy as np 5import sys 6import matplotlib.pyplot as plt 7from mpl_toolkits.mplot3d import Axes3D 8import sys 9import csv 10import os 11 12 13def cont(func): 14 15 X,Y=np.meshgrid(np.linspace(-5,5,100),np.linspace(-5,5,100)) 16 t=np.array([X,Y]) 17 Z,_=func(t) 18 Z=np.matrix(Z) 19 #print("length",X.shape[1],Y.shape[1],Z.shape[0],Y.shape[1]) 20 #print("X",X , "Y", Y, "Z", Z) 21 #Z.reshape(X.shape[0],Y.shape[1]) 22 cs=plt.contour(X,Y,Z,np.logspace(0,3.5,7,base=10)) 23 plt.show() 24 25 26def rosenbrock(x): 27 global FUNCCALLS 28 FUNCCALLS += 1 29 30 31 funcValue = (100*((x[1]-x[0]**2)**2) + (1-x[0])**2) 32 gradient = np.matrix([(-400*x[0]*(x[1]-x[0]**2)-2*(1-x[0])), (200*(x[1]-x[0]*x[0]))]).T 33 34 return funcValue, gradient 35 36 37def uncon(func, x0, epsilon_g, options=None): 38 39 40 if options is None: 41 42 n=2 43 xopt, fopt, outputs = optimize(func, x0, epsilon_g,n) 44 45 return xopt, fopt, outputs 46 47 48 49nTrails=10 50testFuncs = [rosenbrock] 51 52for _, func in enumerate(testFuncs): 53 54 np.random.seed(0) 55 56 trialScore = 0 57 for _ in range(nTrails): 58 FUNCCALLS = 0 59 60 x0 = np.random.normal(size=2)*3 61 62 #xopt, fopt, output = uncon(func, x0, 1e-6) 63 cont(func) 64 sys.exit(1)
このまま実行をすると、
error
1Traceback (most recent call last): 2 File "stud2.py", line 65, in <module> 3 cont(func) 4 File "stud2.py", line 18, in cont 5 Z,_=func(t) 6 File "stud2.py", line 34, in rosenbrock 7 gradient = np.matrix([(-400*x[0]*(x[1]-x[0]**2)-2*(1-x[0])), (200*(x[1]-x[0]*x[0]))]).T 8 File "/Users/mizuhotakayama/.pyenv/versions/3.8.1/lib/python3.8/site-packages/numpy/matrixlib/defmatrix.py", line 151, in __new__ 9 raise ValueError("matrix must be 2-dimensional") 10ValueError: matrix must be 2-dimensional
とエラーが出てしまいます。
XとYのdimension数を合わせなければいけないと思い、
python
1Z.reshape(X.shape[0],X.shape[1])
のように、配列数を合わせようとしてみたのですが、
error
1 Z.reshape(X.shape[0],Y.shape[1]) 2ValueError: cannot reshape array of size 100 into shape (100,100)
上下のプログラムで、関数を分けて居るかどうかだけなのに、何故答えが出せないのか、と悩んでいます。
リストや行列への変換も、考えられるペアで変えてみましたが、出来ませんでした。
また、Zを100x100行列で静的行列にしてから計算しても、出力されませんでした。
Z=[[0 for I in range(100)] for j in range(100)]
私のコードの間違いを教えていただけないでしょうか。
回答2件
あなたの回答
tips
プレビュー