【发布时间】:2016-09-12 17:31:30
【问题描述】:
我正在尝试在 Python 中实现牛顿的有趣方法,但我在概念上理解检查的位置时遇到了问题。
重温牛顿方法,通过微分重复线性逼近来逼近根:
我有以下代码:
# 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
【问题讨论】:
-
the function ceases to work as expected.: 究竟如何? -
例如,当试图将解近似为 x^2 - 5 时,而不是用前者得到 2.236-ish,而用后者得到 3.0。
标签: python loops debugging while-loop newtons-method