【问题标题】:How to implement Newton's method iteratively to estimate roots如何迭代地实现牛顿法来估计根
【发布时间】:2020-01-17 06:13:58
【问题描述】:

用户输入一个数字,代码应估计该数字的立方根,进行一定次数的迭代(由 N 定义)或直到根估计的变化变得足够小(由您自行决定)。

从初始近似值 (x_initial) 为 1 开始,并通过公式运行它以获得 X 的下一次迭代。似乎得到了合理的答案,但除此之外似乎无法理解该怎么做。

print('Enter number for cubed root:')
y=int(input())
x_initial=1
n=0

while n <= 50:
    x_new=1/3*(2*(x_initial) + y/(x_initial**2))
    print(x_new)
    n=n+1

    x_new=1/3*(2*(x_new) + y/(x_new**2))
    print(x_new)
    n=n+1

估计只是在两个不同的值之间交替。每次迭代后都没有定义一个新的 X 方程,我不确定还能尝试什么。

【问题讨论】:

  • 让它为迭代次数工作,但是,在迭代次数之后,估计保持不变(基本上解决了)。当迭代差异为 0(或非常小)时,我将如何编写中断代码?

标签: python newtons-method


【解决方案1】:

问题似乎是您在每个循环开始时将 x_new 重置为基于 x_initial。我会将两者都折叠成一个变量 x:

y = int(input('Enter number for cubed root:'))
x = 1
n = 50

for _ in range(n):
    x = 1/3 * (2*x + y/(x**2))
    print(x)

我还在一些地方使您的代码更加 Pythonic,以提高可读性。

【讨论】:

  • 我认为必须设置一个初始 x 值,否则会返回 ZeroDivisionError?
  • 这似乎可以解决问题,感谢您的帮助!比我最终尝试做的要简单得多:) 'y = int(input('输入立方根的数字:')) x = 1 N = 0 while N
【解决方案2】:

令 f 是表示所讨论方程的符号函数,dF 是表示 f 的导数的符号方程,x0 起始值,epsilon(当你足够接近根时存在函数的结束条件)和 max_iter (您要运行多少次迭代)。这比您的方法更好,因为只要您编写适当的导数,它就适用于任何根。

def newtons_method(f,Df,x0,epsilon,max_iter):
    xn = x0
    for n in range(0,max_iter):
        fxn = f(xn)
        if abs(fxn) < epsilon:
            print('Found solution after',n,'iterations.')
            return xn
        Dfxn = Df(xn)
        if Dfxn == 0:
            print('Zero derivative. No solution found.')
            return None
        xn = xn - fxn/Dfxn
    print('Exceeded maximum iterations. No solution found.')
    return None

示例用法:

f = lambda x: x**4 - x**3 - 1
Df = lambda x: 4*x**3 - 3*x
approx = newtons_method(f,Df,1,1e-10,10)
print(approx)

【讨论】:

    【解决方案3】:

    不知道为什么它在你和其他人的情况下如此复杂,但我对此进行了测试,它的工作原理很简单:

    def cubenewton(num, ini=1, iters=50):
        for i in range(iters):
            ini = ini - (ini**3 - num)/float(3*ini**2)
        return ini
    
    >>> cubenewton(30) # I tried values from -100 to 100 and all works fine. works for 0 as well.
    3.107232505953859
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2015-12-19
      • 2019-06-27
      • 2015-04-26
      • 1970-01-01
      相关资源
      最近更新 更多