使符號和表達之間的區別:
import sympy as sy
a, b, c = sy.symbols('a:c')
a_expr = sy.sympify("b + 5")
b_expr = sy.sympify("c + 5")
c_expr = sy.sympify("5")
sy.solve([sy.Eq(a,a_expr), sy.Eq(b,b_expr), sy.Eq(c,c_expr)])
產生
{c: 5, b: 10, a: 15}
以上,a
是一個符號,但a_expr
是一個表達式:
In [117]: type(a)
Out[117]: sympy.core.symbol.Symbol
In [118]: type(a_expr)
Out[118]: sympy.core.add.Add
給出的公式的一個字典如
formulas = {'a': 'b+5', 'b': 'c+5', 'c': '5'}
你可以形成具有list comprehension
equations = [sy.Eq(sy.symbols(variable), sy.sympify(expr))
for variable, expr in formulas.items()]
方程和求解方程的系統與
solution = sy.solve(equations)
# {c: 5, b: 10, a: 15}
爲什麼你不應該使用sympy.var
:
當動態變量處理 - 變量,其名稱是未知的,直到 運行時間 - 最好是避免使用sy.var
。 sy.var
將該變量的名稱 添加到全局名稱空間。這樣做的唯一目的是,如果你 要參考變量名稱。但通過假設,變量 的名字在運行時間之前是未知的。所以腳本代碼不應該 - 實際上, 不應該能夠 - 通過名稱引用變量。因此,如果變量是真正動態的,則使用sy.var
應該沒用。
然而這並不是真正的問題。動態變量名稱(字符串) 可以
In [22]: formulas.keys()
Out[22]: ['a', 'c', 'b']
上市和sy.Symbols
可以
In [23]: solution.keys()
Out[23]: [c, b, a]
上市所以,你可以寫循環而不必定義 訪問每個變量每個符號的全局變量名稱。
謝謝!一旦你理解了這個概念,它就變得如此明顯。 是否有任何方式以動態方式聲明符號(例如,來自列表或長度未知的字典)? – gimili
你的意思是你想要給出一個像[['b + 5','c + 5','5']'這樣的列表來聲明符號'a','b','c'嗎?你知道預先顯示在列表中的變量名嗎? – unutbu
這個想法是能夠計算一個動態系統。鑑於例如字典{'a':'b + 5','b':'c + 5','c':'5'} 有沒有爲字典的每個條目(鍵)創建所有符號的方法,而事先不知道字典將會是多久以及密鑰將會有哪些名字? – gimili