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)拆解为两个等价的不等式约束:
TransformFunction(X) - LowerBound(X) ≥ 0UpperBound(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
相关产品推荐
相关产品推荐

