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

使用Scipy线性建模求解时出现全NaN结果的问题求助

问题分析与解决

你尝试用线性规划寻找三种元素每周成本最低的组合,但求解结果全为NaN,核心问题是约束条件设置错误导致问题无解,具体原因和修正方案如下:

错误原因

  1. 不等式约束逻辑完全颠倒
    你原本想表达「每个元素占比≥25%」,但代码里的约束写成了:

    A_ub = np.array([[-0.25, -0.25, -0.25]])
    b_ub = np.array([-1])
    

    对应数学式为:-0.25w -0.25c -0.25b ≤ -1,化简后是w+c+b ≥4,但你同时设置了等式约束w+c+b=1,两个约束完全冲突,导致线性规划无可行解,因此返回NaN。

  2. 目标函数冗余取负
    linprog默认是最小化目标函数,你要最小化总成本,直接用价格作为系数即可,不需要取负数(取负后变成最大化负成本,虽数学上等价,但易混淆)。

修正后的代码

我们用bounds参数直接设置每个变量的上下界(更直观),同时修正目标函数:

import numpy as np
from scipy.optimize import linprog

wprices = np.array([205.5, 215, 225])
cprices = np.array([216.5, 214, 219])
bprices = np.array([184.5, 192, 202])

# 最小占比要求
min_pct = 0.25
num_weeks = len(wprices)

# 目标函数:每周的三种元素价格,直接最小化总成本
c = np.array([wprices, cprices, bprices]).T

# 等式约束:三种元素占比总和为1
A_eq = np.array([[1, 1, 1]])
b_eq = np.array([1])

# 每个变量的上下界:占比≥25%,上限由等式约束自动限制
bounds = [(min_pct, None), (min_pct, None), (min_pct, None)]

optimal_percentages = []
for week in range(num_weeks):
    result = linprog(c[week], A_eq=A_eq, b_eq=b_eq, bounds=bounds)
    if result.success:
        optimal_percentages.append(result.x * 100)  # 转换为百分比
    else:
        optimal_percentages.append([np.nan, np.nan, np.nan])

# 输出结果
print("每周最优占比:")
for idx, pct in enumerate(optimal_percentages):
    print(f"第{idx+1}周:W={pct[0]:.2f}%, C={pct[1]:.2f}%, B={pct[2]:.2f}%")

代码说明

  • 目标函数:直接使用每周的三种元素价格,linprog自动最小化w*wprice + c*cprice + b*bprice,契合成本最低的需求。
  • 约束设置:用bounds直接定义每个元素占比≥25%,避免复杂的不等式矩阵,逻辑更清晰。
  • 等式约束:保证三种元素占比总和为100%,与最小占比约束无冲突(0.25×3=0.75 ≤1,存在可行解空间)。

运行修正后的代码即可得到每周的最优占比组合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:34:51