【SymPy】LaTeXによる数式表示

当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

sympy.init_printing()

Jupyter Notebook には MathJax という Javascriptライブラリが組込まれていて、sympy.init_printing() を使うと、LaTeX形式で数式を出力させることができます。

display()関数

Jupyter Notebook でコードセルを実行すると、最後に記述した命令文が Out[] に出力されます。たとえば次のコードを実行すると、最後に記述した sympy.sin(x) という命令文の実行結果が出力されることになります。

# JUPYTER_LATEX

# In[1]

import sympy

# LaTeXで数式を表示するように設定
sympy.init_printing()

# 記号xを定義
sympy.var("x")

sympy.log(x)
sympy.sin(x)
\[\sin(x)\]

途中にある数式を LaTeX形式で表示させたい場合は display() 関数を使います。

# In[2]

f = sympy.log(x)
g = sympy.sin(x)

display(f)
display(g)
\[\begin{align*}\log(x)\\[6pt]\sin(x)\end{align*}\]

display() は IPython.core.display モジュールの関数ですが、Jupyter Notebook を起動すると自動的にインポートされるので、display() と記述するだけて使えるようになっています。

sympy.latex()関数

sympy.latex() を使うと数式を LaTeXコマンドで表示させることができます。LaTeX コマンドを手入力するのは相当な手間がかかるので、この機能は論文の執筆などに有用です。

# SYMPY_LATEX

# In[1]

import sympy

# LaTeXで数式を表示するように設定
sympy.init_printing()

# 記号xを定義
sympy.var("a b x y")

# f(x)=exp(x)*cos(x)
f = sympy.exp(x) * sympy.cos(x)

# f(x)をaからbまでxで積分する
i = sympy.integrate(f, (x, a, b))

# 数式をまとめる(整理する)
i = sympy.simplify(i)

# 数式をLaTeXで表示
display(i)

# 数式のLaTeXコマンドを表示
print(sympy.latex(i))
\[\frac{\sqrt{2}}{2} \left(- e^{a} \sin{\left (a + \frac{\pi}{4} \right )} + e^{b} \sin{\left (b + \frac{\pi}{4} \right )}\right)\]
\frac{\sqrt{2}}{2} \left(- e^{a} \sin{\left (a + \frac{\pi}{4} \right )} + e^{b} \sin{\left (b + \frac{\pi}{4} \right )}\right)

SymPy で積分などを計算させると、式がきれいにまとまっていないことがあるので、sympy.simplify() で数式を整理しておきます。三角関数の合成なども勝手にやってくれます。

コメント

  1. 飯田 より:

    逆三角関数の表示について質問です.sympy.latex(atan x)とすると, 出力時にatan xと表示されてしまいますが、これをarctan(x)やtan^(-1)(x)と表示を変更することはできるのでしょうか?

    • BlogCat より:

      sympy.latex() の出力形式そのものを変更する方法はわかりません。モジュールの中身を書き換える必要があると思いますが、おそらくその手順はとても複雑です。根本的な解決にはならないかもしれませんが、新しい関数を定義することができます。以下のコードを試してみてください。ただし、Google Colaboratory で動作確認しただけなので、他の環境でうまくいくかわかりません(現在、Jupyter Notebook を使っていないので … )。

      import sympy
      
      sympy.var("x")
      
      my_dic = {"asin":"arcsin", "acos":"arccos", "atan":"arctan"}
      
      def latex_2(expression):
          my_str = sympy.latex(expression)
          for key in my_dic:
              my_str = my_str.replace(key, my_dic[key])
          return my_str
      
      latex_2(sympy.atan(x))


      他にも書き換えたい記号があれば、my_dic に追加してください。

    • BlogCat より:

      先ほどの返信に載せたコードの一部が間違えていました。
      修正しておきましたので、コピーし直してください。

  2. HNaito より:

    「SymPy の基本的な使い方」の記事で、下記は誤植と思われますのでご確認ください。
    In[5]プロクラムで、print( ) → print( a + b )