繁体   English   中英

数学方程-使用Python和QT渲染和评估(和sympy?)

[英]Mathematical Equations - Rendering and Evaluation with Python and QT (and sympy?)

我正在使用python3和QT开发GUI应用程序(在土木工程环境中),并希望以三种不同的方式显示方程式:

  1. 象征性的:sigma = N / A
  2. 值:sigma = 200kN /20cm²
  3. 结果: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将把通勤部分(在本例中为其他所有部分)放在第一位,并以正确的顺序跟随非通勤符号。

但是您不应该使用它。 它不会满足您的要求(例如,如果ab是不可交换的,您将得到a*b**-1而不是a/b ,因为a*b**-1b**-1*a是不同的)。

我建议仅获取所需单个部分的乳胶,然后使用字符串格式按照需要的顺序将它们拼接在一起。

或者,您可以编写自己的打印机,以所需的方式订购商品。 如果您对采用这种方法感兴趣,请参见http://docs.sympy.org/latest/modules/printing.html ,并且还应该阅读现有打印机的源代码,因为您可能只想采用已经存在并对其进行一些修改。 如果您希望更通用,则此方法很好,并且基本字符串连接变得过于混乱。 如果您显示的示例非常复杂,则可能会适得其反,但是如果您需要支持可能任意复杂的表达式,则最好这样做。

如果您决定采用第二种方法,并且在编写自定义打印机方面需要帮助,请随时在此处或在SymPy邮件列表中询问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM