Introduction
シンボリック計算とは?
シンボリック計算は、数学的オブジェクトの計算をシンボリックに処理します。つまり、数学的オブジェクトは近似的にではなく正確に表現され、評価されていない変数を含む数式はシンボリックな形式のままになります。
例を見てみましょう。Pythonの組み込み関数を使って平方根を計算したいとします。次のようにします。
import math
math.sqrt(9)
3.0
9は完全な平方数なので、答えは3です。しかし、完全な平方数ではない数の平方根を計算したとします。
math.sqrt(8)
2.82842712475
ここでは、近似値が得られました。2.82842712475 は、8 の正確な平方根ではありません (実際、8 の実際の平方根は無理数であるため、有限小数で表すことはできません)。8 の平方根の小数形式だけを気にするのであれば、これで終わりです。
しかし、さらに先へ進みたいとしましょう。
上記の結果からこれを推測するのは難しいでしょう。ここで記号計算が役立ちます。SymPyのような記号計算システムでは、完全な平方数ではない数の平方根はデフォルトで評価されません
import sympy
sympy.sqrt(3)
sqrt(3)
さらに、シンボリック計算の真の威力が見えてくるのですが、シンボリックな結果はシンボリックに簡略化できます。
sympy.sqrt(8)
2*sqrt(2)
もっと興味深い例
上記の例は、SymPy を使用して無理数を正確に操作する方法を示しています。しかし、SymPy はそれよりもはるかに強力です。SymPy などの記号計算システム (ちなみに、コンピュータ代数システム、または単に CAS とも呼ばれます) は、変数を含む記号式を計算できます。
後で説明するように、SymPy では変数は を使用して定義されますsymbols。多くの記号操作システムとは異なり、SymPy の変数は使用する前に定義する必要があります (その理由については次のセクションで説明します)。
数式を表す記号表現を定義しよう。
。
.
from sympy import symbols
x, y = symbols('x y')
expr = x + 2*y
expr
x + 2*y
と が通常の Python 変数である場合と同じように記述したことに注意してください。ただし、この場合は、何かに評価されるのではなく、式は のままです。では、これを操作してみましょう。x + 2*yxyx + 2*y
expr + 1
x + 2*y + 1
expr - x
2*y
上記の例で何かに注意してください。 と入力したとき、 ではなく だけが表示されました。と は自動的にキャンセルされます。 これは、上で が自動的に に変わる のと似ています。 ただし、SymPy では常にそうであるとは限りません。expr - xx + 2*y - x2*yx-xsqrt(8)2*sqrt(2)
x*expr
x*(x + 2*y)
Here, we might have expected
ここで、私たちは予想していたかもしれない
変身する
ですが、式はそのまま残されています。これはSymPyの一般的なテーマです。次のような明らかな単純化は別として、
そして
、ほとんどの簡略化は自動的には行われません。これは、因数分解された形式を好む場合があるためです。
あるいは、拡張された形式を好むかもしれない
どちらの形式も、異なる状況で役立ちます。SymPyには、一方の形式からもう一方の形式へ移行する関数があります。
from sympy import expand, factor
expanded_expr = expand(x*expr)
expanded_expr
x**2 + 2*x*y
factor(expanded_expr)
x*(x + 2*y)
シンボリック計算の威力
SymPyのようなシンボリック計算システムの真の力は、あらゆる種類の計算をシンボリックに実行できることです。SymPyは、式の簡略化、導関数、積分、極限の計算、方程式の解法、行列の操作など、さまざまなことをすべてシンボリックに実行できます。プロット、印刷(数式の2Dプリティプリント出力など)用のモジュールが含まれています。
)、コード生成、物理学、統計、組合せ論、数論、幾何学、論理学など、さまざまな分野にまたがっています。興味をそそられるよう、SymPy が実現できる記号処理能力のほんの一部をここに示します。
from sympy import *
x, t, z, nu = symbols('x t z nu')
これにより、以降のすべての例が Unicode 文字できれいに印刷されるようになります。
init_printing(use_unicode=True)
の導関数を取る
。
diff(sin(x)*exp(x), x)
x x
計算
。
integrate(exp(x)*sin(x) + exp(x)*cos(x), x)
x
探す
。
integrate(sin(x**2), (x, -oo, oo))
√2⋅√π
─────
2
Find
.
limit(sin(x)/x, x, 0)
1
解決する
。
solve(x**2 - 2, x)
[-√2, √2]
微分方程式を解く
。
y = Function('y')
dsolve(Eq(y(t).diff(t, t) - y(t), exp(t)), y(t))
-t ⎛ t⎞ t
y(t) = C₂⋅ℯ + ⎜C₁ + ─⎟⋅ℯ
⎝ 2⎠
の固有値を求める
。
Matrix([[1, 2], [2, 2]]).eigenvals()
⎧3 √17 3 √17 ⎫
⎨─ - ───: 1, ─ + ───: 1⎬
⎩2 2 2 2 ⎭
ベッセル関数を書き直す
球面ベッセル関数の観点から
。
.
besselj(nu, z).rewrite(jn)
√2⋅√z⋅jn(ν - 1/2, z)
────────────────────
√π
印刷
使用して
。
latex(Integral(cos(x)**2, (x, 0, pi)))
\int\limits_{0}^{\pi} \cos^{2}{\left(x \right)}\, dx
なぜSymPyなのか?
世の中には多くのコンピュータ代数システムが存在します。 このWikipedia の記事には、それらの多くが記載されています。SymPy が他の選択肢よりも優れているのはなぜでしょうか?
まず、SymPy は完全に無料です。オープンソースであり、リベラルな BSD ライセンスに基づいてライセンスされているため、ソースコードを変更したり、必要に応じて販売したりすることもできます。これは、ライセンスに数百ドルかかる Maple や Mathematica などの人気の商用システムとは対照的です。
第二に、SymPy は Python を使用します。ほとんどのコンピュータ代数システムは独自の言語を開発します。SymPy は違います。SymPy は完全に Python で書かれ、完全に Python で実行されます。つまり、Python をすでに知っている場合は、構文もすでに知っているので、SymPy を使い始めるのがはるかに簡単です (Python を知らない場合でも、習得は非常に簡単です)。Python が適切に設計され、実戦でテストされた言語であることは、すでにわかっています。SymPy の開発者は、数学ソフトウェアの作成能力に自信を持っていますが、プログラミング言語の設計はまったく別のものです。既存の言語を再利用することで、重要なこと、つまり数学に集中できます。
もう一つのコンピュータ代数システムである Sage も、言語として Python を使用しています。しかし、Sage はサイズが大きく、ダウンロードすると 1 GB を超えます。SymPy の利点は軽量であることです。比較的小さいことに加えて、Python 以外の依存関係がないため、ほとんどどこでも簡単に使用できます。さらに、Sage と SymPy の目標は異なります。Sage は数学のためのフル機能のシステムを目指しており、主要なオープンソースの数学システムをすべて 1 つにコンパイルすることでそれを実現しています。Sage で などの関数を呼び出すと、integrateそれに含まれるオープンソース パッケージの 1 つが呼び出されます。実際、SymPy は Sage に含まれています。一方、SymPy は独立したシステムを目指しており、すべての機能が SymPy 自体に実装されています。
SymPy の最後の重要な機能は、ライブラリとして使用できることです。多くのコンピュータ代数システムは、インタラクティブな環境で使用できることに重点を置いていますが、自動化または拡張したい場合は困難です。SymPy を使用すると、インタラクティブな Python 環境で簡単に使用したり、独自の Python アプリケーションにインポートしたりできます。SymPy は、独自のカスタム関数を使用して簡単に拡張できる API も提供します。