如何迭代地实现牛顿法来估计根
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
用户输入一个数字,代码应根据该数字估计一定次数的迭代(由 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