簡體   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