求解含3个未知数的二元方程组:Numpy代码错误求助
问题分析与解决方案
一、NumPy代码错误排查
你的代码报错的核心原因:
- 这是2个方程、3个未知数的欠定线性系统,不存在唯一解
np.linalg.inv()仅支持处理方阵(行数=列数),而你的M1是2行3列的非方阵,无法执行求逆操作
正确的NumPy求解方式
对于欠定系统,可通过伪逆或最小二乘法获取其中一个特解,示例代码:
import numpy as np M1 = np.array([[10., 5., 0.5], [1., 1., 1.]]) v1 = np.array([100., 100.]) # 方法1:伪逆求解 pinv_M1 = np.linalg.pinv(M1) solution = pinv_M1.dot(v1) print("伪逆求解的一个特解:", solution) # 方法2:最小二乘法求解 solution_lstsq, _, _, _ = np.linalg.lstsq(M1, v1, rcond=None) print("最小二乘解:", solution_lstsq)
注:两种方法得到的都是无穷多解中的一个,若题目隐含非负整数要求(比如实际场景中的物品数量),需要额外筛选。
二、for循环实现方案(针对非负整数解场景)
这类方程组通常对应实际问题,要求x、y、z为非负整数,可通过双层循环遍历验证:
# x的最大可能值:10x ≤100 → x≤10 for x in range(0, 11): # y的最大可能值:5y ≤100-10x → y≤20-2x for y in range(0, 21 - 2*x): z = 100 - x - y # 验证第一个方程 if 10*x + 5*y + 0.5*z == 100: print(f"找到非负整数解:x={x}, y={y}, z={z}")
运行后会得到唯一符合要求的解:x=1, y=9, z=90
补充:通解推导(无整数限制时)
从第二个方程得 z=100-x-y,代入第一个方程化简后得到:
19x + 9y = 100
因此通解为:x=t,y=(100-19t)/9,z=100 - t - (100-19t)/9(t为任意实数,若要求非负则需满足对应约束条件)
内容的提问来源于stack exchange,提问作者Notice
相关产品推荐
相关产品推荐

