Python の SymPy と Julia の SymPy の違う点
Python の SymPy と Julia の SymPy にはいくつか注意すべき違いがある。Julia の SymPy は Python の SymPy をラップしたパッケージであり,多くの機能が共通しているが,言語の違いやラッパーとしての実装の影響で異なる点がある。
1. 主な違い
1.1. シンボリック変数の定義
- Python
symbols 関数を使い文字列でシンボル名を指定する。
python
from sympy import symbols
x, y = symbols('x y')
var も使える。こちらのほうが便利。
python
from sympy import var
var('a, b, c')
- Julia
@syms マクロを使い,変数を直接定義する。
julia
using SymPy
@syms x y
1.2. 変数の再代入
- Python
シンボリック変数 x に値を再代入すると,x は完全に新しい値(数値や式)になる。元の x は保持されない。。
python
x = symbols('x')
print(x) # x
x = 5
print(x) # 5
- Julia
同様に,シンボリック変数 x に数値を再代入すると,元の x は数値として扱われる。
julia
@syms x
println(x) # x
x = 5
println(x) # 5
1.3. 型システム
- Python
Python は動的型付け言語のため,すべてのオブジェクトの型が実行時に決定される。SymPy のシンボリック変数も特に型を意識する必要はない。 - Julia
Julia は静的型付け言語であるが,SymPy では SymPy.Sym 型が使われる。型の違いを意識しながら操作する必要がある。
julia
@syms x
println(typeof(x)) # SymPy.Sym
1.4. 演算の結果
- Python
演算結果は SymPy の式オブジェクト (sympy.Basic 派生クラス) である。
python
from sympy import symbols
x = symbols('x')
expr = x + 2
print(expr) # x + 2
print(type(expr)) # <class 'sympy.core.add.Add'>
- Julia
Julia の SymPy も基本的には同様の挙動であるが,型名が異なる。
julia
@syms x
expr = x + 2
println(expr) # x + 2
println(typeof(expr)) # SymPy.Sym
1.5. 関数の使い方
- Python
すべての関数は明示的にインポートする必要がある。
python
from sympy import sin, cos
x = symbols('x')
print(sin(x) + cos(x))
- Julia
Julia の SymPy では,シンボリック関数は基本的に Python の SymPy をラップしており,SymPy.sin のように明示的に指定することもできる。
julia
using SymPy
@syms x
println(sin(x) + cos(x)) # sin(x) + cos(x)
1.6. 数値計算 (数値評価)
- Python
evalf を使用する。
python
from sympy import symbols
x = symbols('x')
expr = x + 2
print(expr.evalf(subs={x: 3})) # 5.0
- Julia
subs 関数を使い,さらに値を浮動小数点数に変換する必要がある。
julia
@syms x
expr = x + 2
println(subs(expr, x => 3.0)) # 5.0
1.7. パフォーマンス
- Python の SymPy は Python ネイティブで実行されるが,Julia の SymPy は Python 呼び出しを介して実行されるため,速度やパフォーマンスの面でオーバーヘッドがある。
- 数値計算が多い場合は,Julia の他のネイティブライブラリ(例:Symbolics.jl)を検討すると良い。
1.8. 互換性
- Python の SymPy は常に最新バージョンの機能を利用できる。
- Julia の SymPy は Python の SymPy に依存しているため,インストールされている Python の SymPy バージョンに依存する。
2. まとめ
- Python の SymPy はオリジナルで,ほぼ制限なく使える。
- Julia の SymPy は Python の SymPy をそのまま利用できる利便性があるものの,パフォーマンスや型の扱いに注意が必要である。
- Julia で純粋にシンボリック計算をしたい場合は,Symbolics.jl も検討すると良い。