sympy - 在 Sympy 中收集多元多项式函数的子表达式
问题描述
我在 Sympy 中有一个 6 级多元方程x
并y
用 Sympy 编写,例如
eqn = a*x**6 + b*x**5*y + c*x**4*y + d*x**3*y + e*x**3*y**2 + ...
有没有办法将(x**2+y**2)
它们收集并重新排列成以下格式?
eqn2 = A*(x**2+y**2)**3 + B*(x**2+y**2)**2 + C*(x**2+y**2) + D
A, B, C, D
可以在x, y
。
到目前为止,我只尝试过collect(eqn, x**2 + y**2)
,它返回了原始方程。
谢谢!
解决方案
考虑使用临时符号z = x**2 + y**2
并替换x**2
为z - y**2
,然后展开和恢复:
>>> ex
A*x**6 + 3*A*x**4*y**2 + 3*A*x**2*y**4 + A*y**6 + B*x**4 + 2*B*x**2*y**2 +
B*y**4 + C*x**2 + C*y**2 + D
>>> ex.subs(x**2, z - y**2).expand().subs(z, x**2 + y**2)
A*(x**2 + y**2)**3 + B*(x**2 + y**2)**2 + C*(x**2 + y**2) + D
尽管这样可行,但也许更直接的做法是通过系数 AD 将表达式分开,然后将这些项集合分解:
def separatevars_additively(expr, symbols=[]):
free = set(symbols) or expr.free_symbols
d = {}
while free:
f = free.pop()
expr, dep = expr.as_independent(f, as_Add=True)
if dep.has(*free):
return None
d[f] = dep
if expr:
d[0] = expr
return d
>>> coeff = var("A:D")
>>> separatevars_additively(ex, coeff)
{B: B*x**4 + 2*B*x**2*y**2 + B*y**4, A: A*x**6 + 3*A*x**4*y**2 + 3*A*x**2*y**4 + A*y**6, D: D, C: C*x**2 + C*y**2}
>>> Add(*[factor(i) for i in _.values()])
A*(x**2 + y**2)**3 + B*(x**2 + y**2)**2 + C*(x**2 + y**2) + D
推荐阅读
- vba - 通过 VB 宏从 Excel 文档中获取所有修订/跟踪更改
- php - 使用 PHP 解析时出现 WHERE NOT EXISTS 的 SQL 语法错误
- html - 刷新时奇怪的随机 HTML 字符
- android - QR 扫描自定义布局
- git - 运行`git clone`时我使用什么协议
- performance - 大单片 vs 多片
- python - 在Python中执行文件夹内的所有文件
- vue.js - 使用 Vuex,为什么 mapGetters 不接受与 mapState 相同的语法?
- docker - PACT.Net 无法分配请求的地址
- javascript - 滚动条显示在其他内容上