質問編集履歴
3
記入漏れの追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -25,14 +25,24 @@
|
|
25
25
|
vx=name6+u+name4
|
26
26
|
return vx
|
27
27
|
```
|
28
|
+
そして、このファイルをsympy_Multivariable.pyと名付け、anacondaのsite-packages内に自分で作った
|
29
|
+
myfunction\math\define内に保存しました。
|
30
|
+
|
28
31
|
こうすることで
|
32
|
+
jupyter notebookで
|
29
33
|
```
|
34
|
+
from myfunction.math.define import sympy_Multivariable as SMV
|
35
|
+
defx=SMV.defx(6)
|
36
|
+
print(defx)
|
37
|
+
```
|
38
|
+
と入力すれば
|
39
|
+
```
|
30
40
|
x=[Symbol('x[0]'),Symbol('x[1]'),Symbol('x[2]'),Symbol('x[3]'),Symbol('x[4]'),Symbol('x[5]')]
|
31
41
|
```
|
32
|
-
|
42
|
+
と表示されます。
|
33
43
|
|
34
|
-
そして、このファイルをsympy_Multivariable.pyと名付け、anacondaのsite-packages内に自分で作ったmyfunction\math\define内に保存しました。
|
35
44
|
|
45
|
+
|
36
46
|
ここからが本題です。
|
37
47
|
まずこのように自作関数をつくりました。
|
38
48
|
```
|
2
書式の改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -26,7 +26,9 @@
|
|
26
26
|
return vx
|
27
27
|
```
|
28
28
|
こうすることで
|
29
|
+
```
|
29
|
-
|
30
|
+
x=[Symbol('x[0]'),Symbol('x[1]'),Symbol('x[2]'),Symbol('x[3]'),Symbol('x[4]'),Symbol('x[5]')]
|
31
|
+
```
|
30
32
|
のようなテキストを生成できます
|
31
33
|
|
32
34
|
そして、このファイルをsympy_Multivariable.pyと名付け、anacondaのsite-packages内に自分で作ったmyfunction\math\define内に保存しました。
|
1
書式の改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -5,23 +5,11 @@
|
|
5
5
|
なぜこのようなことをしてたいかとというとsympyでn次元勾配ベクトルとn行n列のヘッセ行列の計算を自作関数でモジュール化したいのですが、そのためのsympy内での変数の定義がうまくいかないことです。そこで上記のように対策したのだがうまくいかなくて困っている。
|
6
6
|
|
7
7
|
|
8
|
+
### 該当のソースコード
|
8
9
|
|
10
|
+
なぜこのようなことをしてたいかとというと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]')]となってしまうためソースコードがかけません。そこで以下のような自作関数をまず定義しました。
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
■■な機能を実装中に以下のエラーメッセージが発生しました。
|
15
|
-
|
16
|
-
### 発生している問題・エラーメッセージ
|
17
|
-
|
18
|
-
|
19
|
-
エラーメッセージ
|
20
|
-
|
21
|
-
### 該当のソースコード
|
22
|
-
```python
|
23
|
-
```なぜこのようなことをしてたいかとというと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]')]となってしまうためソースコードがかけません。そこで以下のような自作関数をまず定義しました。
|
24
|
-
|
12
|
+
```
|
25
13
|
def defx(n):
|
26
14
|
name1='Symbol(' #変数xベクトルの定義(開始)
|
27
15
|
name2="'"
|
@@ -36,7 +24,7 @@
|
|
36
24
|
u=u[:-1]
|
37
25
|
vx=name6+u+name4
|
38
26
|
return vx
|
39
|
-
|
27
|
+
```
|
40
28
|
こうすることで
|
41
29
|
defx=defx(6)='x=[Symbol('x[0]'),Symbol('x[1]')・・・,Symbol('x[5]')]'
|
42
30
|
のようなテキストを生成できます
|
@@ -45,7 +33,7 @@
|
|
45
33
|
|
46
34
|
ここからが本題です。
|
47
35
|
まずこのように自作関数をつくりました。
|
48
|
-
|
36
|
+
```
|
49
37
|
from sympy import *
|
50
38
|
from sympy import sin,cos,tan,exp,log
|
51
39
|
from myfunction.math.define import sympy_Multivariable as SMV #上のテキストを生成するための自作関数
|
@@ -62,10 +50,11 @@
|
|
62
50
|
nL=[diff(L,x[i1]) for i1 in range(n)]
|
63
51
|
HL=[[diff(nL[i2],x[i3]) for i2 in range(n)] for i3 in range(n)]
|
64
52
|
return HL
|
65
|
-
|
53
|
+
```
|
66
54
|
ちなみにこの自作関数のファイルはdiff.pyと名付け、anacondaのsite-packages内に自分で作ったmyfunction\math\analysis内に保存しました。
|
67
55
|
|
68
56
|
そして今度はjupyter notebookで以下のようなソースコードを組んでみました。
|
57
|
+
```
|
69
58
|
from sympy import *
|
70
59
|
from sympy import sin,cos,tan,exp,log
|
71
60
|
from myfunction.math.analysis import diff #勾配ベクトルとヘッセ行列の自作関数
|
@@ -79,17 +68,51 @@
|
|
79
68
|
Hf=diff.Hesse(f,n) #ヘッセ行列の計算
|
80
69
|
print(nf) #勾配ベクトルの表示
|
81
70
|
print(Hf) #ヘッセ行列の表示
|
71
|
+
```
|
82
72
|
|
83
73
|
|
84
74
|
このプログラムを実行したときに勾配ベクトルとヘッセ行列の自作関数が定義されていないとエラーメッセージが出るのですがそもそも、自作関数内でexec関数が動作しないということなのでしょうか?
|
85
75
|
|
86
76
|
この原因についてわかる方がいたら教えてください。
|
77
|
+
■■な機能を実装中に以下のエラーメッセージが発生しました。
|
87
78
|
|
79
|
+
### 発生している問題・エラーメッセージ
|
80
|
+
```
|
81
|
+
NameError Traceback (most recent call last)
|
82
|
+
<ipython-input-6-cf230244345a> in <module>
|
83
|
+
9 exec(defx)
|
84
|
+
10 f=sin(x[0]*x[1])
|
85
|
+
---> 11 nf=diff.grad(f,n)
|
86
|
+
12 Hf=diff.Hesse(f,n)
|
87
|
+
13 print(nf)
|
88
88
|
|
89
|
+
~\Anaconda3\lib\site-packages\myfunction\math\analysis\diff.py in grad(L, n)
|
90
|
+
6 defx=SMV.defx(n)
|
91
|
+
7 exec(defx)
|
92
|
+
----> 8 nL=[diff(L,x[i5]) for i5 in range(n)]
|
93
|
+
9 return nL
|
94
|
+
10
|
95
|
+
|
96
|
+
~\Anaconda3\lib\site-packages\myfunction\math\analysis\diff.py in <listcomp>(.0)
|
97
|
+
6 defx=SMV.defx(n)
|
98
|
+
7 exec(defx)
|
99
|
+
----> 8 nL=[diff(L,x[i5]) for i5 in range(n)]
|
100
|
+
9 return nL
|
101
|
+
10
|
102
|
+
|
103
|
+
NameError: name 'x' is not defined
|
104
|
+
|
105
|
+
|
106
|
+
```
|
107
|
+
|
108
|
+
|
89
109
|
### 試したこと
|
90
110
|
|
91
|
-
|
111
|
+
exec関数を用いて、n次元ベクトルの定義を試みた
|
92
112
|
|
93
113
|
### 補足情報(FW/ツールのバージョンなど)
|
114
|
+
jupyter notebook ,atom ,hydrogen
|
94
115
|
|
116
|
+
|
117
|
+
###感謝
|
95
|
-
|
118
|
+
テキストの編集を教えてくれた方ありがとうございます。
|