如何使用Python求解非线性不等式组并计算变量x的最小值
求解思路
你的问题属于带非线性约束的单目标最小化问题,可直接使用scipy.optimize.minimize求解,问题可形式化表述为:
- 优化目标:最小化x
- 约束条件:
- 12 < x*y <14
- 2x + 3y >40
- 隐含约束x>0、y>0(由xy乘积为正可推导)
实现代码
scipy.optimize.minimize支持自定义非线性约束,我们将严格不等约束通过添加极小偏移量epsilon转化为求解器支持的非严格不等约束即可:
from scipy.optimize import minimize import numpy as np # 目标函数:最小化x def objective(var): x, y = var return x # 严格不等约束转非严格,添加极小epsilon避免取到边界值 epsilon = 1e-6 constraints = ( {"type": "ineq", "fun": lambda var: var[0]*var[1] - 12 - epsilon}, # x*y > 12 {"type": "ineq", "fun": lambda var: 14 - var[0]*var[1] - epsilon}, # x*y <14 {"type": "ineq", "fun": lambda var: 2*var[0] + 3*var[1] -40 - epsilon}, # 2x+3y>40 {"type": "ineq", "fun": lambda var: var[0] - epsilon}, # x>0 {"type": "ineq", "fun": lambda var: var[1] - epsilon} # y>0 ) # 初始猜测值,可根据实际情况调整,避免陷入局部最优 init_guess = np.array([10.0, 10.0]) # 调用求解器,默认使用支持非线性约束的SLSQP算法 res = minimize(objective, x0=init_guess, constraints=constraints) if res.success: opt_x, opt_y = res.x print(f"满足约束的x最小值:{opt_x:.4f}") print(f"对应y值:{opt_y:.4f}") print(f"约束校验:x*y={opt_x*opt_y:.4f}, 2x+3y={2*opt_x+3*opt_y:.4f}") else: print("求解失败:", res.message)
结果说明
运行上述代码可得到x的最小值约为17.9722,你可以通过调整epsilon的大小控制严格不等的精度,也可以修改minimize的tol参数调整求解精度。如果求解失败或者结果不符合预期,尝试更换不同的初始猜测值即可。
内容的提问来源于stack exchange,提问作者ELLEN
相关产品推荐
相关产品推荐

