E給定如下所示的有理表達式,我希望使用 Sympy 將其簡化為類似的東西F(在下面的第二個 Python 代碼塊中定義):import sympy as spa, b, c, d, n, t, A, B, C = sp.symbols('a, b, c, d, n, t, A, B, C', real = True)E = n/(c-b) * ( B - (c-b)/(c-a)*A - (b-a)/(c-a)*B ) * (c-t)/(c-b) + n/(c-b) * ( (d-c)/(d-b)*B + (c-b)/(d-b)*C - B ) * (t-b)/(c-b)print(sp.pretty( E ))print(sp.pretty( E.simplify() ))這打印 ? B?(-c + d) C?(-b + c)? ? A?(-b + c) B?(-a + b) ?n?(-b + t)??-B + ────────── + ──────────? n?(c - t)??- ────────── - ────────── + B? ? -b + d -b + d ? ? -a + c -a + c ?───────────────────────────────────────── + ───────────────────────────────────────── 2 2 (-b + c) (-b + c) -n?((a - c)?(b - t)?(-B?(b - d) + B?(c - d) + C?(b - c)) + (b - d)?(c - t)?(A?(b - c) + B?(a - b) - B?(a - c))) ──────────────────────────────────────────────────────────────────────────────────────────────────────────────── 2 (a - c)?(b - c) ?(b - d) 但是,可以手動進一步簡化該表達式,我將其結果標記為F:F = n/(c-a) * (B - A) * (c-t)/(c-b) + n/(d-b) * (C - B) * (t-b)/(c-b)print(sp.pretty( F ))print((F-E).simplify())這輸出n?(-A + B)?(c - t) n?(-B + C)?(-b + t)────────────────── + ───────────────────(-a + c)?(-b + c) (-b + c)?(-b + d) 0我研究了各種選項,包括factor(),collect()和apart(),但這些選項似乎都不會產生與 具有相同結構的表達式F。關于如何進行的任何指示?此外,我想知道是否可以通過某種方式調整 Sympy 的漂亮打印功能以保持分子和分母中變量的原始順序(例如,B - A而不是-A + B)。目前,在大多數情況下順序是顛倒的,前導減號看起來相當難看。將復合分數顯示為簡單分數的乘積(例如,a/b c/d而不是ac/bd),盡管在某些情況下,在何處/如何“拆分”此類復合分數當然可能不明確。
1 回答

慕俠2389804
TA貢獻1719條經驗 獲得超6個贊
這里的情況是你有Add兩個術語。每項單獨使用都可以簡化factor,但取消的因素各不相同,因此factor整體調用Add未能找到可能的取消。
Add考慮到這一點,我們需要小心地獨立處理我們可以通過訪問來完成的條款.args:
In [122]: E.func(*(factor(term) for term in E.args))
Out[122]:
n?(A - B)?(-c + t) n?(B - C)?(-b + t)
────────────────── - ──────────────────
(a - c)?(b - c) (b - c)?(b - d)
變量的順序實際上是由打印機在顯示表達式時確定的,不一定與參數的內部順序相同,也不一定與創建表達式時使用的順序相同。調用signsimp可以規范化表達式中的減號
In [123]: signsimp(_)
Out[123]:
n?(A - B)?(c - t) n?(B - C)?(b - t)
- ───────────────── + ─────────────────
(a - c)?(b - c) (b - c)?(b - d)
添加回答
舉報
0/150
提交
取消