我使用scipy.optimize.root
与hybr
方法(最好的一个?)求数值函数的根
我在每次迭代中打印残差delta d 117.960112417 delta d 117.960112417 delta d 117.960112417 delta d 117.960048733 delta d 117.960112427 delta d 117.960112121 delta d 1.46141491664 delta d 0.0322651167588 delta d 0.000363688881595 delta d 4.05494689256e-08
如何通过增加步长来加速根查找,特别是在第一次迭代之间?我不知道这个算法是如何工作的,但看起来很奇怪,前3个结果是一样的,3个下一个也是一样的。
阅读文档时,我尝试修改eps
因子,但没有成功
编辑:@sasha,这里有一个非常基本的函数来说明这个问题
def f(X1,X2):
print ' X1 , diff , norm ' , X1 , X2 - X1 , np.linalg.norm(X2 - X1)
return X2 - X1
Xa = np.array([1000,1000,1000,1000])
Xb = np.array([2000,2000,2000,2000])
SOL = scipy.optimize.root(f,Xa,(Xb,))
结果将如下所示,我们在开始时有3个相同的迭代,无论X的长度如何
X1 , diff , norm [1000 1000 1000 1000] [1000 1000 1000 1000] 2000.0
X1 , diff , norm [ 1000. 1000. 1000. 1000.] [ 1000. 1000. 1000. 1000.] 2000.0
X1 , diff , norm [ 1000. 1000. 1000. 1000.] [ 1000. 1000. 1000. 1000.] 2000.0
X1 , diff , norm [ 1000.0000149 1000. 1000. 1000. ] [ 999.9999851 1000. 1000. 1000. ] 1999.99999255
X1 , diff , norm [ 1000. 1000.0000149 1000. 1000. ] [ 1000. 999.9999851 1000. 1000. ] 1999.99999255
X1 , diff , norm [ 1000. 1000. 1000.0000149 1000. ] [ 1000. 1000. 999.9999851 1000. ] 1999.99999255
X1 , diff , norm [ 1000. 1000. 1000. 1000.0000149] [ 1000. 1000. 1000. 999.9999851] 1999.99999255
X1 , diff , norm [ 2000. 2000. 2000. 2000.] [-0. -0. -0. -0.] 4.36239133705e-09
X1 , diff , norm [ 2000. 2000. 2000. 2000.] [ 0. 0. 0. 0.] 0.0
1条答案
按热度按时间jhdbpxl91#
首先,我认为你混淆了迭代和函数调用,它们并不完全相同。因为您没有为求解器提供一个NetBeans函数,所以它必须估计NetBeans(或者可能只是它的一部分)本身。基本上,该函数是导数的多维等价物。它指示当您稍微改变输入时目标函数的输出如何变化。
大多数数值求解器通过在非常接近当前猜测的某个点处计算目标函数并检查输出变化多少来数值地估计雅可比。我猜想,您看到的前几个调用是评估目标函数,然后估计目标函数。第一次调用时,您会看到任何实际的变化,这发生在它估计了一个bean,然后使用它在根上计算下一个猜测之后。
如果您希望自己检查这一点,请尝试为求解器提供一个回调函数。它将在每次迭代中调用此函数,您可以查看它在每次迭代中的位置。我想你会发现它只在几次迭代中收敛,但是每次迭代调用函数多次。
当然,您可以通过为求解器提供一个可调用的Cubbean函数来在某个点上计算Cubbean,从而避免所有这些工作。如果您这样做,它将不需要进行多次调用来估计它。
文档中有关于如何添加回调和提供一个回调bean函数的信息。如果需要的话,我可以举一个例子。
http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.root.html