SymPy复有理函数相等性测试返回None(未知)问题咨询
SymPy v1.12中复数幂次分式约分的
equals()返回None问题分析 问题复现
首先定义测试所需的符号:
from sympy import * a, b, c, x, y = symbols('a b c x y', real=True) n = symbols('n', integer=True, positive=True)
正常验证场景
以下场景中equals()方法均返回预期的True:
- 实数幂次分式场景
d = (a * x**n + b * x**(n-1) + c) / x**n print(d.equals(a + b/x + c/x**n))
输出:True
- 复数高次项+常数的分式场景
d = (a * (x + I*y)**n + c)/(x + I*y)**n print(d.equals(a + c/(x + I*y)**n))
输出:True
- 复数低次项+常数的分式场景
d = (b * (x + I*y)**(n-1) + c)/(x + I*y)**n print(d.equals(b/(x + I*y) + c/(x + I*y)**n))
输出:True
异常验证场景
当分式同时包含复数高次项、低次项和常数项时,equals()返回None(表示无法确定等价性):
d = (a * (x + I*y)**n + b * (x + I*y)**(n-1) + c)/(x + I*y)**n print(d.equals(a + b/(x + I*y) + c/(x + I*y)**n))
输出:None
原因解析
手动约分后等式显然成立,但SymPy返回None的核心原因在于:
equals()方法依赖内部化简逻辑来比对表达式等价性。对于复数域下混合多种幂次项的分式,符号假设的组合(实数符号+复数表达式+正整数幂次)触发了更复杂的化简分支,导致SymPy无法自动完成完整的约分和等价判定。- 单一类型项的场景化简逻辑更直接:比如单高次项+常数可直接拆分分式,单低次项+常数可通过幂次规则化简;但三种项共存时,内部化简优先级或符号处理逻辑未触发完整约分,导致无法确认两边等价。
临时解决方案
可以通过手动对表达式进行化简后再验证等价性,比如使用expand()或simplify():
d = (a * (x + I*y)**n + b * (x + I*y)**(n-1) + c)/(x + I*y)**n right_side = a + b/(x + I*y) + c/(x + I*y)**n # 方式1:展开两边后比对 print(d.expand().equals(right_side.expand())) # 方式2:化简差值是否为0 print(simplify(d - right_side) == 0)
以上两种方式均会返回True,验证等式成立。
内容的提问来源于stack exchange,提问作者cspence
相关产品推荐
相关产品推荐

