JUPYTER 牛顿法
JUPYTER Newtons Method
使用 MATLAB,我尝试使用牛顿法求解方程,但继续打印结果“None”。不知道哪里出错了,不想乱改公式
def newt(p):
maxIt = 1000
tol = 10^(-5)
for i in range(maxIt):
fp = 2*p**3 + p**2 - p + 1 #double * for exponent
fprimep = 6*p**2 + 2*p - 1 #f'p
p_new = p - fp/fprimep
if abs (p - p_new) < tol:
return p
p = p_new
#initial values
p0 = -1.2
p = newt(p0)
print(p)
您的代码中的错误是由于从 Matlab 进行了部分转换。你定义了tol = 10^(-5)
,但这不是Python中的求幂,而是按位异或。更正它,你会得到正确的结果:
def newt(p):
maxIt = 1000
tol = 1e-5 # Error was here
for i in range(maxIt):
fp = 2*p**3 + p**2 - p + 1 #double * for exponent
fprimep = 6*p**2 + 2*p - 1 #f'p
p_new = p - fp/fprimep
if abs (p - p_new) < tol:
return p
p = p_new
#initial values
p0 = -1.2
p = newt(p0)
print(p)
# -1.23375
至于return值,你的函数returns None
当方法不收敛。我不确定这是一个有意的决定,但无论如何这是一个很好的约定,因为它允许用户知道该方法没有收敛。一个更健壮的方法是抛出异常,也许在迭代停止时加上猜测和收敛率。
使用 MATLAB,我尝试使用牛顿法求解方程,但继续打印结果“None”。不知道哪里出错了,不想乱改公式
def newt(p):
maxIt = 1000
tol = 10^(-5)
for i in range(maxIt):
fp = 2*p**3 + p**2 - p + 1 #double * for exponent
fprimep = 6*p**2 + 2*p - 1 #f'p
p_new = p - fp/fprimep
if abs (p - p_new) < tol:
return p
p = p_new
#initial values
p0 = -1.2
p = newt(p0)
print(p)
您的代码中的错误是由于从 Matlab 进行了部分转换。你定义了tol = 10^(-5)
,但这不是Python中的求幂,而是按位异或。更正它,你会得到正确的结果:
def newt(p):
maxIt = 1000
tol = 1e-5 # Error was here
for i in range(maxIt):
fp = 2*p**3 + p**2 - p + 1 #double * for exponent
fprimep = 6*p**2 + 2*p - 1 #f'p
p_new = p - fp/fprimep
if abs (p - p_new) < tol:
return p
p = p_new
#initial values
p0 = -1.2
p = newt(p0)
print(p)
# -1.23375
至于return值,你的函数returns None
当方法不收敛。我不确定这是一个有意的决定,但无论如何这是一个很好的约定,因为它允许用户知道该方法没有收敛。一个更健壮的方法是抛出异常,也许在迭代停止时加上猜测和收敛率。