Sympy - 显示完整方程式的密集矩阵形式

4

我正在尝试使用Sympy来分解IPython笔记本中的估计过程。在每个步骤中,能够显示完整的线性方程式将非常有用。以简单的回归为例,我有以下设置:

from sympy import *
from sympy.abc import epsilon

y=MatrixSymbol('y',5,1)
x=MatrixSymbol('x',5,2)
b=MatrixSymbol('b',2,1)
e=MatrixSymbol('epsilon',5,1)

我可以打印每个组件……
y.as_explicit()

enter image description here

(b*x).as_explicit()

enter image description here

e.as_explicit()

输入图像描述

......但是我无法找到Sympy中允许显示完整方程的方法(以下内容是使用在线latex编辑器呈现的):

输入图像描述

基本上,每当我使用等于号时,它会被合理地视为赋值运算符,并且加法运算符会将MatrixSymbol转换为MatAdd对象,该对象不支持as_explict()方法。对此问题有何想法将不胜感激。


你打错字了吗?b*x没有对齐。 - asmeurer
1个回答

2
如果您显式调用MatAdd构造函数,则不会进行评估。要创建一个等式,请使用Eq。在Unicode漂亮打印中加号似乎存在渲染问题,我为此打开了https://github.com/sympy/sympy/issues/2747
In [14]: Eq(y.as_explicit(), MatAdd((x*b).as_explicit(), (e).as_explicit()))
Out[14]:
⎡y₀₀⎤ = ⎡x₀₀⋅b₀₀ + x₀₁⋅b₁₀⎤ + ⎡ε₀₀⎤
⎢   ⎥   ⎢                 ⎥   ⎢   ⎥
⎢y₁₀⎥   ⎢x₁₀⋅b₀₀ + x₁₁⋅b₁₀⎥   ⎢ε₁₀⎥
⎢   ⎥   ⎢                 ⎥   ⎢   ⎥
⎢y₂₀⎥   ⎢x₂₀⋅b₀₀ + x₂₁⋅b₁₀⎥   ⎢ε₂₀⎥
⎢   ⎥   ⎢                 ⎥   ⎢   ⎥
⎢y₃₀⎥   ⎢x₃₀⋅b₀₀ + x₃₁⋅b₁₀⎥   ⎢ε₃₀⎥
⎢   ⎥   ⎢                 ⎥   ⎢   ⎥
⎣y₄₀⎦   ⎣x₄₀⋅b₀₀ + x₄₁⋅b₁₀⎦   ⎣ε₄₀⎦

看起来LaTeX打印是正确的:

In [16]: print(latex(Eq(y.as_explicit(), MatAdd((x*b).as_explicit(), (e).as_explicit()))))
\left[\begin{matrix}y_{0, 0}\\y_{1, 0}\\y_{2, 0}\\y_{3, 0}\\y_{4, 0}\end{matrix}\right] = \left[\begin{matrix}x_{0, 0} b_{0, 0} + x_{0, 1} b_{1, 0}\\x_{1, 0} b_{0, 0} + x_{1, 1} b_{1, 0}\\x_{2, 0} b_{0, 0} + x_{2, 1} b_{1, 0}\\x_{3, 0} b_{0, 0} + x_{3, 1} b_{1, 0}\\x_{4, 0} b_{0, 0} + x_{4, 1} b_{1, 0}\end{matrix}\right] + \left[\begin{matrix}\epsilon_{0, 0}\\\epsilon_{1, 0}\\\epsilon_{2, 0}\\\epsilon_{3, 0}\\\epsilon_{4, 0}\end{matrix}\right]

如果您不希望计算 x*b,您可以使用 MatMul

In [18]: Eq(y.as_explicit(), MatAdd(MatMul(x.as_explicit(),b.as_explicit()), (e).as_explicit()))
Out[18]:
⎡y₀₀⎤ = ⎡x₀₀  x₀₁⎤⋅⎡b₀₀⎤ + ⎡ε₀₀⎤
⎢   ⎥   ⎢        ⎥ ⎢   ⎥   ⎢   ⎥
⎢y₁₀⎥   ⎢x₁₀  x₁₁⎥ ⎣b₁₀⎦   ⎢ε₁₀⎥
⎢   ⎥   ⎢        ⎥         ⎢   ⎥
⎢y₂₀⎥   ⎢x₂₀  x₂₁⎥         ⎢ε₂₀⎥
⎢   ⎥   ⎢        ⎥         ⎢   ⎥
⎢y₃₀⎥   ⎢x₃₀  x₃₁⎥         ⎢ε₃₀⎥
⎢   ⎥   ⎢        ⎥         ⎢   ⎥
⎣y₄₀⎦   ⎣x₄₀  x₄₁⎦         ⎣ε₄₀⎦

In [19]: print(latex(Eq(y.as_explicit(), MatAdd(MatMul(x.as_explicit(),b.as_explicit()), (e).as_explicit()))))
\left\[\begin{matrix}y_{0, 0}\\y_{1, 0}\\y_{2, 0}\\y_{3, 0}\\y_{4, 0}\end{matrix}\right\] = \left\[\begin{matrix}x_{0, 0} & x_{0, 1}\\x_{1, 0} & x_{1, 1}\\x_{2, 0} & x_{2, 1}\\x_{3, 0} & x_{3, 1}\\x_{4, 0} & x_{4, 1}\end{matrix}\right\] \left\[\begin{matrix}b_{0, 0}\\b_{1, 0}\end{matrix}\right\] + \left\[\begin{matrix}\epsilon_{0, 0}\\\epsilon_{1, 0}\\\epsilon_{2, 0}\\\epsilon_{3, 0}\\\epsilon_{4, 0}\end{matrix}\right\]

image


我确实打错了一个字,但幸运的是你还是能够理解我的意思。非常感谢您! - Marvin Ward Jr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接