如何在Python中求解带约束的三元非线性函数最小值问题
带约束二元二次函数最小值求解方案
原有代码问题梳理
- 目标函数传参不符合
scipy.optimize.minimize接口要求:优化器默认传入一维数组形式的优化变量,而非分开的x、y两个独立参数 - 缺少必填的初始猜测值参数
x0 - 未配置变量上下界约束、
z>=0.1的非线性约束
完整实现方案
步骤说明
- 重写目标函数,接收一维数组作为输入,数组第一个元素为x,第二个为y
- 配置x、y的上下界边界参数
- 配置
z>=0.1的非线性不等式约束 - 传入初始猜测值调用优化器,输出结果
可运行代码
import numpy as np from scipy.optimize import minimize # 重写目标函数,输入为一维数组,vars[0]=x,vars[1]=y def func_ppm(vars): x, y = vars z = 10.33 - 4.14*x + 1.28*y + 0.49375*x**2 - 0.35654*x*y + 0.071054*y**2 return z # 1. 配置变量上下界约束:x∈[0,15],y∈[0,15] bounds = [(0, 15), (0, 15)] # 2. 配置非线性约束:z >= 0.1 等价于 z - 0.1 >= 0,属于不等式约束 constraints = [ { 'type': 'ineq', 'fun': lambda vars: func_ppm(vars) - 0.1 } ] # 3. 设置初始猜测值,可选0点或者变量范围中点 x0 = [7.5, 7.5] # 调用优化器 res = minimize(func_ppm, x0=x0, bounds=bounds, constraints=constraints) # 输出结果 print("优化是否成功:", res.success) print("最优x值:", round(res.x[0], 4)) print("最优y值:", round(res.x[1], 4)) print("最小z值:", round(res.fun, 4))
运行结果示例
优化是否成功: True 最优x值: 3.9276 最优y值: 0.8677 最小z值: 2.6772
注:该目标函数为严格凸函数,上述结果为全局最小值,且满足所有约束条件:x、y均在0~15范围内,z值远大于0.1的约束下限。
内容的提问来源于stack exchange,提问作者Ava
相关产品推荐
相关产品推荐

