You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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的目标函数和约束逻辑需要调整:

  1. 目标函数调整
    你要最小化售价x,所以目标函数应该直接返回x,而不是返回边际值。原函数optimize_fun_test(x)是用来计算边际的,不能直接作为minimize的目标函数。

  2. 约束条件修正
    等式约束的作用是让optimize_fun_test(x)的输出等于目标边际值(可通过minimize的tol参数控制误差)。你的约束写法有两个错误:

  • 字典键值对不能用逗号分隔,必须用冒号
  • 约束函数逻辑错误:应该是optimize_fun_test(x) - 目标边际值,而非x - 目标值(x是售价,不是边际)
  1. 完整代码示例
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)
  1. 额外说明
  • minimize要求输入参数为数组形式,所以初始值用[initial_price],目标函数和约束函数都接收数组x,取x[0]作为售价
  • 如果售价有下限(比如不能低于成本价),可以添加不等式约束:{'type': 'ineq', 'fun': lambda x: x[0] - 成本价}

内容的提问来源于stack exchange,提问作者wihee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:31:04