如何用scipy.optimize.minimize设置约束找到目标边际对应最低售价
问题描述
我需要最小化输入值x(售价),直到输出值y(边际)恰好达到目标值或存在微小误差。我知道可以用scipy.optimize.minimize函数,但配置不对。
我写了一个函数optimize_fun_test(price),输入售价能计算产品的销售边际。比如输入100欧元时,边际是25%(0.25),我的目标边际是12.334452%(0.1233452),此时售价应该更低,需要找到满足目标边际(误差≤0.000001)的最低售价。
目前我的代码是:
optimize_fun_test(price) s_price = 100 result = minimize(optimize_fun_test, s_price)
我不清楚怎么设置约束,了解到有等式和不等式约束,猜测应该用等式约束?请问约束是不是要写成这样:
cons=({'type','eq','fun' : lambda x_start: x_start-0.1233452})
正确配置方案
你的思路方向是对的,但约束写法有问题,且minimize的目标函数和约束逻辑需要调整:
目标函数调整
你要最小化售价x,所以目标函数应该直接返回x,而不是返回边际值。原函数optimize_fun_test(x)是用来计算边际的,不能直接作为minimize的目标函数。约束条件修正
等式约束的作用是让optimize_fun_test(x)的输出等于目标边际值(可通过minimize的tol参数控制误差)。你的约束写法有两个错误:
- 字典键值对不能用逗号分隔,必须用冒号
- 约束函数逻辑错误:应该是
optimize_fun_test(x) - 目标边际值,而非x - 目标值(x是售价,不是边际)
- 完整代码示例
from scipy.optimize import minimize # 替换成你实际的边际计算逻辑 def optimize_fun_test(price): # 示例逻辑:仅作演示,需替换为你的业务计算代码 return 0.25 * (price / 100) target_margin = 0.1233452 initial_price = 100 # 目标函数:最小化售价x def objective(x): return x[0] # minimize要求输入为数组,取第一个元素作为售价 # 等式约束:计算出的边际与目标值的差值为0 def constraint(x): return optimize_fun_test(x[0]) - target_margin # 定义约束规则 cons = ({'type': 'eq', 'fun': constraint}) # 执行优化,设置误差容忍度为1e-6 result = minimize(objective, [initial_price], constraints=cons, tol=1e-6) # 输出结果 if result.success: print(f"满足目标边际的最低售价:{result.x[0]:.6f}欧元") print(f"对应的边际值:{optimize_fun_test(result.x[0]):.8f}") else: print("优化失败:", result.message)
- 额外说明
minimize要求输入参数为数组形式,所以初始值用[initial_price],目标函数和约束函数都接收数组x,取x[0]作为售价- 如果售价有下限(比如不能低于成本价),可以添加不等式约束:
{'type': 'ineq', 'fun': lambda x: x[0] - 成本价}
内容的提问来源于stack exchange,提问作者wihee
相关产品推荐
相关产品推荐

