質問編集履歴
2
プログラミングコードの記載、発生している問題の詳述
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
### 前提
|
2
|
+
講義で、以下の問題が課題になっているのですが、極めて初歩的なプログラミングしか知らず...
|
2
|
-
|
3
|
+
必須単位なので、何とか問題を解きたいのですが...
|
3
|
-
考え方のヒントでも構いませんので、どなたか御指南下さいますでしょうか
|
4
|
+
基本中の基本をお伺いしている部分も多いかと存じますが、考え方のヒントでも構いませんので、どなたか御指南下さいますでしょうか...
|
5
|
+
|
6
|
+
なお、今回、初めてこちらに投稿させて頂いておりますため、ルールなど、不束なことも多いかと存じます。
|
7
|
+
ご指導、ご寛恕いただけましたら幸いです。
|
4
|
-
よろしくお願いいたします
|
8
|
+
よろしくお願いいたします。
|
5
9
|
===================================--
|
10
|
+
問題文
|
6
11
|
|
7
12
|
(i), (ii) の 2 変数関数の(無制約)最小化問題に対し,関数が凸であるか否かを解析的に判定し,バックトラッキング法を用いた最急降下法とニュートン法を適用した場合の解の挙動を以下の観点から調べて説明せよ
|
8
13
|
(Python等での実装、もしくはExcelでのグラフor表での表記をすること)
|
@@ -23,27 +28,104 @@
|
|
23
28
|
・バックトラッキング法を用いた最急降下法とニュートン法を適用した場合の解の挙動をPythonで実装
|
24
29
|
|
25
30
|
### 発生している問題・エラーメッセージ
|
31
|
+
ニュートン法での方の実装を進めているのですが、(私の認識できている限りでは)以下の点について問題が起きてしまっています。
|
26
32
|
|
33
|
+
①特定の値についての勾配ベクトルしか求めることが出来ず、xとyを用いた一般的な式が求められない
|
27
|
-
|
34
|
+
②ヘッセ行列を求めるプログラミングが作成できない(申し訳ありません、知識的に手計算ではヘッセ行列が求められず、Pythonで計算しようとしたのですが、それもできなかった形です)
|
28
35
|
|
29
|
-
・このため、再急降下法やニュートン法を実装したウェブサイトを見つけても、どこをいじれば本問に合わせられるのか、また、f(x, y) = x^2 + y^2 + exp(−x^2 − y^2)をどのようにプログラミング言語的に書いたらよいのかわかりません...
|
30
36
|
|
31
37
|
|
32
38
|
エラーメッセージ
|
33
39
|
```
|
34
40
|
|
35
41
|
### 該当のソースコード
|
36
|
-
使用言語はPythonを考えております。
|
42
|
+
使用言語はPythonを考えております。以下が、現時点でのコードの全文です。
|
37
|
-
```ここに言語名を入力
|
38
|
-
ソースコード
|
39
43
|
```
|
44
|
+
import numpy as np
|
45
|
+
import matplotlib.pyplot as plt
|
46
|
+
from mpl_toolkits.mplot3d import Axes3D
|
40
47
|
|
48
|
+
#関数の図示
|
49
|
+
N = 41 #N=41の意味は理解できていません...
|
50
|
+
x1 = np.linspace(-2, 2, N)
|
51
|
+
x2 = np.linspace(-2, 2, N)
|
52
|
+
|
53
|
+
X1, X2 = np.meshgrid(x1, x2)
|
54
|
+
|
55
|
+
|
56
|
+
Y = X1 ** 2 + X2 ** 2 + np.exp(- X1 ** 2 - X2 ** 2)
|
57
|
+
|
58
|
+
fig = plt.figure()
|
59
|
+
ax = fig.add_subplot(111, projection='3d')
|
60
|
+
surf = ax.plot_surface(X1, X2, Y, cmap='bwr', linewidth=0)
|
61
|
+
fig.colorbar(surf)
|
62
|
+
ax.set_xlabel("x1")
|
63
|
+
ax.set_ylabel("x2")
|
64
|
+
fig.show()
|
65
|
+
|
66
|
+
#極小値は(0,0)
|
67
|
+
|
68
|
+
#勾配ベクトルの計算、ヘッセ行列の求め方は分からず...
|
69
|
+
import numpy as np
|
70
|
+
|
71
|
+
def numerical_gradient(f,x):
|
72
|
+
h = 1e-4
|
73
|
+
grad = np.zeros_like(x)
|
74
|
+
|
75
|
+
for idx in range(x.size):
|
76
|
+
tmp_val = x[idx]
|
77
|
+
|
78
|
+
# f(x+h)の計算
|
79
|
+
x[idx] = tmp_val + h
|
80
|
+
fxh1 = f(x)
|
81
|
+
|
82
|
+
#f(x-h)の計算
|
83
|
+
x[idx] = tmp_val - h
|
84
|
+
fxh2 = f(x)
|
85
|
+
|
86
|
+
grad[idx] = (fxh1 - fxh2) / (2*h)
|
87
|
+
x[idx] = tmp_val # 値を元に戻す
|
88
|
+
|
89
|
+
return grad
|
90
|
+
|
91
|
+
def func_2(x):
|
92
|
+
return x[0] ** 2 + x[1] ** 2 + np.exp(- x[0] ** 2 - x[1] ** 2)
|
93
|
+
|
94
|
+
numerical_gradient(func_2,np.array([0.0,0.0])) #ここで、特定の値についての勾配ベクトルしか求めることが出来ず、xとyを用いた一般的な式が求められません
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
def f(x0, x1):
|
99
|
+
#y = 勾配ベクトル
|
100
|
+
dydx = np.array([4*x0**3 + 2*x0 + x1,
|
101
|
+
x0 + 2*x1 + 8*x1**3])
|
102
|
+
#H = np.array([ヘッセ行列])
|
103
|
+
return y, dydx, H
|
104
|
+
|
105
|
+
#ニュートン法を用いた関数の最小化、初期値(-1,-1)
|
106
|
+
x0, x1 = -1, -1
|
107
|
+
print("i x1 x2 f(x)")
|
108
|
+
for i in range(10):
|
109
|
+
y, dydx, H = f(x0, x1)
|
110
|
+
print(f"{i:3d} [{x0:10.3e}, {x1:10.3e}], {y:10.3e}")
|
111
|
+
d = - np.dot(np.linalg.inv(H), dydx)
|
112
|
+
x0 += d[0]
|
113
|
+
x1 += d[1]
|
114
|
+
```
|
115
|
+
|
41
116
|
### 試したこと
|
42
117
|
|
43
|
-
ネット上の再急降下法やニュートン法を実装したコードを、一部書き換えて実装しようとし
|
118
|
+
ネット上の再急降下法やニュートン法を実装したコードを、一部書き換えさせていただいて実装しようとしています
|
119
|
+
現時点で主に参考にさせて頂いているのは
|
120
|
+
・ニュートン法について:https://helve-blog.com/posts/math/newtons-method-python/
|
121
|
+
・勾配ベクトルの求め方について:https://www.f.waseda.jp/yusukekondo/TALLFALL19/TALLFALL0302.html
|
122
|
+
のサイトです。
|
44
123
|
|
124
|
+
基本的に、コードをコピーさせて頂いて、xやyの部分を適宜変更しているため、変数名が一定でなかったりしているかもしれません...
|
125
|
+
|
45
126
|
### 補足情報(FW/ツールのバージョンなど)
|
46
127
|
|
47
128
|
ここにより詳細な情報を記載してください。
|
48
129
|
Yahoo 知恵袋さんに既に投稿させて頂いていたのですが、プログラミングを含むため、より専門的なこちらにお伺いさせていただけないかとマルチポストさせていただきました...
|
49
|
-
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12271242377
|
130
|
+
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12271242377
|
131
|
+
|
1
マルチポストの記載
title
CHANGED
File without changes
|
body
CHANGED
@@ -45,3 +45,5 @@
|
|
45
45
|
### 補足情報(FW/ツールのバージョンなど)
|
46
46
|
|
47
47
|
ここにより詳細な情報を記載してください。
|
48
|
+
Yahoo 知恵袋さんに既に投稿させて頂いていたのですが、プログラミングを含むため、より専門的なこちらにお伺いさせていただけないかとマルチポストさせていただきました...
|
49
|
+
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12271242377
|