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

时间:2014-01-02 16:11:04

标签: python matrix sympy

我正在尝试使用Sympy来分解IPython Notebook中的估算程序。能够在每个步骤中使用全线性方程显示来辅助数据操作将是非常有用的。举一个简单的回归示例,我有以下设置:

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()

enter image description here

...但是我无法在Sympy中找到允许显示完整方程的方法(以下是使用online latex editor呈现的):

enter image description here

基本上每当我使用equals运算符时,它都被合理地视为赋值,并且加法运算符将 MatrixSymbol 转换为 MatAdd 对象,该对象不支持{{ 1}}方法。对此问题的任何想法都将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果您明确调用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]

enter image description here

如果您不想评估MatMul

,可以使用x*b
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