python - 收集 sympy 中的相似术语

标签 python sympy symbolic-math scientific-computing

我正在解决 Maxwell Garnett equation使用 SymPy:

solveset(Eq((e-m)/(e+2*m) = n*(a-m)/(a+2*m)), m)

enter image description here

是否可以像 Mathematica 那样通过将相似的术语分组来简化解决方案?

enter image description here

我找到的最接近的食谱是SymPy: How to collect multi-variable terms? ,但这里不能直接应用。

我已经取得了以下进展: enter image description here 但如何获得更紧凑的形式呢?

最佳答案

可以调用collect并给它一个应用于收集后系数的函数,因此我们可以使用factor来对系数进行因式分解:

In [2]: e, a, m, n = symbols('e, a, m, n')

In [3]: sol = solveset(Eq((e-m)/(e+2*m), n*(a-m)/(a+2*m)), m)

In [4]: s1, s2 = sol.args[0]

In [5]: s1
Out[5]: 
                           _____________________________________________________________________________
                          ╱    2  2      2      2          2                       2  2      2        2 
2⋅a⋅n + a - e⋅n - 2⋅e   ╲╱  4⋅a ⋅n  + 4⋅a ⋅n + a  + 4⋅a⋅e⋅n  - 26⋅a⋅e⋅n + 4⋅a⋅e + e ⋅n  + 4⋅e ⋅n + 4⋅e  
───────────────────── - ────────────────────────────────────────────────────────────────────────────────
      4⋅(n - 1)                                            4⋅(n - 1)                                    

In [6]: s1.collect(e, lambda c: c.factor() if c.is_polynomial() else c)
Out[6]: 
                              _______________________________________________________
                             ╱  2          2         ⎛   2           ⎞    2        2 
a⋅(2⋅n + 1) + e⋅(-n - 2)   ╲╱  a ⋅(2⋅n + 1)  + 2⋅a⋅e⋅⎝2⋅n  - 13⋅n + 2⎠ + e ⋅(n + 2)  
──────────────────────── - ──────────────────────────────────────────────────────────
       4⋅(n - 1)                                   4⋅(n - 1)                         

In [7]: s2.collect(e, lambda c: c.factor() if c.is_polynomial() else c)
Out[7]: 
                              _______________________________________________________
                             ╱  2          2         ⎛   2           ⎞    2        2 
a⋅(2⋅n + 1) + e⋅(-n - 2)   ╲╱  a ⋅(2⋅n + 1)  + 2⋅a⋅e⋅⎝2⋅n  - 13⋅n + 2⎠ + e ⋅(n + 2)  
──────────────────────── + ──────────────────────────────────────────────────────────
       4⋅(n - 1)                                   4⋅(n - 1) 

is_polynomial 检查是为了阻止 collect 在完成递归子表达式(对 Factor 的最终调用)后将 factor 应用到最终表达式再次扩展一切)。可能有更好的检查可用于更一般的情况。

关于python - 收集 sympy 中的相似术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70767745/

相关文章:

python - 没有名为 sympy 的模块

Julia 符号微分

python-2.x - sympy:替换结果不正确

python - 求解线性方程组和线性不等式

Python Sympy 任意逼近任意 Sympy 表达式?

python - 在 sympy 中对符号表达式进行 lambdifying 时覆盖除法运算符

python - 值错误: I/O operation on closed file: Python

python - Selenium,加载 HTML,无需媒体

python - 调度 Scrapy 蜘蛛以脚本的间隔运行

Python3.x Pandas 均值和 std 返回 NAN