【问题标题】:How to loop over a condition until the values have converged? (Newton Raphson Method)如何循环条件直到值收敛? (牛顿拉夫森方法)
【发布时间】:2021-12-07 13:29:39
【问题描述】:

对于 Newton-Raphson 方法,我被要求编写一个循环来调用该函数,直到它收敛,以便 x(n) 和 x(n+1) 的值相差小于一个小数 e =10^-8,但是,我不太清楚如何创建这个循环。

这是我目前的代码

def newton_step(f, fp, x0):
     return x0-(f(x0)/fp(x0))

import numpy as np
def f(x):
    return x**3 + x**2 +2 

def fp(x): 
    return 3*x**2 + 2*x

x = newton_step(f, fp, (x0))
count = 0 #to count the number of iterations required to satisfy the condition
while (x0 - x) <= 10**-8:
    x0 = newton_step(f, fp, (x0))
    count += 1
    print(x0, x)

【问题讨论】:

  • 您遇到的具体问题是什么?
  • 我收到“NameError: name 'x0' is not defined”
  • 您正在使用一个函数来使 2 个值彼此接近,对吗?您必须提供这 2 个起始值 (x, x0)
  • 非常感谢!

标签: python python-3.x loops newtons-method


【解决方案1】:

看起来你的比较运算符是倒退的,试试:

while (x0 - x) &gt; 10**-8:

这样它就会循环,继续 while 差异是 greater than 10^-8 (一旦它小于该值就退出循环)

此外,您还需要确保您的代码在循环之前为 x0 设置了一个初始值(以便进行比较)

【讨论】:

  • 我对 x0 是什么感到困惑,所以它只是任何随机值或这个表达式的解?
  • 非常感谢!
【解决方案2】:

我可以看到您的代码至少有 2 个问题 -

  1. 你没有更新x
  2. 如果x0&lt;x 则循环将结束,但它们可以在更多10^-8 上有所不同
  3. 错误的条件n

总结一下,我会改变循环 -

while abs(x0-x) >= 10**-8:
    new_x = newton_step(f, fp, (x0))
    x = x0
    x0 = new_x
    count +=1
    print(x0, x)

【讨论】:

  • 我不断收到“NameError: name 'x0' is not defined”
  • 我认为它是在代码前面定义的
  • 我正在努力解决的问题是他们是否要求我提供一个有限值/这个方程的实际根,或者他们是否要求我再次调用该函数使得 x0 = ( f, fp, (x0))
  • 非常感谢!
【解决方案3】:

只要差异较小,您的 while 循环就会运行,但只要差异较大,它就应该运行。将while (x0 - x) &lt;= 10**-8 更改为while (x0 - x) &gt;= 10**-8

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2018-07-29
相关资源
最近更新 更多