Python Sympy Solve返回一个空集

Python Sympy Solve返回一个空集,python,sympy,solver,Python,Sympy,Solver,我试图用solve来解以下多项式方程 但是,它返回一个空集 `3*d*x**2 + 2*w*x = 0,` `3*d*y**2 + 2*w*y = 0,` `-d + 2*w*z + 1 =0,` `x**3 + y**3 - z = 0,` `x**2 + y**2 + z**2 - 1 = 0` wolfram alpha返回以下实际解决方案 `d≈0.417238, w≈-0.516977, x = 0, y≈0.826031, z≈0.

我试图用solve来解以下多项式方程 但是,它返回一个空集

    `3*d*x**2 + 2*w*x = 0,` 
    `3*d*y**2 + 2*w*y = 0,`
    `-d + 2*w*z + 1 =0,`
    `x**3 + y**3 - z = 0,`
    `x**2 + y**2 + z**2 - 1 = 0`
wolfram alpha返回以下实际解决方案

    `d≈0.417238, w≈-0.516977, x = 0, y≈0.826031, z≈0.563624`
    `d≈0.417238, w≈-0.516977, x≈0.826031, y = 0, z≈0.563624`
    `d≈0.417238, w≈0.516977, x = 0, y≈-0.826031, z≈-0.563624`
    `d≈0.417238, w≈0.516977, x≈-0.826031, y = 0, z≈-0.563624`
    `d≈0.528689, w≈-0.492358, x≈0.620853, y≈0.620853, z≈0.478626`
如果存在解决方案,我如何确保获得这些解决方案?
有没有其他方法可以更稳健地处理0和其他条件?

好吧,sympy的
solve
寻找完全符号化的解决方案。如果方程太难以符号方式求解(不输出错误或警告),则当前版本将返回空列表

要获得数值解,Symphy具有需要初始猜测的
nsolve
,并且(当前)仅返回一个解

从sympy导入nsolve,符号
d、 w,x,y,z=符号('d w x y z',实=真)
nsolve([3*d*x**2+2*w*x,
3*d*y**2+2*w*y,
-d+2*w*z+1,
x**3+y**3-z,
x**2+y**2+z**2-1],(d,w,x,y,z),(1,1,1,1)
报告的解决方案:

Matrix([[ 0.528689459190352],
        [-0.492357687731282],
        [ 0.620853041008598],
        [ 0.620853041008598],
        [ 0.478626161989451]])

如果您使用Symphy作为纸笔增强,并像手动求解方程一样处理方程,您会发现整个系统可以简化为一个多项式表达式,该表达式(在本例中)具有显式解或可以通过数值求解;然后,该单一变量的解可以重新代入其他方程。总有一天,Symphy会更自动地解决这样的系统,但我希望看到自己的关系会有一些乐趣,就像我在以下方面所做的那样:

定义方程式

>>> from sympy.abc import *
>>> eqs = (3*d*x**2 + 2*w*x,
... 3*d*y**2 + 2*w*y ,
... -d + 2*w*z + 1 ,
... x**3 + y**3 - z ,
... x**2 + y**2 + z**2 - 1 )
>>> eqs=[i.subs(reps) for i in eqs]; eqs
[0, -3*d*x*y + 3*d*y**2, -3*d*x*z - d + 1, x**3 + y**3 - z, x**2 + y**2 + z**2 - 1]
在某个变量中寻找一个线性方程并求解它, 存储解决方案

>>> reps=[(w,solve(eqs[0],w)[0])]
更新方程式

>>> from sympy.abc import *
>>> eqs = (3*d*x**2 + 2*w*x,
... 3*d*y**2 + 2*w*y ,
... -d + 2*w*z + 1 ,
... x**3 + y**3 - z ,
... x**2 + y**2 + z**2 - 1 )
>>> eqs=[i.subs(reps) for i in eqs]; eqs
[0, -3*d*x*y + 3*d*y**2, -3*d*x*z - d + 1, x**3 + y**3 - z, x**2 + y**2 + z**2 - 1]
重复

>>> reps.append((d, solve(eqs[2],d)[0]))
>>> eqs=[i.subs(reps) for i in eqs]; eqs
[0, -3*x*y/(3*x*z + 1) + 3*y**2/(3*x*z + 1), -3*x*z/(3*x*z + 1) + 1 - 1/(3*x*z + 1), x**3 + y**3 - z, x**2 + y**2 + z**2 - 1]
>>> [cancel(i) for i in eqs]
[0, -(3*x*y - 3*y**2)/(3*x*z + 1), 0, x**3 + y**3 - z, x**2 + y**2 + z**2 - 1]

>>> reps.append((z, solve(eqs[-2],z)[0]))
>>> [cancel(i.subs(reps)) for i in eqs]
[0, -(3*x*y - 3*y**2)/(3*x**4 + 3*x*y**3 + 1), 0, 0, x**6 + 2*x**3*y**3 + x**2 + y**6 + y**2 - 1]

>>> reps.append((x, solve(eqs[1],x)[0]))
>>> [cancel(i.subs(reps)) for i in eqs]
[0, 0, 0, 0, 4*y**6 + 2*y**2 - 1]
直到只有一个方程。它在
y**2
中是立方的,因此将有六种解决方案

>>> yy=solve(eqs[-1].subs(reps),y)
>>> [i.n(2) for i in yy]
[-0.62, 0.62, 0.55 - 0.71*I, 0.55 + 0.71*I, -0.55 - 0.71*I, -0.55 + 0.71*I]
现在为每个y构建完整的解决方案

>>> for i in yy:
...     sol=[(y,i)]
...     for v,e in reversed(reps):
...         sol.append((v,e.subs(sol).n(2)))
...     sol[0] = sol[0][0],sol[0][1].n(2)
...     print(sol)
[(y, -0.62), (x, -0.62), (z, -0.48), (d, 0.53), (w, 0.49)]
[(y, 0.62), (x, 0.62), (z, 0.48), (d, 0.53), (w, -0.49)]
[(y, 0.55 - 0.71*I), (x, 0.55 - 0.71*I), (z, -1.3 - 0.59*I), (d, -0.26 - 0.2*I), (w, 0.43 - 0.12*I)]
[(y, 0.55 + 0.71*I), (x, 0.55 + 0.71*I), (z, -1.3 + 0.59*I), (d, -0.26 + 0.2*I), (w, 0.43 + 0.12*I)]
[(y, -0.55 - 0.71*I), (x, -0.55 - 0.71*I), (z, 1.3 - 0.59*I), (d, -0.26 + 0.2*I), (w, -0.43 - 0.12*I)]
[(y, -0.55 + 0.71*I), (x, -0.55 + 0.71*I), (z, 1.3 + 0.59*I), (d, -0.26 - 0.2*I), (w, -0.43 + 0.12*I)]
这会让你在分析这个方程组的过程中走得更远。我建立的解决方案仅用于演示目的;如果您不在每次添加时求值,而是等到最后,然后在打印之前对sol中的k,v执行
sol={k:v.n(2)操作,则可以获得更精确的解决方案

通过研究这些方程,你会发现基本上你有4个线性关系,一个变量中有一个多项式