📐

Jupyter Notebook で python側の変数 と LaTeX を組み合わせて表示したい。

2023/01/03に公開

やりたいこと

SymPyの計算結果を良い感じに \LaTeX 形式で出力したい。

SymPyで対角行列を計算して、その結果をP^{-1}APに続く形に出力したい。

P^{-1}AP = \begin{pmatrix} 2 & 0 \\ 0 & -3 \end{pmatrix}

方法

display.Math と 書式化演算子 を使う

コード
import sympy as sp
from IPython.display import display, Math

result = sp.Matrix([
    [2, 0],
    [0, -3]
])
display(Math(r"P^{-1}AP = %s" % sp.latex(result)))

出力結果:

P^{-1}AP = \begin{pmatrix} 2 & 0 \\ 0 & -3 \end{pmatrix}

display.Math と フォーマット文字列 を使う

コード
import sympy as sp
from IPython.display import display, Math

result = sp.Matrix([
    [2, 0],
    [0, -3]
])
display(Math(rf"P^{{-1}}AP = {sp.latex(result)}"))

出力結果:

P^{-1}AP = \begin{pmatrix} 2 & 0 \\ 0 & -3 \end{pmatrix}

display.Markdown を使う

これはmarkdown形式で結果を出力できるので、複数行に渡って結果を出力したい場合になどに便利そう。

コード
import sympy as sp
from IPython.display import display, Markdown

result = sp.Matrix([
    [2, 0],
    [0, -3]
])
display(Markdown(rf"$P^{{-1}}AP = {sp.latex(result)}$"))

出力結果:

P^{-1}AP = \begin{pmatrix} 2 & 0 \\ 0 & -3 \end{pmatrix}

より複雑なコード

コード
import sympy as sp
from IPython.display import Markdown

A = sp.Matrix([
    [1, 2],
    [2, -2]
])

P = sp.Matrix([
    [2, 1],
    [1, -2]
])

display(Markdown(rf"""
行列$A = {sp.latex(A)}$の対角行列を求める。  
固有値は、$\lambda_1 = 2, \lambda_2 = -3$であり、対応する固有ベクトルはそれぞれ、
$$
\boldsymbol{{x}}_1 = {sp.latex(P[:, 0])}, \boldsymbol{{x}}_2 = {sp.latex(P[:, 1])}
$$
したがって、$\boldsymbol{{P}}=[\boldsymbol{{x}}_1, \boldsymbol{{x}}_2]$と置くと、
$$
\begin{{aligned}}
    \boldsymbol{{P}} &= {sp.latex(P)} \\
    P^{{-1}}AP &= {sp.latex(P.inv() * A * P)}
\end{{aligned}}
$$
"""))

出力結果:

行列A = \begin{bmatrix}1 & 2 \\ 2 & -2\end{bmatrix}の対角行列を求める。  
固有値は、\lambda_{1}=2, \lambda_{2}=-3であり、対応する固有ベクトルはそれぞれ、

\boldsymbol{x}_{1} = \begin{bmatrix} 2 \\ 1 \end{bmatrix},\ \boldsymbol{x}_{1} = \begin{bmatrix} 1 \\ -2 \end{bmatrix}

したがって、\boldsymbol{P} = \begin{bmatrix}\boldsymbol{x}_{1}, \boldsymbol{x}_{2}\end{bmatrix}と置くと、

\begin{aligned} \boldsymbol{P} &= \begin{bmatrix} 2 & 0 \\ 0 & -3 \end{bmatrix} \\ P^{-1}AP &= \begin{bmatrix} 2 & 0 \\ 0 & -3 \end{bmatrix} \end{aligned}

display.Latex を使う。

これはそのままLaTeX形式で出力できる。Markdownと同じく複数行にまたがる場合や、LaTeXに書きなれてる方はこれが便利かもしれない。

コード
import sympy as sp
from IPython.display import display, Latex

result = sp.Matrix([
    [2, 0],
    [0, -3]
])
display(Latex(rf"""
\begin{{align}}
    P^{{-1}}AP &= {sp.latex(result)}
\end{{align}}
"""))

出力結果:

P^{-1}AP = \begin{pmatrix} 2 & 0 \\ 0 & -3 \end{pmatrix}

参考文献

https://qiita.com/ceptree/items/3668ca52f8621b13bbc2
https://ipython.readthedocs.io/en/stable/api/generated/IPython.display.html
https://stackoverflow.com/questions/48422762/is-it-possible-to-show-print-output-as-latex-in-jupyter-notebook
https://stackoverflow.com/questions/13208286/how-to-write-latex-in-ipython-notebook/13222501#13222501

Discussion