使用Numpy求解线性方程组遇ValueError报错求助
解决Numpy求解超定线性方程组的报错问题
咱先拆解你遇到的两个核心问题:
1. 数组A的创建语法出错
你写的A = np.array([-950],[-550],[-250])犯了个小语法错误——np.array()只接受一个主要的数组参数(比如一个嵌套列表),你却把三个独立的列表当成了三个位置参数传进去,这就触发了ValueError: only 2 non-keyword arguments accepted的报错。
正确的创建方式应该把所有元素放进一个大列表里,生成3行1列的二维系数矩阵:
A = np.array([[-950], [-550], [-250]])
2. 用错了求解函数
你的方程组是超定方程组:3个方程,却只有1个未知数X(虽然X是3D数组,但每个位置的元素都是独立求解的)。而np.linalg.solve()只适用于方阵且可逆的情况(也就是n个方程对应n个未知数),显然这里不符合条件。
对于超定方程组,我们需要用最小二乘法来找到最优解(最小化所有方程的残差平方和),Numpy里有现成的工具可以用:
方法一:使用np.linalg.lstsq()
这是最直接的最小二乘求解方法,代码示例如下:
import numpy as np # 假设你的3D数据已经定义好:b1000_data, b600_data, b300_data, b50_data A = np.array([[-950], [-550], [-250]]) B = np.array([ np.log(b1000_data / b50_data), np.log(b600_data / b50_data), np.log(b300_data / b50_data) ]) # 执行最小二乘求解,rcond=None是为了适配最新的Numpy版本 X, residuals, rank, singular_values = np.linalg.lstsq(A, B, rcond=None) # 去掉多余的维度,得到和输入数据同形状的3D数组X X = X.squeeze()
方法二:使用伪逆求解
伪逆np.linalg.pinv()也能得到和最小二乘一致的结果,写法更简洁:
X = np.linalg.pinv(A) @ B X = X.squeeze()
两种方法都会自动处理3D数组的每个元素,不需要你手动循环,非常高效。
内容的提问来源于stack exchange,提问作者Omar Kamal
相关产品推荐
相关产品推荐

