为了账号安全,请及时绑定邮箱和手机立即绑定

Sympy 可以通过收集多个项来简化有理表达式吗?

Sympy 可以通过收集多个项来简化有理表达式吗?

catspeake 2023-06-06 15:35:42
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) 


查看完整回答
反对 回复 2023-06-06
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信