2011-06-22 41 views
4

我一直在使用SymPy將表達式轉換爲latex(然後由Matplotlib呈現)。例如SymPy自動處理表達式

from sympy import latex, sympify 
from sympy.abc import x 

str = '2*x + 3*x' 

TeX = latex(sympify(str)) 

問題是它自動處理表達式,所以2 * x + 3 * x會自動變成5 * x等;這不是我想要的(不要問!)。

+0

也許你應該只是複製原始的字符串... – phimuemue

+0

我真正想要的方程真分數線,根符號渲染等等,謝謝你的! – Geddes

+1

所以你只是想排版?在這種情況下,像SymPy這樣的CAS可能並不合適......也許[某種LaTeX公式編輯器](http://www.google.com/search?q=latex+equation+editor)?如果這不是你想要的,你可以編輯你的問題更具體嗎? – Simon

回答

5

Sympy的Add類處理符號的添加。您可以提供關鍵字參數來停止自動收集條款。

from sympy import Add 
from sympy.abc import x 

eq = Add(2*x, 3*x, evaluate=False) 

# this will print: 2*x + 3*x 
print eq 

根據您對phimuemue的評論的回覆,這可能不是您想要的。

+0

我的目標是讓學齡學生可以輸入程序將呈現的數學表達式。所以,是的,這不是我所需要的,但非常感謝您的幫助! – Geddes

1

實際上,當你調用sympify(str)時,它會嘗試解析表達式並將它們轉換爲默認類。在這種情況下,Add(2*x,2*x)將被調用(默認參數evalaute = True),所以這成爲5*x。如果你想避免它要麼你必須調用Add(2*x,3*x,evaluate=False)或使用一些全局變量和初始化檢查AssocOp類的方法在覈 - > operation.py

我這樣做

try: 
     import __builtin__ 
     evaluate_expr=__builtin__.evaluate_expr 
    except AttributeError ,ex: 
     pass 

    if ((not options.pop('evaluate', True)) or (evaluate_expr==False)) : 

* *注意 - sympy使用緩存功能,所以如果你用gloabl變量evalute=True調用相同函數(例如:sympy("2*x+3*x"))兩次.1次,第二次調用evaluate=False。在這兩種情況下,因爲緩存,你會得到相同的結果。 所以你需要在core-> expr類中更新像(add,mul)這樣的方法。類似下面

def __add__(self, other): 
     #simplifychange: 
     evaluate_expr=self.get_evaluate() 
     return Add(self, other,evaluate=evaluate_expr) 

但我會建議它會更好,如果你不使用評估=假。 sympy的行爲將會發生巨大的變化。像我的問題正面臨着這個post

+0

很高興知道sympy依靠自動處理來測試平等!省時間! – JeromeJ

-1

>>>進口重新

>>>應用re.sub(「(^ | [\(\ [\ {\ + \ - \ */\ :=')(\ - ?[0-9] * \。?[0-9] +)「,」\\ 1Dummy('\\ 2')「,'2 * x + 3 * x')

「假( '2')* X +假( '3')* X」

>>>的eval(_)

2⋅x+3⋅x

>>>乳膠(_)

「2×3 + X」