如何迭代地实现牛顿法来估计根

How to implement Newton's method iteratively to estimate roots

用户输入一个数字,代码应根据该数字估计一定次数的迭代(由 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 方程,我不确定还能尝试什么。

问题似乎是您在每个循环开始时将 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 以提高可读性。

设 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)

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

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