Python求解带约束代数问题:找出所有符合条件的数对
解决方法:生成符合条件的数对
首先明确数学关系:数对(a, b)满足平均值为54,即(a + b)/2 = 54,等价于a + b = 108。结合约束条件2 ≤ a ≤75、2 ≤ b ≤75,可推导出a的有效范围:
- 由
b = 108 - a代入b的约束:2 ≤ 108 - a ≤75 - 解不等式得
33 ≤ a ≤106,再结合a ≤75,最终a的范围是33 ≤ a ≤75,对应的b = 108 - a会自动满足2 ≤ b ≤75(当a=33时b=75,a=75时b=33)。
以下是两种实现方式:
方法1:直接生成离散数对(无需SymPy)
若要生成所有保留6位小数的数对,直接遍历a在[33,75]区间内、步长为0.000001的数值,计算对应b并格式化即可:
step = 1e-6 # 对应6位小数精度 start = 33.0 end = 75.0 pairs = [] a = start # 加1e-10避免浮点精度问题导致漏掉end值 while a <= end + 1e-10: b = 108.0 - a # 保留6位小数 a_rounded = round(a, 6) b_rounded = round(b, 6) pairs.append((a_rounded, b_rounded)) a += step # 验证前5组结果 print(pairs[:5])
方法2:用SymPy处理代数约束
如果需要用SymPy推导约束范围,再生成数对:
from sympy import symbols, Eq, solve, Interval a, b = symbols('a b') # 定义平均值方程 eq = Eq((a + b)/2, 54) # 解出b关于a的表达式 b_expr = solve(eq, b)[0] # 得到b = 108 - a # 定义约束条件 a_constraint = (a >= 2) & (a <= 75) b_constraint = (b_expr >= 2) & (b_expr <= 75) # 合并约束,解出a的有效区间 combined_constraint = a_constraint & b_constraint a_valid_range = solve(combined_constraint, a) # 结果为33 ≤ a ≤75 # 基于区间生成离散数对 start = float(a_valid_range.left) end = float(a_valid_range.right) step = 1e-6 pairs = [] current_a = start while current_a <= end + 1e-10: current_b = 108.0 - current_a pairs.append((round(current_a, 6), round(current_b, 6))) current_a += step
注意:满足条件的数对在连续区间内是无限多的,上述代码生成的是离散的、保留6位小数的所有可能数对。若仅需明确数对的形式,结论为:所有数对为(a, 108 - a),其中a属于[33,75]且最多保留6位小数。
内容的提问来源于stack exchange,提问作者LostinSpatialAnalysis
相关产品推荐
相关产品推荐

