gpt4 book ai didi

python - 牛顿法 : order of statements in loop

转载 作者:行者123 更新时间:2023-11-28 17:27:49 25 4
gpt4 key购买 nike

我正在尝试在 Python 中实现牛顿法以获得乐趣,但我在概念上理解检查的位置时遇到了问题。

重温牛顿法作为一种通过微分重复线性逼近来逼近根的方法:

Newton's Method

我有以下代码:

# x_1 = x_0 - (f(x_0)/f'(x_0))
# x_n+1 - x_n = precision

def newton_method(f, f_p, prec=0.01):
x=1
x_p=1
tmp=0

while(True):
tmp = x
x = x_p - (f(x_p)/float(f_p(x_p)))
if (abs(x-x_p) < prec):
break;
x_p = tmp

return x

这是有效的,但是如果我将循环中的 if 语句移动到 x_p = tmp 行之后,该函数将停止按预期工作。像这样:

# x_1 = x_0 - (f(x_0)/f'(x_0))
# x_n+1 - x_n = precision

def newton_method(f, f_p, prec=0.01):
x=1
x_p=1
tmp=0

while(True):
tmp = x
x = x_p - (f(x_p)/float(f_p(x_p)))
x_p = tmp
if (abs(x-x_p) < prec):
break;

return x

澄清一下,函数 v1(第一段代码)按预期工作,函数 v2(第二段)没有。

为什么会这样?
原始版本本质上不是检查当前的 x 与来自 2 个分配的 x ,而不是紧接在前的 x 吗?

这是我使用的测试代码:

def f(x):
return x*x - 5

def f_p(x):
return 2*x

newton_method(f,f_p)

编辑

我最终使用了这个版本的代码,它放弃了 tmp 变量并且在概念上对我来说更加清晰:

# x_1 = x_0 - (f(x_0)/f'(x_0))
# x_n+1 - x_n = precision

def newton_method(f, f_p, prec=0.01):
x=1
x_p=1
tmp=0

while(True):
x = x_p - (f(x_p)/float(f_p(x_p)))
if (abs(x-x_p) < prec):
break;
x_p = x

return x

最佳答案

x[i]是要在迭代中计算的新值。

版本 1 中发生了什么:

声明x = x_p - (f(x_p)/float(f_p(x_p)))翻译成:

x[i] = x[i-2] - f(x[i-2])/f'(x[i-2]) - 1

但是根据实际的数学公式,应该是这样的:

x[i] = x[i-1] - f(x[i-1])/f'(x[i-1])

同样,x[i-1] = x[i-2] - f(x[i-2])/f'(x[i-2]) - 2

比较 12,我们可以看到 x[i] 1 实际上是 x[i-1]根据数学公式。

这里要注意的要点是xx_p总是相隔一次迭代。即 xx_p 的实际继承者,与仅查看代码看起来不同。

因此,它按预期正常工作。

版本 2 中发生了什么:

就像上面的例子一样,同样的事情发生在声明x = x_p - (f(x_p)/float(f_p(x_p))) .
但是当我们到达 if (abs(x-x_p) < prec) 时, x_p已将其值更改为 temp = x = <强> x[i-1] .

但正如在版本 1 的情况下推导出的,x也是x[i-1]而不是 x[i] .

所以,abs(x - x_p)转换为 abs(x[i-1] - x[i-1]) ,结果为 0,因此终止迭代。

这里要注意的要点是xx_p实际上在数值上是相同的值,这总是导致算法本身仅在 1 次迭代后终止。

关于python - 牛顿法 : order of statements in loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37262173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com