在动态系统中,我的基本值都是时间的函数,
d(t)
。我使用 d
创建变量 d = Function('d')(t)
,其中 t = S('t')
显然,d 的导数(变化率,如速度等)是很常见的。然而
diff(d(t))
的默认打印给出:-
Derivative(d(t), t)
并且在 ipython 中使用漂亮的打印(例如)可以提供更好看的版本:-
d/dt (d(t))
但是,包含
d(t)
的导数的函数在我的问题中相当长,我希望打印的表示形式类似于 d'(t)
或 \dot(d)(t)
(乳胶)。
这在 sympy 中可能吗?我可能可以使用
subs
解决这个问题,但更喜欢通用的 sympy_print 函数或我可以调整的东西。
我通过替换来做到这一点。这是非常愚蠢的,但它的作用就像一个魅力:
q = Function('q')(t)
q_d = Function('\\dot{q}')(t)
然后替换为
alias = {q.diff(t):q_d, } # and higher derivatives etc..
hd = q.diff(t).subs(alias)
输出高清的头上有一个漂亮的点!
正如我所说:这是一种解决方法并且有效,但是您必须小心才能正确替换(也适用于
q_d.diff(t)
,它必须是 q_d2
等等!您可以有一个包含所有内容的大列表打印的替代品,只需在相关数学步骤后应用即可。)
from sympy.physics.vector import dynamicsymbols
from sympy.physics.vector.printing import vpprint, vlatex
d = dynamicsymbols('d')
vpprint(d.diff()) # ḋ
vlatex(d.diff()) # '\\dot{d}'
常规打印机(pretty、LaTeX 等)不支持导数的素数或点符号。他们编写的
_print_Derivative
方法也适用于多变量表达式,其中必须使用某种 d/dx 表示法来指定变量。如果能够选择更短的导数符号,那就太好了。
from sympy import *
latexReplaceRules = {
# r'{\left(t \right)}':r' ',
r'\frac{d}{d t}':r'\dot',
r'\frac{d^{2}}{d t^{2}}':r'\ddot',
}
def latexNew(expr,**kwargs):
retStr = latex(expr,**kwargs)
for _,__ in latexReplaceRules.items():
retStr = retStr.replace(_,__)
return retStr
init_printing(latex_printer=latexNew)
# Test
t = symbols('t',real=True)
theta = Function('theta',real=True)(t)
theta.diff(t),theta.diff(t,2)