Python sympy solve error UNHABLE type:&x27;列表';

Python sympy solve error UNHABLE type:&x27;列表';,python,sympy,Python,Sympy,我正试图用辛解一组方程。 似乎xv1,yv1,zv1=v 已正确打开包装。 我看不出错误代码所指的列表 def vectPerpend(v): import sympy 'find vector in x_y plane perpendicular to the given vector' xv2, yv2 = sympy.symbols ("xv2,yv2") xv1, yv1, zv1 = v return sympy.solve ([xv2 **

我正试图用辛解一组方程。
似乎
xv1,yv1,zv1=v
已正确打开包装。
我看不出错误代码所指的列表

def vectPerpend(v):
    import sympy
    'find vector in x_y plane perpendicular to the given vector'
    xv2, yv2 = sympy.symbols ("xv2,yv2")
    xv1, yv1, zv1 = v

    return sympy.solve ([xv2 ** 2 + yv2 ** 2 == 1,
                         xv1 * xv2 + yv1 * yv2 == 0], [xv2, yv2], dict=True)

print (vectPerpend ([3, 5, 1]))
我得到这个错误:

  File "C:\Python36\lib\site-packages\sympy\solvers\inequalities.py", line 671, in reduce_inequalities
    symbols = (set(symbols) or gens) & gens
TypeError: unhashable type: 'list'



`**UPDATE**: the problem was that equations were presented as enequalities.
Changing from xv2 ** 2 + yv2 ** 2 == 1 to xv2 ** 2 + yv2 ** 2 - 1
     and from xv1 * xv2 + yv1 * yv2 == 0 to xv1 * xv2 + yv1 * yv2   
fixed the error.`

错误在于您记录系统的方式

[xv2 ** 2 + yv2 ** 2 == 1, xv1 * xv2 + yv1 * yv2 == 0],
这两个表达式立即计算为False。所以你要求SymPy解决这个系统

[False, False] 
这当然不是故意的,而且会导致奇怪的错误消息

使用
Eq(xv2**2+yv2**2,1)
表示方程式,或者(更容易)用
-
替换
=
,以创建左侧和右侧的差异。传递给
solve
的表达式被理解为等于零

sympy.solve ([xv2 ** 2 + yv2 ** 2 - 1,
              xv1 * xv2 + yv1 * yv2], [xv2, yv2], dict=True)
返回

[{xv2: -5*sqrt(34)/34, yv2: 3*sqrt(34)/34},
 {xv2: 5*sqrt(34)/34, yv2: -3*sqrt(34)/34}]

错误在于您记录系统的方式

[xv2 ** 2 + yv2 ** 2 == 1, xv1 * xv2 + yv1 * yv2 == 0],
这两个表达式立即计算为False。所以你要求SymPy解决这个系统

[False, False] 
这当然不是故意的,而且会导致奇怪的错误消息

使用
Eq(xv2**2+yv2**2,1)
表示方程式,或者(更容易)用
-
替换
=
,以创建左侧和右侧的差异。传递给
solve
的表达式被理解为等于零

sympy.solve ([xv2 ** 2 + yv2 ** 2 - 1,
              xv1 * xv2 + yv1 * yv2], [xv2, yv2], dict=True)
返回

[{xv2: -5*sqrt(34)/34, yv2: 3*sqrt(34)/34},
 {xv2: 5*sqrt(34)/34, yv2: -3*sqrt(34)/34}]

快速看一眼,您似乎要求sympy使用符号列表作为键来构建dict,而不能使用列表作为键(因为它们是可变的,更改列表会破坏dict)。但是你可以用元组代替。在堆栈溢出时,答案不应该被编辑成问题。如果你找到了答案,很好-将其作为答案发布。从快速浏览中,看起来你是在要求sympy使用符号列表作为键构建一个dict,而不能使用列表作为键(因为它们是可变的,更改列表会破坏dict)。但是你可以用元组代替。在堆栈溢出时,答案不应该被编辑成问题。如果你找到了答案,很好-把它作为一个答案贴出来。很好!虽然我不得不承认错误信息在这一点上是相当误导的..很好的捕捉!虽然我不得不承认错误信息在这一点上是相当误导的。。