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

質問編集履歴

3

記入漏れの追加

2020/04/30 13:18

投稿

csko17118
csko17118

スコア1

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

書式の改善

2020/04/30 13:18

投稿

csko17118
csko17118

スコア1

title CHANGED
File without changes
body CHANGED
@@ -26,7 +26,9 @@
26
26
  return vx
27
27
  ```
28
28
  こうすることで
29
+ ```
29
- defx=defx(6)='x=[Symbol('x[0]'),Symbol('x[1]')・・・,Symbol('x[5]')]'
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

書式の改善

2020/04/30 13:11

投稿

csko17118
csko17118

スコア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
+ テキストの編集教えてくれた方ありがとうござます