给定一个接受输入向量x
并返回相同长度向量的函数f(x)
,那么如何找到{x
的每个组件的一个范围。)
令我惊讶的是,我找不到很多有用的信息。在Optimization and Root finding algorithms的scipy列表中,似乎有一些标量函数的选项,例如brentq。但我找不到任何算法支持这种多变量情况下的选择。在
当然,我们可以做一些工作,比如将返回向量的每个分量平方,然后使用一个最小值,比如differential_evolution(这是我认为的唯一一个)。但我不能想象这是一个好的策略,因为它扼杀了牛顿算法的二次收敛性。另外,我觉得很奇怪,似乎没有一个选择,因为这肯定是一个非常普遍的问题。我错过什么了吗?在
如果你想处理一个有约束的优化,你可以使用方便的lirbary,这比scipy.optimize公司在
以下是指向程序包的链接:
https://pypi.python.org/pypi/facile/1.2
以图书馆为例。你需要改进我在这里写的东西,这只是一般性的。如果你有错误,告诉我是哪一个。在
解决这个问题的一个方法(不是特别好,但希望是有效的)是给解算器一个只在约束区域有根的函数,并且以确保解算器被推回适当区域(有点像here但在多个维度中)继续。在
要实现这一点(至少对于矩形约束),可以实现一个
constrainedFunction
,它从函数的边界值开始线性连续:您可以传递给这个函数一个},就像{}一样,给出了所有维度的上下限。现在可以将此函数而不是原始函数传递给解算器以查找根。在
x
值,您想要继续的函数f
,以及两个形状相同的数组lower
和{为了防止边界处的标志变化出现陡跳,只需将延拓的陡度作为边界值。为了防止根超出约束区域,在正/负边界值上添加/减去一些小值。我同意这不是一个很好的方法来处理这个问题,但它似乎是有效的。在
这里有两个例子。对于这两种情况,初始猜测都在约束区域之外,但在约束区域中找到了正确的根。在
求约束为[-2,-1]x[1,2]的多维余弦的根可以得到:
^{pr2}$给出:
这也适用于非对角函数:
给出:
冒着暗示你可能已经划掉的东西的风险,我相信只要
scipy.minimize
这应该是可行的。问题是函数必须只有一个参数,但是该参数可以是向量/列表。在所以f(x,y)就变成了f(z),其中z=[x,y]。在
如果您没有遇到过一个很好的例子,here。在
如前所述,如果要对2x1向量施加边界,可以使用:
并将其用作
bounds
内的bounds
参数。在相关问题 更多 >
编程相关推荐