[英]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.