Sympy.solve报AttributeError: 'ImmutableDenseNDimArray'无as_independent属性排查
报错原因与解决方案
错误根因
AttributeError: 'ImmutableDenseNDimArray' object has no attribute 'as_independent' 错误由以下原因导致:
你使用np.dot计算SymPy符号变量与NumPy矩阵的乘积时,返回结果为SymPy与NumPy混用生成的ImmutableDenseNDimArray多维数组对象,而SymPy的solve函数仅支持求解标量符号表达式或表达式列表,无法识别数组类型的输入,因此调用数组对象不存在的as_independent方法时抛出异常。
修复方案
1. 调整函数返回值格式
你当前的f函数返回的是长度和C矩阵列数相等的数组,对应一组待求解的等式,需要将数组展开为SymPy表达式列表再传入solve:
def f(s, new_line_1, k, new_line_2): expr_arr = np.dot(y1, C[s, :]) + np.dot(y2, new_line_1) - np.dot(w1, C[k, :]) - np.dot(w2, new_line_2) # 将数组转为SymPy表达式列表 return [expr for expr in expr_arr]
2. 补充缺失的符号声明
你给出的代码片段中未声明y1、y2、w1、w2符号变量,需要提前定义:
y1, y2, w1, w2 = symbols('y1 y2 w1 w2')
3. 补充变量初始化
循环中用到的s和k需要在每轮外层循环开始时初始化为-1,同时重置new_line_1和new_line_2,避免变量复用导致的逻辑错误:
for i in np.arange(len(sigma[:, ]) - 1): s = -1 k = -1 new_line_1 = np.zeros([1, len(C[0, :])]).astype(int) new_line_2 = np.zeros([1, len(C[0, :])]).astype(int) intersection_1 = [] intersection_2 = [] # 剩余内层逻辑不变
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

