Python Sympy可以通过收集多个术语来简化有理表达式吗?
给定一个有理表达式Python Sympy可以通过收集多个术语来简化有理表达式吗?,python,sympy,simplify,Python,Sympy,Simplify,给定一个有理表达式E,比如下面的表达式,我希望使用Sympy将其简化为类似F(在下面的Python代码的第二块中定义): 这张照片 ⎛ B⋅(-c + d) C⋅(-b + c)⎞ ⎛ A⋅(-b + c) B⋅(-a + b) ⎞ n⋅(-b + t)⋅⎜-B + ────────── + ──────────⎟ n⋅(c - t)⋅⎜- ────────── - ────────── + B⎟ ⎝
E
,比如下面的表达式,我希望使用Sympy将其简化为类似F
(在下面的Python代码的第二块中定义):
这张照片
⎛ 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
具有相同结构的表达式。有关于如何进行的建议吗
此外,我想知道Symphy的pretty print函数是否可以进行调整,以便
B-A
而不是-A+B
)。目前,在大多数情况下,顺序是颠倒的,这看起来相当丑陋,带有前导减号a/b c/d
而不是ac/bd
),尽管在某些情况下,在何处/如何“拆分”此类复合分数当然可能不明确这里的情况是,您有一个包含两个术语的
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)
In [123]: signsimp(_)
Out[123]:
n⋅(A - B)⋅(c - t) n⋅(B - C)⋅(b - t)
- ───────────────── + ─────────────────
(a - c)⋅(b - c) (b - c)⋅(b - d)