使用NumPy求解线性方程组遇报错:Last 2 dimensions of the array must be square
线性方程组求解错误排查与解决
问题重现
你尝试用以下代码求解包含x、y、z的线性方程组,但运行报错:
import numpy as np # Exerciocio de fixação para solução de sistemas lineares # Given ''' 1.5x -y = 0 3x+1-z=0 ''' # Define Ax=b A=np.array([[1.5,-1,0,],[3,0,-1,]]) b=np.array([0,-1]) #Solve x,y,z x,y,z= np.linalg.solve(A,b) #Print x,y,z print((x,y,z))
报错信息:
Traceback (most recent call last): File "script.py", line 14, in <module> x,y,z= np.linalg.solve(A,b) File "<__array_function__ internals>", line 6, in solve File "/usr/local/lib/python3.6/dist-packages/numpy/linalg/linalg.py", line 390, in solve _assertNdSquareness(a) File "/usr/local/lib/python3.6/dist-packages/numpy/linalg/linalg.py", line 213, in _assertNdSquareness raise LinAlgError('Last 2 dimensions of the array must be square') numpy.linalg.LinAlgError: Last 2 dimensions of the array must be square
错误原因
np.linalg.solve的核心要求是系数矩阵A必须是方阵(行数等于列数),也就是方程组的数量必须和未知数的数量一致,才能保证有唯一解。但你的情况是:
- 未知数有3个:x、y、z
- 只有2个方程,属于欠定方程组,这类方程组有无穷多个解,无法用
solve直接求解。
解决方案
针对欠定方程组,有两种常见处理方式:
1. 求最小二乘解
用np.linalg.lstsq可以得到方程组的最小二乘解(方程组相容时会返回其中一个特解):
import numpy as np # 定义系数矩阵和常数项 A = np.array([[1.5, -1, 0], [3, 0, -1]]) b = np.array([0, -1]) # 求解最小二乘解 x, residuals, rank, singular_values = np.linalg.lstsq(A, b, rcond=None) print(f"其中一组解:x={x[0]:.4f}, y={x[1]:.4f}, z={x[2]:.4f}")
运行后会输出一组满足方程组的特解,例如:其中一组解:x=0.0000, y=0.0000, z=1.0000。
2. 推导通解
手动将方程组转化为参数化形式,得到所有解的表达式:
从第一个方程1.5x - y = 0可得:y = 1.5x
从第二个方程3x + 1 - z = 0可得:z = 3x + 1
令x = t(t为任意实数),则通解为:
x = ty = 1.5tz = 3t + 1
可以用代码生成任意多组解:
import numpy as np # 取任意t值,比如t=2 t = 2 x = t y = 1.5 * x z = 3 * x + 1 print(f"当t={t}时,解为:x={x}, y={y}, z={z}")
运行结果:当t=2时,解为:x=2, y=3.0, z=7,代入原方程组验证完全成立。
内容的提问来源于stack exchange,提问作者h1k3rpath
相关产品推荐
相关产品推荐

