2014-01-12 69 views
6

我想能夠解析字符串方程(等於0),然後通過使用我有權訪問的變量字典來解決它們。使用SymPy來一般地解析和求解方程

例如:

s = '(x/z)-y' 
eq = parse(s) 
eq.solve({'x': 10, 'y': 5}) 
print(eq) 
>>> {'z': 2} 

現在我寫的代碼,一個月前做了這樣的事情,但我無法找到它。不過我記得我使用了SymPy及其sympify函數,以及它的求解函數。我已經檢查過關於這些功能的文檔,但是我一直無法圍繞如何讓他們按照我的意願工作。

還有一個額外的問題: 是否有可能以某種方式包裝變量,以便我可以使用更多的東西而不僅僅是一封信給他們? 實例:不 '{MYVAR-42}' 的是 'x' 我能有

編輯:

好吧,我終於成功地寫一些代碼,做了什麼,我想:

eq = sympify('(x/y)-z', locals={'x': 10, 'z': 5}) 
solution = solve(eq, dict=True) 
print(solution) 
>>> [{'z': 2}] 

但我的「額外」問題依然存在。

+0

''MYVAR-42'' - 只是解析字符串。 – aIKid

+0

@alKid如何?如果我在包含括號的字符串上使用sympify,它會給我錯誤(因爲它認爲它是字典或其他東西)。我想出了一個解決方案:我可以用正則表達式代替所有{*}並用字母替換它們,然後在解決完成後,我可以使用替換時創建的字典將它們放回去。 – fgblomqvist

回答

5

正如您發現的,sympify將字符串轉換爲SymPy表達式。

要回答您的其他問題,符號名稱可以是任何內容,但sympify只會將有效的Python標識符解析爲符號名稱。但你可以做

>>> Symbol('{myvar-42}') + 1 
{myvar-42} + 1 

並注意有效的Python標識符不一定是單個字母。它們可以是字母,數字和下劃線的任意組合,不以數字開頭,如x_2abc123

如果需要還是做字符串解析,但要非有效的Python標識符作爲符號的名字,可能是最徹底的方法是使用普通的名字,並取代他們在其他的,像

>>> expr = sympify('x + 1') 
>>> expr.subs(Symbol('x'), Symbol('{myvar-42}') 
{myvar-42} + 1 

最後,用字母代替的符號,你可以使用locals參數sympify,因爲你所做的一切,或者,如果你想以後取代它們,使用潛艇:

>>> x, y, z = symbols('x y z') 
>>> expr = sympify('x/z - y') 
>>> expr.subs({x: 10, y: 5}) 
10/z - 5 
+0

這正是我一直在尋找的,謝謝! – fgblomqvist

+0

這是如何與auto_symbol一起使用的? – denfromufa

+0

我相信它會捕獲NameErrors,並將未定義名稱定義爲符號的表達式重新運行。 – asmeurer