2017-03-10 19 views
1

我想按以下順序保存方程的結構。保留sympy公式中的符號順序

*請注意,這是sympy。

Eq=A*X+B*U

其中X,U被分配給其他方程。

Sympy用其他地方指定的變量擴展我的符號。 所以它最終被類似:乙X + B X ** 2 + 3 * A * X 我想要做的就是保護者一個X B U.

更新澄清的順序: 嗨! Thx爲您的答覆。

  1. 嘗試不同的選項後,我發現通過使用Matrixsymbols,可以不操作矩陣中的元素。不過,我仍然無法讓它顯示所需的順序。

  2. 這樣做的原因是,我可以將它保存在jupyter筆記本中,其中的順序可能有助於解釋或記錄特定的過程。

+0

歡迎來到Stack Overflow。請澄清以下問題:1)你確定'A * X + B * U'擴展爲'Bx + Bx ** 2 + 3 * A * x',而不是像'U * B + X * A'? 2)你可以詳細說明你爲什麼要這樣做嗎?象徵性地處理方程式的整個點是這些方面可以由符號引擎自由處理(SymPy在你的情況下)。如果你想保持這個公式,爲什麼不把它保存爲一個字符串? – Wrzlprmft

回答

1

當您使用變量創建表達式時,這些變量的值將在創建過程中使用,例如,

>>> x = cos(3) 
>>> eq = x + 2 
>>> eq 
cos(3) + 2 

所以,如果你想EQ看起來像x + 2,你必須確保x被定義爲符號x

>>> x = Symbol('x') 
>>> eq = x + 2 
>>> eq 
x + 2 

如果您有多個符號,你要控制的順序,使用未評估表情:

>>> A,B,X,U = symbols('A B X U') 
>>> ax = Mul(A, X, evaluate=False) 
>>> bu = Mul(B, U, evaluate=False) 
>>> eq = Add(ax, bu, evaluate=False) 
>>> eq 
A*X + B*U 

你可以在你的願望作爲

值替代
>>> eq.subs({U:x+x**2, X:3*x}) 
3*A*x + B*(x**2 + x) 
>>> expand(_) 
3*A*x + B*x**2 + B*x 

這是否有助於您正在嘗試做什麼?