在没有明确定义梯度的情况下优化Scipy中的函数

omtl5h9j  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(207)

我目前正在尝试使用scipy优化一个函数。我对变量有一些约束,从这个链接可以看到:http://docs.scipy.org/doc/scipy-0.14.0/reference/tutorial/optimize.html,看起来SLSQP正是我想要的。在他们的例子中,他们有一个定义明确的公式来表示输入的结果,从中可以找到梯度。我有一个计算量非常大的函数来计算电磁场如何从金属壁上反弹,这绝不能用封闭的形式来表示(如果您感兴趣的话,我将使用MEEP FDTD Python模拟)。scipy中是否内置了一个等效的函数,可以为您找到函数的梯度,然后进行优化?或者,等效地,scipy中是否内置了一个函数(任何基本的python库都可以),它可以为我找到一个函数的梯度,然后我可以将其传递到这个优化程序中?任何建议都将非常感谢。

plicqrtu

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

vecaoik1

vecaoik12#

看起来scipy.optimize.minimize的SLSQP并不一定需要渐变。参见这个开源项目,arch,代码,大约738-748行;它们使用SLSQP但不提供渐变。例如:

opt = minimize(
                func,
                sv,
                args=args,
                method="SLSQP",
                bounds=bounds,
                constraints=ineq_constraints,
                tol=tol,
                callback=_callback,
                options=options,
            )

此外,在1.8.0版本上,以下代码段也有效:

import scipy.optimize
res = scipy.optimize.minimize(
        lambda x: x[0]**2, [3.],
        method='SLSQP', bounds=[(1., None)])
print(res.success)  #: True

这也说明了一个事实。
我还没有研究Scipy代码,但我猜如果您不提供解析梯度,它们将计算数值梯度。

相关问题