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

带矩阵线性等式约束的L₁范数最小化问题求解及代码实现

在约束Mx=y下最小化L₁范数的实现方案

我最近碰到这么个问题:需要在线性约束条件 Mx = y 下,最小化向量x的L₁范数。这里的参数定义是:

  • x是b维向量
  • y是a维向量
  • M是a×b维度的矩阵

查了一圈资料后,我决定用scipy.optimize.minimize来实现这个优化问题,下面是整理好的代码和关键细节:

核心实现代码

import numpy as np
from scipy.optimize import minimize

def objective(x):
    # 定义L₁范数作为目标函数
    return np.linalg.norm(x, ord=1)

# 假设这里已经提前定义好a, b, M, y的值
constraints = []  # 存储所有约束函数的列表
for i in range(a):
    # 注意:必须把i和y作为默认参数传入,避免闭包延迟绑定的坑
    def con(x, y=y, i=i):
        return np.matmul(M[i], x) - y[i]
    constraints.append(con)

# 初始化x的初始猜测值(比如全零向量)
x0 = np.zeros(b)

# 执行优化:使用SLSQP求解器,因为它支持等式约束
result = minimize(objective, x0, constraints=[{'type': 'eq', 'fun': con} for con in constraints])

# 输出结果
print("优化后的x向量:", result.x)
print("最小化的L₁范数值:", result.fun)

关键细节说明

  • 目标函数:直接用np.linalg.norm(x, ord=1)计算L₁范数,简洁高效。
  • 约束定义的坑:在循环里定义约束函数时,一定要把i和y作为默认参数传入。如果不这么做,Python的闭包会延迟绑定变量,导致所有约束函数最后都引用循环的最后一个i值,完全不符合预期。
  • 求解器选择:minimize函数默认的求解器可能不支持等式约束,这里用SLSQP求解器是因为它能很好处理线性/非线性的等式、不等式约束。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:52:30