用 sympy 对矩阵值函数进行泰勒展开
Taylor expansion of matrix-valued function with sympy
我目前正在尝试象征性地表示矩阵指数函数的截断泰勒展开。为此,我将 Python 与 sympy 库一起使用。
我的代码看起来像
import sympy as sy
def taylor_exponential(x: sy.Symbol, order: int):
res = sy.Integer(1)
for k in range(1, order):
res += (x ** k) / sy.factorial(k)
return res
# return sy.series(sy.exp(x), x, n=order)
n = sy.symbols("n")
lambd = sy.symbols("lambda")
H0 = sy.MatrixSymbol("H_0", n, n)
print(taylor_exponential(H0 * lambd, 2))
并且在代码结束前引发了以下异常:
Traceback (most recent call last):
File "mwe.py", line 14, in <module>
H0 = sy.MatrixSymbol("H_0", n, n)
File "mwe.py", line 6, in taylor_exponential
for k in range(1, order):
File "[path]/lib64/python3.6/site-packages/sympy/core/numbers.py", line 2088, in __add__
return Rational.__add__(self, other)
# [ More lines of errors ]
File "[path]/lib64/python3.6/site-packages/sympy/matrices/expressions/matexpr.py", line 95, in __radd__
return MatAdd(other, self).doit()
File "[path]/lib64/python3.6/site-packages/sympy/matrices/expressions/matadd.py", line 36, in __new__
validate(*args)
File "[path]/lib64/python3.6/site-packages/sympy/matrices/expressions/matadd.py", line 67, in validate
raise TypeError("Mix of Matrix and Scalar symbols")
TypeError: Mix of Matrix and Scalar symbols
经过一些研究,我在网上找到了一个代码,它按预期工作并且似乎还混合使用了矩阵和标量符号 (source):
from sympy import *
A = MatrixSymbol("A", 3, 3)
x = MatrixSymbol("x", 3, 1)
dt = symbols("dt")
k1 = A * x
k2 = A * (x + S(1) / 2 * k1 * dt)
k3 = A * (x + S(1) / 2 * k2 * dt)
k4 = A * (x + k3 * dt)
final = dt * S(1) / 6 * (k1 + k2 + k3 + k4) # a matrix expression
ex = Matrix(final) # an explicit representation of expressions, now in the
我的问题如下:为什么第二个代码片段在我的抛出异常时有效?有没有办法实现我想要做的事情(代表 lambda * H 的泰勒展开式,其中 lambda 是标量符号,H 是矩阵)?
您可以将矩阵乘以标量,但不能将矩阵与标量相加:
In [1]: M = MatrixSymbol('M', 2, 2)
In [2]: M
Out[2]: M
In [3]: 2*M
Out[3]: 2⋅M
In [4]: 2 + M
---------------------------------------------------------------------------
TypeError: Mix of Matrix and Scalar symbols
你的问题是 res
是一个整数。它应该是单位矩阵。我不知道如何创建符号维度的单位矩阵,所以我只使用符号 I
:
import sympy as sy
def taylor_exponential(x: sy.Symbol, order: int):
res = sy.MatrixSymbol('I', *x.shape)
for k in range(1, order):
res += (x ** k) / sy.factorial(k)
return res
# return sy.series(sy.exp(x), x, n=order)
n = sy.symbols("n")
lambd = sy.symbols("lambda")
H0 = sy.MatrixSymbol("H_0", n, n)
print(taylor_exponential(H0 * lambd, 4))
输出:
lambda*H_0 + (1/2)*(lambda*H_0)**2 + (1/6)*(lambda*H_0)**3 + I
我目前正在尝试象征性地表示矩阵指数函数的截断泰勒展开。为此,我将 Python 与 sympy 库一起使用。
我的代码看起来像
import sympy as sy
def taylor_exponential(x: sy.Symbol, order: int):
res = sy.Integer(1)
for k in range(1, order):
res += (x ** k) / sy.factorial(k)
return res
# return sy.series(sy.exp(x), x, n=order)
n = sy.symbols("n")
lambd = sy.symbols("lambda")
H0 = sy.MatrixSymbol("H_0", n, n)
print(taylor_exponential(H0 * lambd, 2))
并且在代码结束前引发了以下异常:
Traceback (most recent call last):
File "mwe.py", line 14, in <module>
H0 = sy.MatrixSymbol("H_0", n, n)
File "mwe.py", line 6, in taylor_exponential
for k in range(1, order):
File "[path]/lib64/python3.6/site-packages/sympy/core/numbers.py", line 2088, in __add__
return Rational.__add__(self, other)
# [ More lines of errors ]
File "[path]/lib64/python3.6/site-packages/sympy/matrices/expressions/matexpr.py", line 95, in __radd__
return MatAdd(other, self).doit()
File "[path]/lib64/python3.6/site-packages/sympy/matrices/expressions/matadd.py", line 36, in __new__
validate(*args)
File "[path]/lib64/python3.6/site-packages/sympy/matrices/expressions/matadd.py", line 67, in validate
raise TypeError("Mix of Matrix and Scalar symbols")
TypeError: Mix of Matrix and Scalar symbols
经过一些研究,我在网上找到了一个代码,它按预期工作并且似乎还混合使用了矩阵和标量符号 (source):
from sympy import *
A = MatrixSymbol("A", 3, 3)
x = MatrixSymbol("x", 3, 1)
dt = symbols("dt")
k1 = A * x
k2 = A * (x + S(1) / 2 * k1 * dt)
k3 = A * (x + S(1) / 2 * k2 * dt)
k4 = A * (x + k3 * dt)
final = dt * S(1) / 6 * (k1 + k2 + k3 + k4) # a matrix expression
ex = Matrix(final) # an explicit representation of expressions, now in the
我的问题如下:为什么第二个代码片段在我的抛出异常时有效?有没有办法实现我想要做的事情(代表 lambda * H 的泰勒展开式,其中 lambda 是标量符号,H 是矩阵)?
您可以将矩阵乘以标量,但不能将矩阵与标量相加:
In [1]: M = MatrixSymbol('M', 2, 2)
In [2]: M
Out[2]: M
In [3]: 2*M
Out[3]: 2⋅M
In [4]: 2 + M
---------------------------------------------------------------------------
TypeError: Mix of Matrix and Scalar symbols
你的问题是 res
是一个整数。它应该是单位矩阵。我不知道如何创建符号维度的单位矩阵,所以我只使用符号 I
:
import sympy as sy
def taylor_exponential(x: sy.Symbol, order: int):
res = sy.MatrixSymbol('I', *x.shape)
for k in range(1, order):
res += (x ** k) / sy.factorial(k)
return res
# return sy.series(sy.exp(x), x, n=order)
n = sy.symbols("n")
lambd = sy.symbols("lambda")
H0 = sy.MatrixSymbol("H_0", n, n)
print(taylor_exponential(H0 * lambd, 4))
输出:
lambda*H_0 + (1/2)*(lambda*H_0)**2 + (1/6)*(lambda*H_0)**3 + I