如何更改 sympy 中函数导数的打印表示

问题描述 投票:0回答:3

在动态系统中,我的基本值都是时间的函数,

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 函数或我可以调整的东西。

sympy
3个回答
4
投票

我通过替换来做到这一点。这是非常愚蠢的,但它的作用就像一个魅力:

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
等等!您可以有一个包含所有内容的大列表打印的替代品,只需在相关数学步骤后应用即可。)


0
投票
您已经找到的

矢量打印模块是 SymPy 中实现此类打印的唯一地方。

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 表示法来指定变量。 

如果能够选择更短的导数符号,那就太好了。


0
投票
我使用这个调整,你可以禁止在任何地方写入时间依赖性,或者你也可以用更高的导数扩展现有规则:

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)
    
© www.soinside.com 2019 - 2024. All rights reserved.