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

如何在SciPy Minimize中对目标函数内部参数设置约束

用SciPy minimize实现带线性约束的优化:构造LinearConstraint矩阵A指南

核心思路拆解

你的约束本质是每个vh的元素是x的线性组合,因此可以把所有vh的元素约束转化为关于x的线性不等式组,进而构造LinearConstraint所需的矩阵A、下界lb和上界ub。

步骤1:明确数学关系

假设:

  • 输入向量x维度为n
  • 共有k个m维向量vh,每个vh由m×n的矩阵C_h与x相乘得到:vh = C_h @ x
  • 每个vh的第j个元素需满足:s_lb[j] ≤ vh[j] ≤ s_ub[j](s_lb、s_ub为m维向量)

每个vh[j]是x的线性组合,对应C_h的第j行与x的点积,即C_h[j, :] @ x。

步骤2:构造矩阵A、lb、ub

要把所有k×m个约束整合到LinearConstraint中:

  • 矩阵A:将所有C_h的行按顺序堆叠,最终维度为(k×m) × n。例如,若有2个3×4的C_h,堆叠后A是6×4矩阵。
  • 下界lb:将s_lb重复k次,得到长度为k×m的向量。
  • 上界ub:将s_ub重复k次,得到长度为k×m的向量。

代码示例

import numpy as np
from scipy.optimize import minimize, LinearConstraint

# 定义参数
n = 2  # x的维度
m = 2  # vh的维度
k = 2  # vh的数量

# 每个vh对应的变换矩阵C_h
C1 = np.array([[1, 2], [3, 4]])
C2 = np.array([[5, 6], [7, 8]])
C_list = [C1, C2]

# 每个vh元素的上下界
s_lb = np.array([0, 1])
s_ub = np.array([10, 20])

# 构造LinearConstraint所需的A、lb、ub
A = np.vstack(C_list)
lb = np.tile(s_lb, k)
ub = np.tile(s_ub, k)

# 创建约束
constraint = LinearConstraint(A, lb, ub)

# 定义目标函数:最小化所有vh与目标向量t的均方误差之和
t = np.array([5, 10])  # m维目标向量

def objective(x):
    mse_sum = 0.0
    for C_h in C_list:
        vh = C_h @ x
        mse_sum += np.sum((vh - t)**2)
    return mse_sum

# 初始猜测x0
x0 = np.zeros(n)

# 执行优化
result = minimize(objective, x0, constraints=[constraint], method='SLSQP')

print("优化结果x:", result.x)
print("最小化的均方误差和:", result.fun)

关键注意事项

  • 确保每个C_h的维度是m×n,这样C_h @ x才能得到m维的vh。
  • 如果你的变换矩阵是一个整体的(k×m)×n大矩阵(而非多个C_h),直接用这个大矩阵作为A即可,无需堆叠。
  • 选择支持线性约束的优化方法,比如SLSQP、trust-constr等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:18:21