前提・実現したいこと
現在、rosenbrock関数をニュートン法で解いています。
2変数の場合は解けましたが、それ以上になると正解にたどり着けません。
以下のプログラムは5変数で作成しています。
正解になるようにプログラムを修正したいのですが
どこが間違っているのか分かりません。
分かる方いらっしゃればよろしくお願いします。
発生している問題・エラーメッセージ
出力結果[0.96746637 0.93582304 0.87533204 0.71405052 0.50986815] 正解は[1,1,1,1,1]になります。 正解に近づくように訂正したいです。
該当のソースコード
python
1 2from mpl_toolkits.mplot3d import Axes3D 3from matplotlib import cm 4from matplotlib.ticker import LinearLocator, FormatStrFormatter 5import matplotlib.pyplot as plt 6import numpy as np 7 8H=np.zeros((5,5)) 9nabura=np.zeros(5) 10 11def f1(x1,x2,x3,x4,x5): 12 return 100*(x1**2-x2)**2+(x1-1)**2+100*(x2**2-x3)**2+(x2-1)**2+100*(x3**2-x4)**2+(x3-1)**2+100*(x4**2-x5)**2+(x4-1)**2 13 14def inverse_hesse_f1(x1x2x3x4x5): 15 x1=x1x2x3x4x5[0] 16 x2=x1x2x3x4x5[1] 17 x3=x1x2x3x4x5[2] 18 x4=x1x2x3x4x5[3] 19 x5=x1x2x3x4x5[4] 20 21 H[0,0]=100*(12*x1**2-4*x2)+2 22 for i in range(1,4): 23 H[i,i]=100*2+100*(12*x2**2-4*x3+2) 24 H[4,4]=100*2 25 26 for i in range(4): 27 H[i+1,i]=100*(-4*x1) 28 for i in range(4): 29 H[i,i+1]=100*(-4*x1) 30 31 try: 32 return np.linalg.inv(H) 33 except: 34 return np.array([[None, None,None,None,None], 35 [None, None,None,None,None], 36 [None, None,None,None,None], 37 [None, None,None,None,None], 38 [None, None,None,None,None]]) 39 40def gradient_f1(x1x2x3x4x5): 41 x1=x1x2x3x4x5[0] 42 x2=x1x2x3x4x5[1] 43 x3=x1x2x3x4x5[2] 44 x4=x1x2x3x4x5[3] 45 x5=x1x2x3x4x5[4] 46 47 nabura[0]=100*(4*x1**3-4*x1*x2)+2*x1-2 48 49 for i in range(1,4): 50 nabura[i]=100*(-2*x1**2+2*x2)+100*(4*x2**3-4*x2*x3)+2*x2-2 51 52 nabura[4]=100*(-2*x4**2+2*x5) 53 54 return nabura 55 56def gradient_descent_method(gradient_f, inverse_hesse_f, init_pos, learning_rate): 57 eps = 1e-10 58 59 init_pos = np.array(init_pos) 60 pos = init_pos 61 pos_history = [init_pos] 62 iteration_max = 100 63 64 for i in range(iteration_max): 65 66 print(i+1, ":", pos) 67 68 pos_new = pos - learning_rate * inverse_hesse_f(pos).dot(gradient_f(pos)) 69 70 if abs(np.linalg.norm(pos - pos_new)) < eps: 71 break 72 73 pos = pos_new 74 pos_history.append(pos) 75 76 77 return (pos, np.array(pos_history)) 78 79def main(): 80 learning_rates = [ 1 ] 81 82 for i, learning_rate in enumerate(learning_rates): 83 ans, pos_history = gradient_descent_method(gradient_f1, inverse_hesse_f1, (2,2,2,2,2) , learning_rate) 84 85main()
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー