You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SymPy求解方程组报错unhashable type: 'list',请求排查原因

求解xy平面内垂直单位向量时的SymPy报错问题

我最近尝试用SymPy写一个函数,用来找出xy平面内和给定向量垂直的单位向量,代码如下:

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]))

我觉得xv1, yv1, zv1 = v这个解包操作是没问题的,但运行时却出现了来自SymPy求解模块的错误,搞不清楚报错里提到的列表到底指的是哪一个,有没有大佬能帮忙分析一下?


问题分析与解决

首先,你的解包操作确实是正确的——传入的[3,5,1]是长度为3的列表,完全可以被拆分为三个变量。那报错的根源在哪里呢?

其实是SymPy在处理数值代入符号方程时的细节问题:当你把数值xv1=3、yv1=5代入方程xv1*xv2 + yv1*yv2 ==0后,方程变成了3*xv2 +5*yv2 ==0,结合单位向量方程,理论上应该能得到两个解,但如果你的SymPy版本较旧,可能会在处理这类整数系数的方程组时出现解析问题。

不过更稳妥的写法是先把向量的x、y分量单独提取出来(毕竟我们只用到这两个分量),同时把SymPy的导入放到函数外面,避免重复导入:

import sympy

def vectPerpend(v):
    """找出xy平面内与给定向量垂直的单位向量"""
    xv1, yv1 = v[0], v[1]  # 只提取需要的x、y分量,z分量用不到
    xv2, yv2 = sympy.symbols("xv2,yv2")
    # 定义方程组
    equations = [
        xv2 ** 2 + yv2 ** 2 == 1,
        xv1 * xv2 + yv1 * yv2 == 0
    ]
    # 求解方程组
    solutions = sympy.solve(equations, [xv2, yv2], dict=True)
    return solutions

print(vectPerpend([3, 5, 1]))

运行这段代码后,应该能得到正确的解:

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

如果还是报错,建议检查你的SymPy版本,通过pip install --upgrade sympy升级到最新稳定版,旧版本的solve函数确实存在一些边界情况的bug。

内容的提问来源于stack exchange,提问作者LetzerWille

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:17:08