[英]Mathematical Equations - Rendering and Evaluation with Python and QT (and sympy?)
我正在使用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)
我已经读过sympy并不是最初为显示方程式而开发的,但是对于更复杂的方程式来说,结果几乎是不可读的(也是不可预测的)。 我尝试使用“可交换的”参数,但总是以如下所示的混合方程式结尾: http ://www.oberthanner.at/render.png我错过了要点还是使用sympy不可能?
顺便说一句:我在使用python2时遇到了交换参数的不同行为。
commutative=False
只会将该符号标记为不可交换。 SymPy将把通勤部分(在本例中为其他所有部分)放在第一位,并以正确的顺序跟随非通勤符号。
但是您不应该使用它。 它不会满足您的要求(例如,如果a
和b
是不可交换的,您将得到a*b**-1
而不是a/b
,因为a*b**-1
和b**-1*a
是不同的)。
我建议仅获取所需单个部分的乳胶,然后使用字符串格式按照需要的顺序将它们拼接在一起。
或者,您可以编写自己的打印机,以所需的方式订购商品。 如果您对采用这种方法感兴趣,请参见http://docs.sympy.org/latest/modules/printing.html ,并且还应该阅读现有打印机的源代码,因为您可能只想采用已经存在并对其进行一些修改。 如果您希望更通用,则此方法很好,并且基本字符串连接变得过于混乱。 如果您显示的示例非常复杂,则可能会适得其反,但是如果您需要支持可能任意复杂的表达式,则最好这样做。
如果您决定采用第二种方法,并且在编写自定义打印机方面需要帮助,请随时在此处或在SymPy邮件列表中询问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.