使用np.linalg.solve求解联立方程组时出现LinAlgError错误的解决方法
np.linalg.solve求解联立方程组时出现LinAlgError错误的解决方法
嗨,这个问题其实很好理清,先看错误提示里的核心信息:Last 2 dimensions of the array must be square——说白了就是你的系数矩阵A不是方阵(行数≠列数),而np.linalg.solve这个函数只能用来处理方程数等于未知数个数的「恰定方程组」,也就是A必须是n行n列的方阵才行。
你的情况是:A是3行2列(对应3个方程、2个未知数),属于超定方程组(方程数量比未知数多,通常不存在精确解),所以用np.linalg.solve肯定会触发报错。
针对这种超定方程组,我们需要用最小二乘法来求最优近似解(也就是让所有方程的误差平方和最小的解),numpy里有两个常用的实现方法:
方法1:用np.linalg.lstsq(专门的最小二乘求解函数)
修改后的代码如下:
import numpy as np A = np.array([[-3.5e11, 1.04e11],[-8.976e10, 1.79e11],[-2.69e11, -1.94e11]]) Y = np.array([8.53e17, 8.53e17, 1.527e21]) # 调用lstsq求解,rcond=None是官方推荐的参数设置 res, residuals, rank, singular_values = np.linalg.lstsq(A, Y, rcond=None) print("最小二乘解:", res)
这个函数会返回解本身,还有残差、矩阵秩、奇异值这些额外信息,如果只关心解的话,取第一个返回值就够了。
方法2:用伪逆矩阵np.linalg.pinv
伪逆矩阵可以适配各种线性方程组(包括超定、欠定),写法更简洁:
import numpy as np A = np.array([[-3.5e11, 1.04e11],[-8.976e10, 1.79e11],[-2.69e11, -1.94e11]]) Y = np.array([8.53e17, 8.53e17, 1.527e21]) # 计算A的伪逆,再和Y相乘得到解 res = np.linalg.pinv(A) @ Y print("伪逆求解的结果:", res)
两种方法得到的结果是完全一致的,都是这个超定方程组的最优近似解。
备注:内容来源于stack exchange,提问作者new-to-coding




