【Python算法】牛顿迭代法

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

 

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

  1. x0和x之间的误差非常小
  2. f(x)的值趋近与0

# 以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求出来导函数的值

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值