【问题标题】:Mathematical Equations - Rendering and Evaluation with Python and QT (and sympy?)数学方程 - 使用 Python 和 QT(和 sympy?)进行渲染和评估
【发布时间】:2014-02-23 07:54:08
【问题描述】:

我正在使用 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 我错过了重点还是同情是不可能的?

顺便说一句:我在使用 python2 时遇到了可交换参数的不同行为。

【问题讨论】:

  • 我在您的问题中看不到与 qt 的任何关系。
  • 我试图完整,但你是对的,我删除了 qt 标签

标签: python math equation sympy


【解决方案1】:

commutative=False 只会将该符号标记为不可交换。 SymPy 会将通勤部分(在本例中为其他所有内容)放在首位,然后以正确的顺序跟随非通勤符号。

但无论如何你都不应该使用它。它不会给你你想要的东西(例如,如果ab 是不可交换的,你会得到a*b**-1 而不是a/b,因为a*b**-1b**-1*a 是不同的)。

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

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

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

【讨论】:

  • 我会听从您的建议,谢谢!但我仍然想知道,为什么在不重新排列术语的情况下打印方程是不可能的。 stackoverflow.com/questions/14624511/…
  • SymPy 立即按规范顺序重新排列术语(这让它将 x*yy*x 视为同一事物),并且根本不跟踪原始顺序。
猜你喜欢
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多