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
相关产品推荐
相关产品推荐

