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当方法不收敛。我不确定这是一个有意的决定,但无论如何这是一个很好的约定,因为它允许用户知道该方法没有收敛。一个更健壮的方法是抛出异常,也许在迭代停止时加上猜测和收敛率。