1

我使用scipy.optimize.roothybr方法(最好的方法?)来查找数值函数的根

我在每次迭代时打印残差

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  
4

1 回答 1

5

首先,我认为您将迭代与对函数的调用混淆了,这并不完全相同。因为您没有为求解器提供 Jacobian 函数,所以它必须估计 Jacobean(或者可能只是它的一部分)本身。Jacobbean 基本上是导数的多维等价物。它指示目标函数的输出如何随着您稍微改变输入而变化。

大多数数值求解器通过在非常接近当前猜测的某个点评估目标函数并检查输出变化量来以数值方式估计 Jacobbeans。我的猜测是,您看到的前几个调用是评估目标函数,然后估计 Jacobian。您看到任何实际变化的第一次调用发生在它估计 Jacobbean 之后,然后使用它来计算根的下一个猜测。

如果您想自己检查,请尝试为求解器提供回调函数。它将在每次迭代时调用此函数,您可以查看它在每次迭代时的位置。我想你会发现它只在几次迭代中收敛,但每次迭代都会多次调用该函数。

当然,您可以通过为求解器提供一个 Jacobian 函数来避免所有这些工作,它可以调用它来评估某个点的 Jacobian。如果您这样做,它将不需要进行多次调用来估计它。

该文档包含有关如何添加回调和提供 Jacobbean 函数的信息。如果需要,我可以添加一个示例。

http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.root.html

于 2016-06-06T16:41:54.167 回答