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)