给定一个有理表达式E
,如下面的一个,我希望使用symphy将其简化为类似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
具有相同结构的表达式。有关于如何进行的建议吗
此外,我想知道Symphy的pretty print函数是否可以进行调整,以便
B - A
而不是-A + B
)。目前,在大多数情况下,顺序是颠倒的,这看起来相当丑陋,带有前导减号李>a/b c/d
而不是ac/bd
),尽管在某些情况下,在何处/如何“拆分”此类复合分数当然可能不明确李>
这里的情况是你有两个术语的
Add
。可以使用factor
分别简化每个术语,但是要取消的因素不同,因此调用factor
总的来说Add
无法找到可能的取消考虑到这一点,我们需要谨慎地独立处理
Add
的条款,我们可以通过访问.args
来做到这一点:变量的顺序实际上由打印机在显示表达式时确定,不一定与参数的内部顺序相同,也不一定与创建表达式时使用的顺序相同。调用
signsimp
可以使表达式中的减号正常化相关问题 更多 >
编程相关推荐