1 ポイント 投稿者 GN⁺ 2024-03-01 | 1件のコメント | WhatsAppで共有
  • 数式の操作や計算を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を使用するプロジェクトの不完全な一覧であり、利用プロジェクトはメーリングリストを通じて追加を依頼できる
  • 科学・数学計算分野

    • Cadabra: テンソル代数と量子場理論システムで、スカラー代数にSymPyを使用
    • ChemPy: Pythonで書かれた化学向けパッケージ
    • EinsteinPy: 記号および数値の一般相対性理論のためのPythonパッケージ
    • OctSymPy: SymPyを使用するOctave向け記号パッケージ
    • PyDy: Pythonで多体系の動力学を扱う
    • QMCPACK: C++ベースのQuantum Monte Carloプロジェクトで、単体テスト用の基準値生成と一部のコード生成にSymPyを使用
    • SageMath: SymPyを含むオープンソースの数学システム
  • 開発ツールとコード生成

    • devito: 高性能ステンシル計算のための記号DSLとJITコンパイラ
    • Optlang: 数学的最適化問題を解くPythonパッケージ
    • PyTorch TorchInductor: 動的shapeとstrideのサポートにSymPyを使用
    • Spyder: Scientific Python開発環境で、IPython Consoleで完全なSymPyサポートを有効化できる
    • symjit: SymPy式のための軽量JITコンパイラ
    • yt: ボリュームデータ分析・可視化向けPythonパッケージで、ytの単位システムであるunytがSymPyを使用

1件のコメント

 
GN⁺ 2024-03-01
Hacker Newsのコメント
  • ロボティクスでは、3D変換の結果として得られる大きなベクトルを扱い、複数の状態変数に対する導関数である ヤコビアン を計算しなければならないことが多いため、式がすぐに煩雑になる
    SymPyで大きなベクトルを宣言的に作成し、ヤコビアンを計算したあと、結果をそのままプロジェクトで使える Cコード として出力している
    たとえばロボット位置とセンサー位置のデータセットがあるとき、ロボット中心基準のセンサー位置を推定するには、過剰拘束系を勾配降下法で解けるが、このとき必要な残差関数とヤコビアンをSymPyで計算すればよい

    • 同じように、SymPyを使って 軌道力学 の計算に必要な厄介な導関数を処理したことがある
      まず方程式を書き、面倒な数学はSymPyに任せ、その出力をCコードに変換する形だった
      SymPyプロジェクトが実際の製品コードであまり見かけられない理由も、たぶんこうした中間計算に使われたあと、結果だけが製品コードに入り、記号計算コード自体は捨てられるからかもしれない
    • このライブラリは興味深いかもしれない: https://github.com/symforce-org/symforce
    • 昔はこういうことをMapleでやっている人を見かけたが、今は オープンソースの選択肢 があってうれしい
      ロボティクスやコンピュータビジョン分野でこうした作業をしてくれる優れたライブラリとして、SymPyを使うsymforceがある: https://github.com/symforce-org/symforce
    • 今日まさにこの作業を、布シミュレータ を作りながらやった
      他のノードは固定したまま、各ノード位置を順番にNewtonステップで更新してみたかった
    • jaxを検討したことはあるだろうか
      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が動く

    • SymPyの最大の欠点は、すべての 記号を事前に定義 しなければならない点だ
      ユーザー入力の数式を処理するときは、どの変数が使われたかを調べるために自分で式をパースするか、ユーザーに記号を手動で渡してもらう必要があり、さらに難しくなる
  • 記号数学 は学部課程で深刻なほど軽視されており、触れたとしてもたいていはMathematicaやMATLABのような独占的ソフトウェアに縛られていた
    紙とペンで考える方法を不完全に拡張する道具として学んだし、より高度な内容をソースコードとして扱うと、抽象化が深くなるほど不安定になる
    たとえばテンソル計算を多く必要とする数学・工学分野で働いているが、主にMaximaを使っているものの、関連パッケージは限定的で扱いづらい: https://arxiv.org/pdf/cs/0503073.pdf
    もっと複雑な計算には今ではSymPyを使っているが、それは記号処理そのものが優れているというより、Pythonがすでに持っている 抽象化 のおかげだ
    いつかNorvigのPrinciplesを読んでMaximaを自分の必要に合わせて改造することもあるかもしれないし、Maximaのソースコードやテンソル計算の実装、記号テンソルや幾何代数についてより良い参考資料があれば知りたい

    • Mapleのように 見たままの組版入力 をサポートするアプリケーションが、Maple以外にもあるのだろうか
      知る限りでは、Wolfram/Mathematica、LaTeX、SymPy、Jupyter、Sageなどはすべて、数式を書いたり入力したりする際にタイプライター的なテキストに依存している
      この一点だけでもMapleが唯一しっくりきたのは、手書きの形そのままで入力できるからで、こうした機能がもっと一般的でないのが理解できない
      これが他の人にとっても障壁なのか気になる
    • 親しい友人が、Coherenceで Mathematica Notebook を使って光学と熱計算を行うプロダクションノートブックを作ったとよく話していた
      彼にとっては本当に働き者の道具だった
      ずっと昔にはDerive5で遊んだこともあり、当時もっとも安価なコンピュータ代数システムで、空白をすべて取り除き、括弧の対応を常に気にしなければならない奇妙な一行プログラミング言語でプログラミングを覚えた
      昔のファイルを探してGitHubに上げるべきだし、実際にそれらの演算をもっと現代的なコンピュータ代数システムで再実装して、(0,1) 付近の等長指数関数族曲線をもっと高密度に描いてみたかった
  • SymPy と Mathematica のベンチマークがある: https://www.12000.org/my_notes/CAS_integration_tests/reports...
    結果を見ると、Mathematica は 1,523 問を解けず、SymPy は 48,529 問を解けなかった
    まだ追いつくべき部分がかなりある

    • SymPy は オープンソースで、Mathematica はそうではない
      そのうえ、SymPy に依存する SageMath のほうが比較対象としてはより近い製品で、こちらもオープンソースである
    • 興味深くはあるが、言及されている Web サイトは 積分しか扱っていない
    • なぜこれほど大きな差があるのか気になる
      たとえば、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...

    • Sage Manifolds を見てみるとよい: https://sagemanifolds.obspm.fr/
      SageMath 上に構築されているが、計算エンジンとして SymPy も使えると理解している
  • 数値計算をする「物理学者」にとって、SymPy はかなり救世主のような存在だった。
    より高度なモデルも、まずプロトタイプとして作ってから後で C++ で最適化しやすい。
    Mathematica はあまり使い込んではいないが、それでも SymPy より記号処理能力が高い、あるいは手間が少ないという印象がある。
    Mathematica の経験がもっと多い人が、実際の違いをはっきり説明してくれるとありがたい。

    • Stephen Wolfram はひとまず別としても、Mathematica は今でも大半の代替手段よりコンピュータ代数システムとしてはるかに先を行っている。
      Maple は一部の積分で優れている。
      欠点は、それらの言語が汎用言語としてはあまり適していないことで、必要な代数操作がそこまで複雑でない場合は、「本物の」言語で作業したくなる。
      Python は最高ではないが十分実用的で、巨大な汎用エコシステムの恩恵を受けられるもう一つの例でもある。
  • SymPy はやるべきことをきちんとやってくれる。
    普段は SageMath の組合せ論ライブラリの中で使っているが、まだそのやり方が定石なのか、それとも今では SymPy が単独でも使えるほど発展したのか気になっている。

    • SageMath はすごそうに見えるが、それぞれに文法があり機能も重複する複数の既存ツールを組み合わせたものだという点が、少し気になる。
      内部的な一貫性が不足していて、作業のやり方がばらつきそうだからだ。
      実際のところ、この点がどんなふうに感じられるのか気になる。