我有一个小脚本(我正在使用 Colab 笔记本)来计算双摆的运动方程。
这是我所拥有的:
# First the libraries are imported.
import numpy as np
import sympy as sp
import sympy.physics.mechanics as mech
mech.init_vprinting()
# Symbols
g = sp.symbols('g', real=True, positive = True)
t = sp.symbols('t', real=True, positive = True)
L1 = sp.symbols('L1', real=True, positive = True)
L2 = sp.symbols('L2', real=True, positive = True)
m1 = sp.symbols('m1', real=True, positive = True)
m2 = sp.symbols('m2', real=True, positive = True)
A = sp.Function('A')(t)
B = sp.Function('B')(t)
#Position mass 1
X1 = L1*sp.sin(A)
Y1 = -L1*sp.cos(A)
#Position mass 2
X2 = L1*sp.sin(A) + L2*sp.sin(B)
Y2 = -L1*sp.cos(A) - L2*sp.cos(B)
# Potential energy
V = m1*g*Y1 + m2*g*Y2
# Kinetic energy
T = sp.Rational(1,2) * m1 * ( X1.diff(t)**2 + Y1.diff(t)**2 ) + sp.Rational(1,2) * m2 * ( X2.diff(t)**2 + Y2.diff(t)**2 )
T = T.simplify()
print(f'visualisation of the function through the print command: \n {T}')
print('\n This would be the visualisation of the same function, but writing the variable alone \n')
T
我遇到的问题如下,我想打印符号
$\dot{A}$
(顶部有一个点的A),而不是Derivative(A(t), t)
。我发现这个线程,他们解释说一种方法是添加行:
import sympy.physics.mechanics as mech
mech.init_vprinting()
我就是这样做的,如果我只写变量,它就可以工作。但是,如果我通过 print 命令打印变量,则不起作用。
然后,问题是:有没有一种方法可以使用顶部带有点的符号而不是
derivative(A,t)
,但在与 print 命令一起使用时可以使用?
这就是我得到的:
我尝试使用行
import sympy.physics.mechanics as mech mech.init_vprinting()
,但我没有在表达式上得到符号\dot{A},而是导数(A,t)
这里有两件事。
使用
sympy.physics.mechanics
模块时,为了Latex打印机能够正常工作,时间变量不能有任何假设。因此,请将 t = sp.symbols('t', real=True, positive = True)
替换为 t = sp.symbols('t')
或 t = mech.dynamicsymbols._t
。
以稳健且完整的方式解决字符串可视化问题并不容易。正确的解决方案需要对 Python 内部进行一些挂钩,这非常耗时。如果您可以调整打印语句的编码方式,那么任务将大大简化。考虑这个命令,例如:
print(f'visualisation of the function through the print command: \n {T}')
在这里,我相信Python将用
T
格式化str
,然后将其与其他字符串组合。如果您可以在不使用 f 字符串或 format
或 "string %s" % T
的情况下重写它,我们可以创建自定义打印方法:
from sympy.physics.vector.printing import VectorStrPrinter
printer = VectorStrPrinter()
def myprint(*values, **kwargs):
v = " ".join([printer.doprint(v) for v in values])
print(v)
myprint('visualisation of the function through the print command: \n ', T)
# visualisation of the function through the print command:
# L1**2*m1*A'**2/2 + m2*(L1**2*A'**2 + 2*L1*L2*cos(A - B)*A'*B' + L2**2*B'**2)/2
请注意,
Derivative(A(t), t)
已替换为 A'
。