我目前正在尝试使用scipy优化一个函数。我对变量有一些约束,从这个链接可以看到:http://docs.scipy.org/doc/scipy-0.14.0/reference/tutorial/optimize.html,看起来SLSQP正是我想要的。在他们的例子中,他们有一个定义明确的公式来表示输入的结果,从中可以找到梯度。我有一个计算量非常大的函数来计算电磁场如何从金属壁上反弹,这绝不能用封闭的形式来表示(如果您感兴趣的话,我将使用MEEP FDTD Python模拟)。scipy中是否内置了一个等效的函数,可以为您找到函数的梯度,然后进行优化?或者,等效地,scipy中是否内置了一个函数(任何基本的python库都可以),它可以为我找到一个函数的梯度,然后我可以将其传递到这个优化程序中?任何建议都将非常感谢。
2条答案
按热度按时间plicqrtu1#
由于你不能很容易地计算出梯度,所以使用无梯度优化算法可能会有好处。下面是SciPy中一些可用的算法的概述:
http://scipy-lectures.github.io/advanced/mathematical_optimization/#gradient-less-methods
还有盆地跳跃算法,它类似于模拟退火,但在该页中没有提到:
http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.basinhopping.html
vecaoik12#
看起来
scipy.optimize.minimize
的SLSQP并不一定需要渐变。参见这个开源项目,arch,代码,大约738-748行;它们使用SLSQP但不提供渐变。例如:此外,在
1.8.0
版本上,以下代码段也有效:这也说明了一个事实。
我还没有研究Scipy代码,但我猜如果您不提供解析梯度,它们将计算数值梯度。