我试着在scipy包中使用minimize函数,如下面的代码所示。当我使用jac option = approx_fprime时,迭代次数为0,优化不起作用。但是当我使用jac option = rosen_der时,它起作用了!第一个问题我检查了approx_fprime是ndarray,相同的罗森_der,并且值也是相同的。为什么优化不起作用??
jac option = approx_fprime
jac option = rosen_der
6ioyuze21#
您的函数fprime是x的函数,但近似于x0处的导数。因此,在每次迭代中,您都在计算初始猜测值x0处的梯度。您应该计算/近似于x处的导数:
fprime
x
x0
fprime = lambda x : approx_fprime(x, rosen, eps)
请注意,approx_fprime已经返回了一个np.ndarray,因此不需要额外的np.array调用。另外值得一提的是,如果不传递任何导数,也就是jac=None,那么你就不需要传递近似导数,因为minimize默认情况下会通过有限差分来近似它们。但是,minimize使用的是approx_derivative,而不是approx_fprime,因为它支持在变量边界上计算导数。
approx_fprime
jac=None
minimize
approx_derivative
1条答案
按热度按时间6ioyuze21#
您的函数
fprime
是x
的函数,但近似于x0
处的导数。因此,在每次迭代中,您都在计算初始猜测值x0
处的梯度。您应该计算/近似于x
处的导数:请注意,
approx_fprime
已经返回了一个np.ndarray,因此不需要额外的np.array调用。另外值得一提的是,如果不传递任何导数,也就是
jac=None
,那么你就不需要传递近似导数,因为minimize
默认情况下会通过有限差分来近似它们。但是,minimize
使用的是approx_derivative
,而不是approx_fprime,因为它支持在变量边界上计算导数。