我正在使用python3和QT开发GUI应用程序(在土木工程环境中),并希望以三种不同的方式显示方程式:
对于(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)
我已经读过,对于显示方程式而言,并不是主要开发的,但是对于更复杂的方程式,结果几乎不可读(且不可预测)。我试着玩“交换”参数,但总是最终得到这样的混合方程式: http://www.oberthanner.at/render.png 我错过了这一点,还是只是不可能与同情?
btw:我在使用python2时遇到了交换参数的不同行为。
答案 0 :(得分:1)
commutative=False
只会将一个符号标记为非交换符号。 SymPy将首先放置通勤部分(在本例中为其他所有内容),并按正确顺序使用非通勤符号。
但无论如何你不应该使用它。它不会给你你想要的东西(例如,如果a*b**-1
和a/b
是非交换的,那么你将获得a
而不是b
,因为a*b**-1
和{ {1}}不同)。
我建议只为您想要的各个部件获取乳胶,然后按照您想要的顺序将它们拼接在一起使用字符串格式。
或者,您可以编写自己的打印机,按照您想要的方式订购。如果您对采用该路线感兴趣,请参阅http://docs.sympy.org/latest/modules/printing.html,您还应该阅读现有打印机的源代码,因为您可能只想采取已有的内容并对其进行一些修改。如果你想要更通用,并且基本的字符串连接变得太乱,这种方法很好。如果你展示的例子很复杂,那么它可能有点过分,但如果你需要支持可能任意复杂的表达式,那么这样做可能会更好。
如果您决定采用第二条路线并需要帮助编写自定义打印机,请随时在此处或SymPy mailing list询问。