使用scipy的Newton-CG最小化函数中的奇怪行为:每次调用目标函数计算时,我都会打印出该值。我发现通常情况下,最小化器找到的值低于最终报告的值。示例输出如下所示。 “Iter”是来自最小化函数的迭代次数,而“call”是最小化器称为目标函数“J”的计算的时间。 “dJ”是从前一次通话中改变了多少次。 “f”是一个包含所有计算的对象类,包括回调函数'iternum':
res=scipy.optimize.minimize(f.J,f.z,args=(F),tol=1.e-4,method='Newton-CG', \
jac=f.Jacobian,hessp=f.Hessian, callback=f.iternum)
Iter 1 , call 30 J=3.73e+09 dJ=3.58e+09
Iter 1 , call 31 J=1.78e+09 dJ=-1.95e+09
Iter 1 , call 32 J=5.23e+08 dJ=-1.26e+09
Iter 1 , call 33 J=1.76e+08 dJ=-3.47e+08
Iter 1 , call 34 J=1.33e+08 dJ=-4.29e+07
Iter 1 , call 35 J=1.44e+08 dJ=1.14e+07
Iter 2 , call 36 J=1.42e+08 dJ=-1.85e+06
Iter 2 , call 37 J=1.42e+08 dJ=5.19e+04
res.fun = 1.42e+08
但是,请注意,最低J值实际上是1.33e + 08,因此应该返回那些参数和目标函数值。还有其他人经历过吗?想法?