質問するログイン新規登録

質問編集履歴

2

プログラミングコードの記載、発生している問題の詳述

2022/11/23 07:29

投稿

Yuki.snow
Yuki.snow

スコア0

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
- ・最急降下法とニュート法の原理自体は大体理解してるのが、そもそもf(x, y) = x^2 + y^2 + exp(−x^2 − y^2)という式の計算方法や、(−1, −1)⊤ (2, −1)⊤ 「T」の意味りません...
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

マルチポストの記載

2022/11/21 07:30

投稿

Yuki.snow
Yuki.snow

スコア0

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