SciPy Optimize 中的非线性约束不适用于矢量边界?

问题描述 投票:0回答:1

我询问了 ChatGPT,但没有帮助。 基本上我想对 X 的变换向量实现约束,比方说 T(X)。 我该怎么做? 这是我的代码:

def TransformFunction(X):
    return Ta(X) 

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

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

其中Ta(X)和Tb(X)是向量x的不同变换,它是优化的输出。 当我尝试这样做时:

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

我收到错误

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

ChatGPT 告诉我这应该可行。 基本上我需要上限和下限能够随着解决方案的变化而变化。有什么解决办法吗?

optimization scipy scipy-optimize nonlinear-optimization scipy-optimize-minimize
1个回答
0
投票

根据 NonlinearConstraint 文档,上限和下限必须是静态值。不支持使用函数的上限和下限。

作为替代方案,请考虑划分功能。

例如,您现有的代码正在尝试执行此操作:

Tb(X) * 0.05 >= Ta(X) >= Tb(X) * 0.03

如果将每个元素除以 Tb(X),则会得到:

0.05 >= Ta(X) / Tb(X) >= 0.03

(注意:这假设 Tb(X) 为正。如果 Tb(X) 为负,则需要交换边界。如果 Tb(X) 可以根据 X 为负或正,则需要一些其他方法。)

© www.soinside.com 2019 - 2024. All rights reserved.