`scipy.optimize.root`更快的根查找

2024-09-28 20:52:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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个下一个结果也完全相同。在

Reading the doc,我试图修改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的长度是多少

^{pr2}$

Tags: 方法函数normnprootscipyarray数值
1条回答
网友
1楼 · 发布于 2024-09-28 20:52:25

首先,我认为你在混淆迭代和函数调用,它们并不完全相同。因为您没有为解算器提供雅可比函数,所以它必须估计雅可比函数(或者它的一部分)本身。雅可比基本上是导数的多维等价物。它指示目标函数的输出如何随着输入的细微变化而变化。在

大多数数值解算器通过在与当前猜测非常接近的某个点评估目标函数,并检查输出变化量,从而对雅可比进行数值估计。我的猜测是,您看到的前几个调用是对目标函数求值,然后估计Jacobean。在第一个调用中,您看到任何实际更改发生在它估计了Jacobean之后,然后使用它计算下一个对根的猜测。在

如果你想自己检查一下,试着给解算器一个回调函数。它将在每次迭代中调用此函数,您可以查看它在每次迭代中的位置。我想您会发现它只在几个迭代中收敛,但是每次迭代都会调用函数多次。在

当然,您可以通过向解算器提供一个雅可比函数来避免所有这些工作,它可以调用该函数来计算某个点的雅可比函数。如果您这样做,它将不需要多次调用来估计它。在

该文档提供了有关如何添加回调和提供Jacobean函数的信息。如果需要,我可以加一个例子。在

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

相关问题 更多 >