Skip to main content
 首页 » 编程设计

python之数学方程式之使用 Python 和 QT(和 sympy)进行渲染和评估

2025年05月04日9lautakyan007

我正在使用 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 会将通勤部分(在本例中为其他所有内容)放在首位,然后按照正确的顺序放置非通勤符号。

但是无论如何你都不应该使用它。它不会给你你想要的(例如,如果 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 上提问.