Sympy复数表达式coeff提取系数返回0的原因及解决方法
问题出现原因
Sympy的coeff()方法本身不会自动对表达式做展开操作,它只会在表达式的*顶层加和结构(Add类型节点)*中匹配目标符号的对应幂次项:
- 最初写的表达式顶层是多个项相加的结构,因此
coeff()可以直接遍历所有项找到对应xgg8、xgg9的一次项系数。 - 当给整个表达式套上
abb3**3*的外层乘法后,表达式的顶层结构变成了乘法节点(Mul类型),没有直接暴露内部的加和项,coeff()在顶层找不到目标符号的一次项,就会直接返回0。
另外需要注意:示例表达式里存在xgg9**2/xgg8项,本质是xgg8的-1次幂,coeff(xgg8)默认只会匹配xgg8的1次幂项,不会自动匹配其他幂次。原代码还漏了符号a的定义,直接运行会触发命名错误。
正确获取系数的操作
最直接的方案是在调用coeff()前,先用expand()方法把表达式完全展开为加和形式,再提取系数,参考代码如下:
import sympy as sp # 补全符号a定义 a = sp.symbols("a") xgg8, xgg9, abb3 = sp.symbols("xgg8, xgg9, abb3") expr = abb3**3*(3 + xgg9 + (xgg8)**2*abb3 + a*(xgg8)*2 + xgg9**2/xgg8) # 先展开表达式 expr_expanded = sp.expand(expr) # 提取一次项系数 coeff_xgg8_1 = expr_expanded.coeff(xgg8) # 等价于coeff(xgg8, 1) coeff_xgg9_1 = expr_expanded.coeff(xgg9)
运行后可以得到正确结果:
- xgg8一次项系数为
2*a*abb3**3 - xgg9一次项系数为
abb3**3
如果需要提取其他幂次的系数,给coeff()传入第二个参数指定幂次即可:
- 取xgg8二次项系数:
expr_expanded.coeff(xgg8, 2),返回值为abb3**4 - 取xgg8负一次项(即分母含xgg8的项)系数:
expr_expanded.coeff(xgg8, -1),返回值为abb3**3*xgg9**2
如果表达式结构更复杂,也可以先用sp.collect(expr, [xgg8, xgg9])对目标变量做项收集,再调用coeff()提取系数,效果和先展开一致。
内容的提问来源于stack exchange,提问作者Jun Zhou
相关产品推荐
相关产品推荐

