混乱
sympyの使い方を確認しようと検索して出てくるwebページを見ると、変数シンボルの定義に、Symbol( )
を使っているもの、symbols( )
を使っているもの、var( )
を使っているものなどがあり、どれを使うのが適当なのかよく分からない。
よく理解していないものだから、Symbol( )
で複数のシンボルを作ろうとして、エラーになる。
なので、公式ドキュメントを読んで確認したので、その結果を下にまとめる。
Symbol( )
Symbol( )
は、Symbol ClassのオブジェクトのConstractor。
なので作れるシンボルオブジェクトは1度の呼び出しで1つ。
# 例
x = Symbol('x')
symbols( )
symbols()
は引数で与えられた文字列を解釈して、指定された名前を持つSymbolオブジェクトを返す。
返り値を変数で受け取らないと、そのオブジェクトは消えてしまう。
# 例
x, y = symbols('x, y') # 区切りはスペースでも可
便利なシンボルの生成方法
symbols( )
は、引数で与える文字列によって複数のシンボルを生成する便利な使用方法がある。
以下の例では、返り値を受け取っている変数名は、生成されているシンボルの名前を示す。
x0, x1, x2 = symbols('x:3')
x50, x51 = symbols('x5(:2)')
a, b, c = symbols('a:d')
[a, b] = symbols(['a', 'b'])
#var( )
var( )
は、引数で与えられたものと同じ引数でsymbols( )
を呼び出し、作成されるシンボルオブジェクトを同じ名前の変数として、global name spaceに格納する。
なので、var( )
の返り値は変数で受ける必要がない。
var( )
使用上の注意
生成されるオブジェクトがglobal name spaceに格納されるゆえ、関数内でvar( )
を使うと、変数名の衝突などの問題を起こすゆえ不適当。関数内ではsymbols( )
を使う方が良い。
(逆に言えば、トップレベルではvar( )
を積極的に使うと良い。)