为什么 sympy.solve 在变量较少的情况下会成功,但在变量较少的情况下却会失败更多变量?

问题描述 投票:0回答:1

这个问题涉及 sympy.solve 函数应用于方程组的令人惊讶的行为。这种行为看起来几乎像是一个错误,或者至少是 sympy.solve 函数可以改进的边缘情况。

对于某些方程组(例如,3 个变量的 2 个多项式方程组),sympy.solve 可以找到系统变量子集的解,但当要求求解同一方程组以获得更大的值时会出现错误包含该子集的变量集(即使附加变量没有出现在系统中!)。理论上,求解器应该至少能够通过简单地让附加变量没有约束来找到先前的解决方案(即较小子集的解决方案),所以我想了解为什么这样的示例会导致出现错误。引发的具体错误是找不到有效的子集

输入 sympy.solve 产生此错误的参数的一般模式是什么?我可以举出例子,但我还没有理解一般模式(以及根本原因)。此外,对示例进行非常细微的修改就会将它们变成非示例。

第二个问题是,在计算 w.r.t. 时,是否有解决方法可以使求解函数成功。如此大的变量集?

以下是一些最小的示例和非示例,显示了令人惊讶的行为并说明了该行为如何难以预测:

以下块(包括其各种求解行)全部执行而不会引发错误。

from sympy import symbols, solve
a1,a2,a3=symbols(['a1','a2','a3'])
eqnSystem0=[-8*a1, a1]
eqnSystem1=[-8*a1, a1**2]
eqnSystem2=[a1**2*a2 - 2*a2**3,16*a1**3 + 4*a1*a2**2]
eqnSystem3=[a1, a1**2]
solve(eqnSystem0,[a1,a2],dict=True)
solve(eqnSystem1,[a1,a2],dict=True)
solve(eqnSystem2,[a1,a2],dict=True)
solve(eqnSystem3,[a1,a2],dict=True)

接下来的求解命令也可以正确执行。

solve(eqnSystem0,[a1,a2,a3],dict=True)
solve(eqnSystem2,[a1,a2,a3],dict=True)

但是接下来的两个都会引发错误找不到有效的子集

solve(eqnSystem1,[a1,a2,a3],dict=True)
solve(eqnSystem3,[a1,a2,a3],dict=True)

为什么eqnSystem1eqnSystem3会出现错误,而eqnSystem0eqnSystem2则不会?

sympy solver equation-solving
1个回答
0
投票

修复此问题的拉取请求已提交。解决方法是仅传递感兴趣的变量子集,然后,如果您需要完整的返回解决方案字典,请为未传递的变量重新填充 self :

def solve_sys(eqs, syms):
    free = Tuple(*eqs).free_symbols
    sub = set(syms) & free
    if len(sub) == len(syms):
        return solve(eqs, syms, dict=True)
    sol = solve(eqs, sub, dict=True)
    xtra = {(i,i) for i in set(syms) - sub}
    for d in sol:
        d.update(xtra)
    return sol

例如

from sympy import *
from sympy.abc import x, y, z
>>> solve_sys((x,x**2),(x,y,z))
[{x: 0, z: z, y: y}]
© www.soinside.com 2019 - 2024. All rights reserved.