我正在使用 python3 和 QT 开发一个 GUI 应用程序(在土木工程环境中),并希望以三种不同的方式显示方程式:
- 符号:sigma=N/A
- 值:sigma=200kN/20cm²
- 结果:sigma=10kN/cm²
(1) 和 (2) 的方程式布局和符号顺序必须相同,但我只想在源代码中输入一次方程式。我搜索了很多,这是我能得到的最好的:
class myfancy_equation():
def __init__(self):
self.a = Symbol('a')
self.b = Symbol('b',commutative=False)
self.x = Symbol('x')
self.expr = (self.b * self.a)/self.x
def mlatex(self):
return latex(self.expr)
def mevaluate(self,a_in,b_in,x_in):
unev = self.expr.subs({self.a:a_in,self.b:b_in,self.x:x_in})
symb_names = dict()
symb_names[self.a] = str(a_in)
symb_names[self.b] = str(b_in)
symb_names[self.x] = str(x_in)
# unev_latex = latex(self.expr.subs({self.a:a_in,self.b:b_in,self.x:x_in}))
unev_latex = latex(self.expr,symbol_names=symb_names)
ev = self.expr.subs({self.a:a_in,self.b:b_in,self.x:x_in}).evalf()
return unev,unev_latex,ev
mfe = myfancy_equation()
lat = mfe.mlatex()
un,unl,ev = mfe.mevaluate(5,7,3)
print("Original, unevaluated, evaluated:")
print( lat,"=",unl,'=',ev)
我读到 sympy 最初并不是为显示方程而开发的,但对于更复杂的方程,其结果几乎不可读(且不可预测)。我尝试使用“可交换”参数,但总是以这样的混合方程结束: http://www.oberthanner.at/render.png 我错过了重点还是 sympy 是不可能的?
顺便说一句:我在使用 python2 时遇到了交换参数的不同行为。
请您参考如下方法:
commutative=False 只会将那个符号标记为非交换符号。 SymPy 会将通勤部分(在本例中为其他所有内容)放在首位,然后按照正确的顺序放置非通勤符号。
但是无论如何你都不应该使用它。它不会给你你想要的(例如,如果 a,你会得到 a*b**-1 而不是 a/b和 b 是不可交换的,因为 a*b**-1 和 b**-1*a 是不同的)。
我建议只为您想要的各个部分获取 latex ,然后使用字符串格式按照您想要的顺序将它们拼凑在一起。
或者,您可以编写自己的打印机,按您想要的方式排序。参见 http://docs.sympy.org/latest/modules/printing.html如果您有兴趣走那条路,您还应该阅读现有打印机的源代码,因为您可能只想利用已有的东西并稍微修改一下。如果你想更通用,这个方法很好,基本的字符串连接变得太乱了。如果您展示的示例非常复杂,那么它可能有点矫枉过正,但是如果您需要支持可能任意复杂的表达式,那么这样做可能会更好。
如果您决定走第二条路并需要编写自定义打印机的帮助,请随时在这里或在 SymPy mailing list 上提问.
