给定一个函数f(x)
,它接受一个输入向量x
并返回一个相同长度的向量,你如何找到这个函数在x
上设置约束的根?(例如x
的每个分量的范围。
令我惊讶的是,我找不到很多有用的信息。在优化和根查找算法的scipy列表中,似乎有一些标量函数的选项,如brentq。我找不到任何算法,支持这样一个选项的多元情况下,虽然。
当然,我们可以做一个变通的方法,比如对返回向量的每个分量求平方,然后使用一个最小化器,比如differential_evolution(这是我实际上认为的唯一一个)。我不能想象这是一个好的策略,因为它杀死了牛顿算法的二次收敛。此外,我觉得这真的很令人惊讶,似乎没有一个选项,因为它必须是一个真正的共同问题。我错过了什么吗?
3条答案
按热度按时间ajsxfq5m1#
解决这个问题的一个(不是特别好,但希望有效)选择是给予求解器一个函数,该函数只在约束区域中具有根,并且以确保求解器被推回适当区域的方式继续(有点像here,但在多维中)。
要实现这一点(至少对于矩形约束),可以实现一个从函数的边界值开始线性连续的
constrainedFunction
:你可以给这个函数传递一个
x
值,你想继续的函数f
,以及两个形状相同的数组lower
和upper
,比如x
,给出所有维度的上下界。现在,您可以将此函数(而不是原始函数)传递给求解器以查找根。延拓的陡度被简单地作为当前的边界值,以防止边界处符号变化的陡跳。为了防止根在约束区域之外,一些小值被添加/减去到正/负边界值。我同意这不是一个很好的方式来处理这一点,但它似乎工作。
这里有两个例子。对于这两种情况,初始猜测都在约束区域之外,但在约束区域中找到了正确的根。
找到约束为[-2,-1]x[1,2]的多维余弦的根给出:
给出:
这也适用于非对角函数:
给出:
w8f9ii692#
如果您想处理带有约束的优化,可以使用facile库,它比scipy.optimize容易使用得多
这里是包的链接:https://pypi.python.org/pypi/facile
下面介绍如何在示例中使用facile库。你需要完善我在这里写的东西,这只是一般性的。如果你提出了错误,告诉我是哪一个。
mpgws1up3#
冒着暗示你可能已经划掉的东西的风险,我相信这应该是可行的,只要
scipy.minimize
。这个函数必须只有一个参数,* 但是 * 这个参数可以是一个vector/list。所以f(x,y)就变成了f(z),其中z = [x,y]。
这里有一个很好的例子,如果你没有遇到过的话,你可能会觉得很有用。
如果你想对一个2x 1的向量施加边界,你可以使用用途:
并将其用作
minimize
中的bounds
参数。