使用poly()或.as\u poly()后,Sympy的sqf()和sqf\u list()会给出不同的结果

2024-10-01 11:34:25 发布

您现在位置:Python中文网/ 问答频道 /正文

如果在我创建的一个很好的示例上使用sqf()函数或sqf_list()函数,它会给出一个很好的结果。例如:

v = (x1 + 2) ** 2 * (x2 + 4) ** 5

sqf(v) = (1, [(x1 + 2, 2), (x2 + 4, 5)])

但是如果我第一次使用v = poly(v),它只会发现=(1, [(Poly(x1 + 2, x1, x2, domain='ZZ'), 2)])

这是故意的行为吗?我认为这是社会转型的结果

v = (x1 + 2) ^ 2 * (x2 + 4) ^ 5

进入

v = Poly(x1^2*x2^5 + 20*x1^2*x2^4 + 160*x1^2*x2^3 + 640*x1^2*x2^2 + 1280*x1^2*x2 + 1024*x1^2 + 4*x1*x2^5 + 80*x1*x2^4 + 640*x1*x2^3 + 2560*x1*x2^2 + 5120*x1*x2 + 4096*x1 + 4*x2^5 + 80*x2^4 + 640*x2^3 + 2560*x2^2 + 5120*x2 + 4096, x1, x2, domain='ZZ')

有什么方法可以从变换后的v中得到真实的结果吗?或者,如果这是不可能的,看看它打印出一个'错误'(?)的结果


Tags: 方法函数示例domain错误listx1x2
1条回答
网友
1楼 · 发布于 2024-10-01 11:34:25

在解决此问题之前,一个简单的解决方法是:

def mysqf(expr):
    s = sqf(expr)
    r = cancel(expr/s)
    if r == 1:
        return s
    return s*sqf(r)

def mysqf_list(expr):
    s = mysqf(expr)
    c, m = s.as_coeff_Mul()
    return tuple([c, [f.as_base_exp() for f in Mul.make_args(m)]])

或者,您可以确保在将单变量表达式传递给sqf之前使用单变量表达式,方法是分离变量:

def mvsqf(expr):
    d = separatevars(expr)
    assert d
    return Mul(*[sqf(v) for v in d.values()])

mvsqf_list留给感兴趣的读者作为练习

相关问题 更多 >