数学方程 - 使用Python和QT进行渲染和评估(和同情?)

时间:2014-01-30 19:53:15

标签: python math equation sympy

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

  1. symbolic:sigma = N / A
  2. 值:sigma = 200kN /20cm²
  3. 结果
  4. :sigma = 10kN /cm²
  5. 对于(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时遇到了交换参数的不同行为。

1 个答案:

答案 0 :(得分:1)

commutative=False只会将一个符号标记为非交换符号。 SymPy将首先放置通勤部分(在本例中为其他所有内容),并按正确顺序使用非通勤符号。

但无论如何你不应该使用它。它不会给你你想要的东西(例如,如果a*b**-1a/b是非交换的,那么你将获得a而不是b,因为a*b**-1和{ {1}}不同)。

我建议只为您想要的各个部件获取乳胶,然后按照您想要的顺序将它们拼接在一起使用字符串格式。

或者,您可以编写自己的打印机,按照您想要的方式订购。如果您对采用该路线感兴趣,请参阅http://docs.sympy.org/latest/modules/printing.html,您还应该阅读现有打印机的源代码,因为您可能只想采取已有的内容并对其进行一些修改。如果你想要更通用,并且基本的字符串连接变得太乱,这种方法很好。如果你展示的例子很复杂,那么它可能有点过分,但如果你需要支持可能任意复杂的表达式,那么这样做可能会更好。

如果您决定采用第二条路线并需要帮助编写自定义打印机,请随时在此处或SymPy mailing list询问。