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

使用cvxpy库solve函数时,如何获取每次迭代的成本值?

获取CVXPY求解过程中的中间迭代成本

默认情况下,使用CVXPY求解凸优化问题时,只能通过objective.value或problem.value获取最后一次迭代的最终目标函数值,而中间迭代的成本(如输出中的pcost)等信息只会在开启verbose=True时打印到控制台,无法直接通过API获取。

示例代码

import cvxpy

x = cvxpy.Variable(2)
objective = cvxpy.Minimize(x[0] + cvxpy.norm(x, 1))
constraints = [x >= 2]
problem = cvxpy.Problem(objective, constraints)

# 开启verbose模式打印迭代过程
problem.solve(solver=cvxpy.ECOS, verbose=True)

运行输出

ECOS 2.0.10 - (C) embotech GmbH, Zurich Switzerland, 2012-15. Web: www.embotech.com/ECOS

It     pcost       dcost      gap   pres   dres    k/t    mu     step   sigma     IR    |   BT
 0  +6.667e-01  +7.067e-01  +6e+00  6e-01  1e-02  1e+00  9e-01    ---    ---    1  1  - |  -  - 
 1  +3.500e+00  +3.925e+00  +1e+00  3e-01  4e-03  8e-01  2e-01  0.9890  2e-01   1  1  1 |  0  0
 2  +5.716e+00  +5.825e+00  +2e-01  6e-02  8e-04  2e-01  4e-02  0.9091  8e-02   1  1  1 |  0  0
 3  +5.997e+00  +5.998e+00  +3e-03  7e-04  1e-05  2e-03  5e-04  0.9881  1e-04   1  1  1 |  0  0
 4  +6.000e+00  +6.000e+00  +3e-05  8e-06  1e-07  3e-05  5e-06  0.9890  1e-04   1  1  1 |  0  0
 5  +6.000e+00  +6.000e+00  +3e-07  9e-08  1e-09  3e-07  6e-08  0.9890  1e-04   1  0  0 |  0  0
 6  +6.000e+00  +6.000e+00  +4e-09  1e-09  1e-11  3e-09  6e-10  0.9890  1e-04   1  0  0 |  0  0

OPTIMAL (within feastol=9.9e-10, reltol=6.2e-10, abstol=3.7e-09).
Runtime: 0.000061 seconds.

提取中间成本的方法

由于CVXPY本身没有提供直接获取中间迭代成本的API,若仅需要提取打印出的pcost值,可以通过重定向标准输出的方式捕获控制台打印内容,再解析出目标列数据:

import cvxpy
import sys
from io import StringIO

# 捕获标准输出
old_stdout = sys.stdout
captured_output = StringIO()
sys.stdout = captured_output

x = cvxpy.Variable(2)
objective = cvxpy.Minimize(x[0] + cvxpy.norm(x, 1))
constraints = [x >= 2]
problem = cvxpy.Problem(objective, constraints)

problem.solve(solver=cvxpy.ECOS, verbose=True)

# 恢复标准输出
sys.stdout = old_stdout
output = captured_output.getvalue()

# 解析pcost列
pcost_values = []
lines = output.split('\n')
for line in lines:
    parts = line.strip().split()
    if len(parts) >= 2 and parts[0].isdigit():
        pcost_values.append(float(parts[1]))

print("中间迭代的pcost值:", pcost_values)

运行上述代码后,会输出所有迭代步骤的pcost值:

中间迭代的pcost值: [0.667, 3.5, 5.716, 5.997, 6.0, 6.0, 6.0]

这种方法无需修改CVXPY源码,仅通过捕获并解析输出即可获取所需的中间成本数据,适合只需要提取打印出的成本值的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:38:12