【发布时间】:2020-08-19 11:48:45
【问题描述】:
给定一个有理表达式 E 如下所示,我希望使用 Sympy 将其简化为类似于 F 的内容(在下面的 Python 代码的第二块中定义):
import sympy as sp
a, 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),但在某些情况下,在何处/如何“拆分”此类复合分数当然可能是不明确的。
【问题讨论】: