質問編集履歴

3

記入漏れの追加

2020/04/30 13:18

投稿

csko17118
csko17118

スコア1

test CHANGED
File without changes
test CHANGED
@@ -52,19 +52,39 @@
52
52
 
53
53
  ```
54
54
 
55
+ そして、このファイルをsympy_Multivariable.pyと名付け、anacondaのsite-packages内に自分で作った
56
+
57
+ myfunction\math\define内に保存しました。
58
+
59
+
60
+
55
61
  こうすることで
56
62
 
63
+ jupyter notebookで
64
+
65
+ ```
66
+
67
+ from myfunction.math.define import sympy_Multivariable as SMV
68
+
69
+ defx=SMV.defx(6)
70
+
71
+ print(defx)
72
+
73
+ ```
74
+
75
+ と入力すれば
76
+
57
77
  ```
58
78
 
59
79
  x=[Symbol('x[0]'),Symbol('x[1]'),Symbol('x[2]'),Symbol('x[3]'),Symbol('x[4]'),Symbol('x[5]')]
60
80
 
61
81
  ```
62
82
 
63
- のようなテキストを生成できます
83
+ と表示されます
64
-
65
-
66
-
67
- そして、このファイルをsympy_Multivariable.pyと名付け、anacondaのsite-packages内に自分で作ったmyfunction\math\define内に保存しました。
84
+
85
+
86
+
87
+
68
88
 
69
89
 
70
90
 

2

書式の改善

2020/04/30 13:18

投稿

csko17118
csko17118

スコア1

test CHANGED
File without changes
test CHANGED
@@ -54,7 +54,11 @@
54
54
 
55
55
  こうすることで
56
56
 
57
+ ```
58
+
57
- defx=defx(6)='x=[Symbol('x[0]'),Symbol('x[1]')・・・,Symbol('x[5]')]'
59
+ x=[Symbol('x[0]'),Symbol('x[1]'),Symbol('x[2]'),Symbol('x[3]'),Symbol('x[4]'),Symbol('x[5]')]
60
+
61
+ ```
58
62
 
59
63
  のようなテキストを生成できます
60
64
 

1

書式の改善

2020/04/30 13:11

投稿

csko17118
csko17118

スコア1

test CHANGED
File without changes
test CHANGED
@@ -12,17 +12,143 @@
12
12
 
13
13
 
14
14
 
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
15
+ ### 該当のソースコード
16
+
17
+
18
+
19
+ なぜこのようなことをしてたいかとというとsympyでn次元勾配ベクトルとn行n列のヘッセ行列の計算を自作関数でモジュール化したいのですが、そのためのsympy内での変数の定義がうまくいかないことです。例えば2次元ベクトルで定義する場合,x=[Symbol('x[0]'),Symbol('x[1]')]のように描かなければならないのですが、これをn次元でやろうとするとx=[Symbol('x[0]'),Symbol('x[1]')・・・,Symbol('x[n-1]')]となってしまうためソースコードがかけません。そこで以下のような自作関数をまず定義しました。
20
+
21
+
22
+
23
+ ```
24
+
25
+ def defx(n):
26
+
27
+ name1='Symbol(' #変数xベクトルの定義(開始)
28
+
29
+ name2="'"
30
+
31
+ name3='x['
32
+
33
+ name4=']'
34
+
35
+ name5='),'
36
+
37
+ name6='x=['
38
+
39
+ u=''
40
+
41
+ for i1 in range(n):
42
+
43
+ u=u+name1+name2+name3+str(i1)+name4+name2+name5
44
+
45
+
46
+
47
+ u=u[:-1]
48
+
49
+ vx=name6+u+name4
50
+
51
+ return vx
52
+
53
+ ```
54
+
55
+ こうすることで
56
+
57
+ defx=defx(6)='x=[Symbol('x[0]'),Symbol('x[1]')・・・,Symbol('x[5]')]'
58
+
59
+ のようなテキストを生成できます
60
+
61
+
62
+
63
+ そして、このファイルをsympy_Multivariable.pyと名付け、anacondaのsite-packages内に自分で作ったmyfunction\math\define内に保存しました。
64
+
65
+
66
+
67
+ ここからが本題です。
68
+
69
+ まずこのように自作関数をつくりました。
70
+
71
+ ```
72
+
73
+ from sympy import *
74
+
75
+ from sympy import sin,cos,tan,exp,log
76
+
77
+ from myfunction.math.define import sympy_Multivariable as SMV      #上のテキストを生成するための自作関数
78
+
79
+
80
+
81
+ def grad(L,n):                                #n次元勾配ベクトルを生成するための自作関数
82
+
83
+ defx=SMV.defx(n)                            #xの定義コードを自作関数からテキストとして生成     
84
+
85
+ exec(defx) #変数xの定義
86
+
87
+ nL=[diff(L,x[i1]) for i1 in range(n)]
88
+
89
+ return nL
90
+
91
+
92
+
93
+ def Hesse(L,n): #ヘッセ行列を生成するための自作関数の定義
94
+
95
+ defx=SMV.defx(n)                             #xの定義コードを自作関数からテキストとして生成 
96
+
97
+ exec(defx)                                #変数xの定義
98
+
99
+ nL=[diff(L,x[i1]) for i1 in range(n)]
100
+
101
+ HL=[[diff(nL[i2],x[i3]) for i2 in range(n)] for i3 in range(n)]
102
+
103
+ return HL
104
+
105
+ ```
106
+
107
+ ちなみにこの自作関数のファイルはdiff.pyと名付け、anacondaのsite-packages内に自分で作ったmyfunction\math\analysis内に保存しました。
108
+
109
+
110
+
111
+ そして今度はjupyter notebookで以下のようなソースコードを組んでみました。
112
+
113
+ ```
114
+
115
+ from sympy import *
116
+
117
+ from sympy import sin,cos,tan,exp,log
118
+
119
+ from myfunction.math.analysis import diff #勾配ベクトルとヘッセ行列の自作関数
120
+
121
+ from myfunction.math.define import sympy_Multivariable as SMV   #変数xの定義コード生成のための自作関数
122
+
123
+
124
+
125
+ n=2 #変数の数nの決定
126
+
127
+ defx=SMV.defx(n) #xの定義コードを自作関数からテキストとして生成 
128
+
129
+ exec(defx) #変数xの定義
130
+
131
+ f=sin(x[0]*x[1]) #勾配ベクトルとヘッセ行列を求めるための関数f
132
+
133
+ nf=diff.grad(f,n) #勾配ベクトルの計算
134
+
135
+ Hf=diff.Hesse(f,n) #ヘッセ行列の計算
136
+
137
+ print(nf) #勾配ベクトルの表示
138
+
139
+ print(Hf) #ヘッセ行列の表示
140
+
141
+ ```
142
+
143
+
144
+
145
+
146
+
147
+ このプログラムを実行したときに勾配ベクトルとヘッセ行列の自作関数が定義されていないとエラーメッセージが出るのですがそもそも、自作関数内でexec関数が動作しないということなのでしょうか?
148
+
149
+
150
+
151
+ この原因についてわかる方がいたら教えてください。
26
152
 
27
153
  ■■な機能を実装中に以下のエラーメッセージが発生しました。
28
154
 
@@ -30,145 +156,59 @@
30
156
 
31
157
  ### 発生している問題・エラーメッセージ
32
158
 
33
-
34
-
35
-
36
-
37
- エラーメッセージ
38
-
39
-
40
-
41
- ### 該当のソースコード
42
-
43
- ```python
44
-
45
- ```なぜこのようなことをしてたいかとというとsympyでn次元勾配ベクトルとn行n列のヘッセ行列の計算を自作関数でモジュール化したいのですが、そのためのsympy内での変数の定義がうまくいかないことです。例えば2次元ベクトルで定義する場合,x=[Symbol('x[0]'),Symbol('x[1]')]のように描かなければならないのですが、これをn次元でやろうとするとx=[Symbol('x[0]'),Symbol('x[1]')・・・,Symbol('x[n-1]')]となってしまうためソースコードがかけません。そこで以下のような自作関数をまず定義しました。
46
-
47
-
48
-
49
- def defx(n):
50
-
51
- name1='Symbol(' #変数xベクトルの定義(開始)
52
-
53
- name2="'"
54
-
55
- name3='x['
56
-
57
- name4=']'
58
-
59
- name5='),'
60
-
61
- name6='x=['
62
-
63
- u=''
64
-
65
- for i1 in range(n):
66
-
67
- u=u+name1+name2+name3+str(i1)+name4+name2+name5
68
-
69
-
70
-
71
- u=u[:-1]
72
-
73
- vx=name6+u+name4
74
-
75
- return vx
76
-
77
-
78
-
79
- こうすることで
80
-
81
- defx=defx(6)='x=[Symbol('x[0]'),Symbol('x[1]')・・・,Symbol('x[5]')]'
82
-
83
- のようなテキストを生成できます
84
-
85
-
86
-
87
- そして、このファイルをsympy_Multivariable.pyと名付け、anacondaのsite-packages内に自分で作ったmyfunction\math\define内に保存しました。
88
-
89
-
90
-
91
- ここからが本題です。
92
-
93
- まずこのように自作関数をつくりました。
94
-
95
-
96
-
97
- from sympy import *
98
-
99
- from sympy import sin,cos,tan,exp,log
100
-
101
- from myfunction.math.define import sympy_Multivariable as SMV      #上のテキストを生成するための自作関数
102
-
103
-
104
-
105
- def grad(L,n):                                #n次元勾配ベクトルを生成するための自作関数
106
-
107
- defx=SMV.defx(n)                            #xの定義コードを自作関数からテキストとして生成     
108
-
109
- exec(defx) #変数xの定義
110
-
111
- nL=[diff(L,x[i1]) for i1 in range(n)]
112
-
113
- return nL
114
-
115
-
116
-
117
- def Hesse(L,n): #ヘッセ行列を生成するための自作関数の定義
118
-
119
- defx=SMV.defx(n)                             #xの定義コードを自作関数からテキストとして生成 
120
-
121
- exec(defx)                                #変数xの定義
122
-
123
- nL=[diff(L,x[i1]) for i1 in range(n)]
124
-
125
- HL=[[diff(nL[i2],x[i3]) for i2 in range(n)] for i3 in range(n)]
126
-
127
- return HL
128
-
129
-
130
-
131
- ちなみにこの自作関数のファイルはdiff.pyと名付け、anacondaのsite-packages内に自分で作ったmyfunction\math\analysis内に保存しました。
132
-
133
-
134
-
135
- そして今度はjupyter notebookで以下のようなソースコードを組んでみました。
136
-
137
- from sympy import *
138
-
139
- from sympy import sin,cos,tan,exp,log
140
-
141
- from myfunction.math.analysis import diff #勾配ベクトルとヘッセ行列の自作関数
142
-
143
- from myfunction.math.define import sympy_Multivariable as SMV   #変数xの定義コード生成のための自作関数
144
-
145
-
146
-
147
- n=2 #変数の数nの決定
148
-
149
- defx=SMV.defx(n) #xの定義コードを自作関数からテキストとして生成 
150
-
151
- exec(defx) #変数xの定義
152
-
153
- f=sin(x[0]*x[1]) #勾配ベクトルとヘッセ行列を求めるための関数f
154
-
155
- nf=diff.grad(f,n) #勾配ベクトルの計算
156
-
157
- Hf=diff.Hesse(f,n) #ヘッセ行列の計算
158
-
159
- print(nf) #勾配ベクトルの表示
160
-
161
- print(Hf) #ヘッセ行列の表示
162
-
163
-
164
-
165
-
166
-
167
- このプログラムを実行したときに勾配ベクトルとヘッセ行列の自作関数が定義されていないとエラーメッセージが出るのですがそもそも、自作関数内でexec関数が動作しないということなのでしょうか?
168
-
169
-
170
-
171
- この原因についてわかる方がいたら教えてください。
159
+ ```
160
+
161
+ NameError Traceback (most recent call last)
162
+
163
+ <ipython-input-6-cf230244345a> in <module>
164
+
165
+ 9 exec(defx)
166
+
167
+ 10 f=sin(x[0]*x[1])
168
+
169
+ ---> 11 nf=diff.grad(f,n)
170
+
171
+ 12 Hf=diff.Hesse(f,n)
172
+
173
+ 13 print(nf)
174
+
175
+
176
+
177
+ ~\Anaconda3\lib\site-packages\myfunction\math\analysis\diff.py in grad(L, n)
178
+
179
+ 6 defx=SMV.defx(n)
180
+
181
+ 7 exec(defx)
182
+
183
+ ----> 8 nL=[diff(L,x[i5]) for i5 in range(n)]
184
+
185
+ 9 return nL
186
+
187
+ 10
188
+
189
+
190
+
191
+ ~\Anaconda3\lib\site-packages\myfunction\math\analysis\diff.py in <listcomp>(.0)
192
+
193
+ 6 defx=SMV.defx(n)
194
+
195
+ 7 exec(defx)
196
+
197
+ ----> 8 nL=[diff(L,x[i5]) for i5 in range(n)]
198
+
199
+ 9 return nL
200
+
201
+ 10
202
+
203
+
204
+
205
+ NameError: name 'x' is not defined
206
+
207
+
208
+
209
+
210
+
211
+ ```
172
212
 
173
213
 
174
214
 
@@ -178,12 +218,18 @@
178
218
 
179
219
 
180
220
 
181
- ここに問題に対して試ことを記載してください。
221
+ exec関数を用い、n次元ベクトルの定義を
182
222
 
183
223
 
184
224
 
185
225
  ### 補足情報(FW/ツールのバージョンなど)
186
226
 
187
-
227
+ jupyter notebook ,atom ,hydrogen
228
+
229
+
230
+
231
+
232
+
188
-
233
+ ###感謝
234
+
189
- ここにより詳細な情報記載してください。
235
+ テキストの編集教えてくれた方ありがとうござます