【Python算法】牛顿迭代法

利用直线趋近的这么一个思想,不断交换x、x0

 

终止条件有两种判断方式:

  1. x0和x之间的误差非常小
  2. f(x)的值趋近与0【Python算法】牛顿迭代法_第1张图片

# 以f = x**3 + 3*x**2 + 3*x + 2
# df = 3**2 + 6*x + 3

def f(x):
    f = x ** 3 + 3 * x ** 2 + 3 * x + 2
    return f

def df(x):
    df = 3 * x ** 2 + 6 * x + 3
    return df

def newton(x):
    global i
    x0 = x
    print('第{}次迭代:'.format(i), end='')
    print('f(x) =', f(x0), end='  ')
    print('df(x) =', df(x0))
    x = x0 - f(x0)/df(x0)
    print('x =', x, 'x0 =', x0, abs(x0-x))
    if abs(x0-x) < 1e-6:
        return x
    else:
        i += 1
        return newton(x)   # 这里没有return的话,函数返回None

i = 1
x0 = -3
x = newton(x0)
print('该方程的解为:', x)

上面的代码需要自己进行求导,比较麻烦,下面给出进阶版

def f(fk, x):
    fp = eval(fk)
    return fp

def df(fk, x):
    dfp = (f(fk, x + 0.0001)-f(fk, x))/0.0001
    return dfp

def newton(x):
    global i
    x0 = x
    print('第{}次迭代:'.format(i), end='')
    print('f(x) =', f(fk, x0), end='  ')
    print('df(x )=', df(fk, x0))
    x = x0 - f(fk, x0)/df(fk, x0)
    print('x =', x, 'x0 =', x0, abs(x0-x))
    if abs(x0-x) < 1e-6:
        return x
    else:
        i += 1
        return newton(x)   # 这里没有return的话,函数返回None

i = 1
x0 = -3
fk = input('请输入函数表达式:(用x作为自变量)\\n')
x = newton(x0)
print('该方程的解为:', x)

这里对直接利用(f(x+△x)-f(x))/△x求出来导函数的值

你可能感兴趣的:(笔记,python,线性代数)