Pythonで記号数学を扱うSymPy
(sympy.org)- 数式の操作や計算をPythonコード内で直接扱いたい場合、SymPyは対話的な利用とアプリケーションへの組み込みの両方をサポート
- BSDライセンスで提供されるフリーソフトウェアで、実装言語もユーザー向けの言語もどちらもPython
- 依存関係は任意精度浮動小数点演算用の純粋なPythonライブラリであるmpmathのみで、インストールや活用の負担が小さい
- Cadabra、ChemPy、devito、EinsteinPy、SageMath、Spyder、PyTorch TorchInductorなど、さまざまな科学・数学・開発ツールがSymPyを利用
- 活用範囲はテンソル代数、化学、一般相対性理論、回路解析、最適化、動力学、コード生成、動的shapeとstrideのサポートまで幅広い
Pythonベースの記号数学ライブラリ
- SymPyはPythonで記号数学を扱うためのライブラリ
- BSDライセンスで提供され、自由に利用できる
- 全体がPythonで書かれており、SymPyで使う言語もPython
- 依存関係はmpmathのみ
- mpmathは任意精度浮動小数点演算のための純粋なPythonライブラリ
- 対話型ツールとして利用でき、他のアプリケーションに組み込むことや、ユーザー定義関数で拡張することも可能
- 機能一覧はSymPy's featuresで確認できる
SymPyを採用しているプロジェクト
- 公開されている一覧はSymPyを使用するプロジェクトの不完全な一覧であり、利用プロジェクトはメーリングリストを通じて追加を依頼できる
-
科学・数学計算分野
-
開発ツールとコード生成
1件のコメント
Hacker Newsのコメント
ロボティクスでは、3D変換の結果として得られる大きなベクトルを扱い、複数の状態変数に対する導関数である ヤコビアン を計算しなければならないことが多いため、式がすぐに煩雑になる
SymPyで大きなベクトルを宣言的に作成し、ヤコビアンを計算したあと、結果をそのままプロジェクトで使える Cコード として出力している
たとえばロボット位置とセンサー位置のデータセットがあるとき、ロボット中心基準のセンサー位置を推定するには、過剰拘束系を勾配降下法で解けるが、このとき必要な残差関数とヤコビアンをSymPyで計算すればよい
まず方程式を書き、面倒な数学はSymPyに任せ、その出力をCコードに変換する形だった
SymPyプロジェクトが実際の製品コードであまり見かけられない理由も、たぶんこうした中間計算に使われたあと、結果だけが製品コードに入り、記号計算コード自体は捨てられるからかもしれない
ロボティクスやコンピュータビジョン分野でこうした作業をしてくれる優れたライブラリとして、SymPyを使うsymforceがある: https://github.com/symforce-org/symforce
他のノードは固定したまま、各ノード位置を順番にNewtonステップで更新してみたかった
Pythonを離れずにヤコビアンを効率よく計算できるし、必要なら GPU も使え、APIもNumPy互換だ
SymPyは本当に素晴らしく、何年にもわたって 教育ツール として使ってきた
MathematicaやMapleなどと比べて最良の選択肢だと思う理由は、API関数が学生が数学を学ぶときに使う動詞と正確に一致しているからだ: solve、expand、factor など
これから始める人向けの短いチュートリアル: https://minireference.com/static/tutorials/sympy_tutorial.pd...
実行可能なノートブック形式もある: https://colab.research.google.com/github/minireference/sympy... 読み取り専用: http://nbviewer.ipython.org/github/minireference/sympytut_no...
インストールなしで試したいならSymPy live shellもある: https://live.sympy.org/ WebAssemblyのおかげでブラウザ上でPythonとSymPyが動く
ユーザー入力の数式を処理するときは、どの変数が使われたかを調べるために自分で式をパースするか、ユーザーに記号を手動で渡してもらう必要があり、さらに難しくなる
記号数学 は学部課程で深刻なほど軽視されており、触れたとしてもたいていはMathematicaやMATLABのような独占的ソフトウェアに縛られていた
紙とペンで考える方法を不完全に拡張する道具として学んだし、より高度な内容をソースコードとして扱うと、抽象化が深くなるほど不安定になる
たとえばテンソル計算を多く必要とする数学・工学分野で働いているが、主にMaximaを使っているものの、関連パッケージは限定的で扱いづらい: https://arxiv.org/pdf/cs/0503073.pdf
もっと複雑な計算には今ではSymPyを使っているが、それは記号処理そのものが優れているというより、Pythonがすでに持っている 抽象化 のおかげだ
いつかNorvigのPrinciplesを読んでMaximaを自分の必要に合わせて改造することもあるかもしれないし、Maximaのソースコードやテンソル計算の実装、記号テンソルや幾何代数についてより良い参考資料があれば知りたい
知る限りでは、Wolfram/Mathematica、LaTeX、SymPy、Jupyter、Sageなどはすべて、数式を書いたり入力したりする際にタイプライター的なテキストに依存している
この一点だけでもMapleが唯一しっくりきたのは、手書きの形そのままで入力できるからで、こうした機能がもっと一般的でないのが理解できない
これが他の人にとっても障壁なのか気になる
彼にとっては本当に働き者の道具だった
ずっと昔にはDerive5で遊んだこともあり、当時もっとも安価なコンピュータ代数システムで、空白をすべて取り除き、括弧の対応を常に気にしなければならない奇妙な一行プログラミング言語でプログラミングを覚えた
昔のファイルを探してGitHubに上げるべきだし、実際にそれらの演算をもっと現代的なコンピュータ代数システムで再実装して、(0,1) 付近の等長指数関数族曲線をもっと高密度に描いてみたかった
SymPy と Mathematica のベンチマークがある: https://www.12000.org/my_notes/CAS_integration_tests/reports...
結果を見ると、Mathematica は 1,523 問を解けず、SymPy は 48,529 問を解けなかった
まだ追いつくべき部分がかなりある
そのうえ、SymPy に依存する SageMath のほうが比較対象としてはより近い製品で、こちらもオープンソースである
たとえば、SymPy のアプローチに根本的な欠陥があるのか知りたい
SymPy: https://en.wikipedia.org/wiki/SymPy
「How should logarithms be taught?」Python と SymPy の使用: https://news.ycombinator.com/item?id=28518565#28519356
「SymPy - a Python library for symbolic mathematics」(2020): https://news.ycombinator.com/item?id=23767513
Matlab ユーザー向け NumPy: https://numpy.org/doc/stable/user/numpy-for-matlab-users.htm...
SymPy vs Matlab: https://github.com/sympy/sympy/wiki/SymPy-vs.-Matlab
https://github.com/idanpa/calcpy と一緒に SymPy を 電卓のように使っている
素の SymPy は少し使いづらいと感じていた
SymPy は Jupyter で非常によく動く
自作の SymPy デモノートブック:
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/sympy... 多変数二次式の解法と数式のきれいな表示
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/tiny-... 手早く描く NumPy/pylab プロットのチートシート、SymPy の例を含む
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/secan... 既存の Python 関数を SymPy で記号微分して閉形式の最小値を見つける例
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/max-p... SymPy による基本的な回路解析と初歩的な微積分
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/latex... MathJax の書式と SymPy をさまざまな形で試した内容で、HAKMEM の Minsky 円アルゴリズムの解析も含む
10 年前、一般相対性理論に関心があったとき、Einstein 場の方程式の記号計算を扱う簡単なプログラムを作りたかった
計量から始めてアフィン接続、Ricci テンソルなどを計算するもので、Python に慣れていたので SymPy は良い選択肢に見えたが、難しくて実際に動かせなかった
当時、初めて使う Mathematica では数時間で実現でき、その後さらに拡張して、のちに発表したブラックホール論文で多くの計算に使った
今見ると、この分野では SymPy の開発が大きく進み、その上に良いライブラリも生まれている: https://docs.einsteinpy.org, https://github.com/spacetimeengineer/spacetimeengine
今では Schwarzschild 計量を扱う Jupyter ノートブックの例もある: https://github.com/sympy/sympy/blob/master/examples/intermed...
SageMath 上に構築されているが、計算エンジンとして SymPy も使えると理解している
数値計算をする「物理学者」にとって、SymPy はかなり救世主のような存在だった。
より高度なモデルも、まずプロトタイプとして作ってから後で C++ で最適化しやすい。
Mathematica はあまり使い込んではいないが、それでも SymPy より記号処理能力が高い、あるいは手間が少ないという印象がある。
Mathematica の経験がもっと多い人が、実際の違いをはっきり説明してくれるとありがたい。
Maple は一部の積分で優れている。
欠点は、それらの言語が汎用言語としてはあまり適していないことで、必要な代数操作がそこまで複雑でない場合は、「本物の」言語で作業したくなる。
Python は最高ではないが十分実用的で、巨大な汎用エコシステムの恩恵を受けられるもう一つの例でもある。
SymPy はやるべきことをきちんとやってくれる。
普段は SageMath の組合せ論ライブラリの中で使っているが、まだそのやり方が定石なのか、それとも今では SymPy が単独でも使えるほど発展したのか気になっている。
内部的な一貫性が不足していて、作業のやり方がばらつきそうだからだ。
実際のところ、この点がどんなふうに感じられるのか気になる。