如何在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
相关产品推荐
相关产品推荐

