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

SciPy Optimize中NonlinearConstraint无法使用可变向量边界?求解决方案

动态上下界约束的可行实现方案

问题场景

需要对优化输出向量X的变换向量T(X)施加随X动态变化的上下界约束,原尝试直接将上下界函数传入NonlinearConstraint的lb和ub参数,触发错误:

float() argument must be a string or a real number, not 'function'

原代码片段:

def TransformFunction(X):
    return Ta(X) 

def LowerBound(X):   
    return Tb(X) * 0.05

def UpperBound(X):
    return Tb(X) * 0.3

错误的约束创建方式:

Constraint = NonlinearConstraint(
    fun = TransformFunction
    , lb = LowerBound
    , ub = UpperBound
    )

错误原因

NonlinearConstraint的lb和ub仅接受数值类型(标量、数组),不支持直接传入函数。要实现随X变化的上下界,需将约束转化为标准非线性不等式形式。

可行方案

将动态约束LowerBound(X) ≤ TransformFunction(X) ≤ UpperBound(X)拆解为两个等价的不等式约束:

  1. TransformFunction(X) - LowerBound(X) ≥ 0
  2. UpperBound(X) - TransformFunction(X) ≥ 0

实现代码

方式1:拆分两个独立约束

import numpy as np
from scipy.optimize import NonlinearConstraint

# 定义下界约束函数:TransformFunction(X) >= LowerBound(X)
def constraint_lower(X):
    return TransformFunction(X) - LowerBound(X)

# 定义上界约束函数:TransformFunction(X) <= UpperBound(X)
def constraint_upper(X):
    return UpperBound(X) - TransformFunction(X)

# 创建两个非线性约束,要求输出值≥0
constraint1 = NonlinearConstraint(constraint_lower, lb=0, ub=np.inf)
constraint2 = NonlinearConstraint(constraint_upper, lb=0, ub=np.inf)

# 合并约束列表,传入优化器使用
constraints = [constraint1, constraint2]

方式2:合并为单个约束函数

import numpy as np
from scipy.optimize import NonlinearConstraint

# 合并两个约束条件,返回数组形式的结果
def combined_constraint(X):
    lower_diff = TransformFunction(X) - LowerBound(X)
    upper_diff = UpperBound(X) - TransformFunction(X)
    return np.array([lower_diff, upper_diff])

# 创建单个非线性约束,设置两个结果的下界为0,上界为无穷大
constraint = NonlinearConstraint(combined_constraint, lb=[0, 0], ub=[np.inf, np.inf])

两种方式都能让优化器在每次迭代X时,动态计算当前的上下界差值,确保约束条件被满足。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:20:07