You need to enable JavaScript to run this app. 如何将Excel Solver求解非线性规划的操作转换为Python代码实现
优惠活动
大模型
产品
解决方案
定价
更多

如何将Excel Solver求解非线性规划的操作转换为Python代码实现

非线性规划Python实现方案

库选型说明

  • pulp仅支持线性、整数这类线性规则的规划问题,无法处理非线性目标/约束的场景
  • sympy以符号计算为核心,不适合做数值型非线性规划求解
  • 你的单变量非线性求最大值场景,直接用scipy.optimize的内置求解器即可,和Excel/Google Sheet Solver的求解逻辑完全匹配

前置准备

你需要先梳理清楚表格的单元格依赖逻辑:由于目标是最大化P15 - I15,其中$I15是绝对引用的固定值,你需要把P15从可变单元格J15开始的所有中间计算公式1:1复现到Python代码中。

实现代码示例

第一步:安装依赖

pip install scipy

第二步:代码实现

from scipy.optimize import minimize_scalar

# 替换为你表格中I15的实际固定值
FIXED_I15 = 120 

# 目标函数:输入为可变单元格J15的取值x,输出为转成最小值的目标(原目标求最大值,加负号转换)
def target_func(x):
    # ------------------- 替换为你表格中P15的实际计算逻辑 -------------------
    # 示例:假设P15的计算逻辑为 J15的平方 + 3*J15 + 其他固定值,你需要完全替换成自己的公式
    P15 = x ** 2 + 3 * x + 40 
    # --------------------------------------------------------------------
    # 原目标是最大化 (P15 - FIXED_I15),转最小化等价于求 -(P15 - FIXED_I15) 的最小值
    return -(P15 - FIXED_I15)

# 如果J15有取值范围限制(比如不能小于0、不能大于200),修改下面的边界值,没有限制可以删掉bounds参数改求解方法
j15_value_range = (0, 200)

# 执行求解
solve_result = minimize_scalar(target_func, bounds=j15_value_range, method='bounded')

# 输出结果
if solve_result.success:
    print(f"最优J15取值:{round(solve_result.x, 4)}")
    print(f"最大(P15 - I15)值:{round(-solve_result.fun, 4)}")
else:
    print(f"求解失败,错误信息:{solve_result.message}")

扩展场景处理

如果你的Solver配置了额外约束条件(比如某关联单元格取值不能超过阈值),可以改用scipy.optimize.minimize接口,传入约束配置即可,示例约束写法如下:

# 示例约束:J15对应的K15单元格(计算逻辑为2*x + 10)不能大于100
constraints = [
    {"type": "ineq", "fun": lambda x: 100 - (2 * x + 10)} # 约束要求返回值>=0,等价于2x+10 <=100
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 16:42:00