banner
bladedragon

bladedragon

python实现牛顿法迭代法

最近看到牛顿迭代法和二分法,现在用 python 实现一下

拿开方举例,转载自Python 编程实现二分法和牛顿迭代法求平方根代码

一、使用二分法实现开方#

假设求根号 5,二分法的基本思路是

a:折半: 5/2=2.5
b:平方校验: 2.5*2.5=6.25>5,并且得到当前上限2.5
c:再次向下折半:2.5/2=1.25
d:平方校验:1.25*1.25=1.5625<5,得到当前下限1.25
e:再次折半:2.5-(2.5-1.25)/2=1.875
f:平方校验:1.875*1.875=3.515625<5,得到当前下限1.875

每次得到当前值和 5 进行比较,并且记下下下限和上限,依次迭代,逐渐逼近平方根:

  • 当结果校验超过原值,继续迭代
  • 当结构校验低于原值,获得另一半,继续迭代

python 代码

import math
from math import sqrt

def sqrt_binary(num):
    x = sqrt(num)
    y = num/2.0
    low = 0.0
    up = num*1.0
    count = 1
    while abs(y-x)>0.000001:
        print(count,y)
        count += 1
        if y*y>num :
            up = y
            y = low+(y-low)/2
        else:
            low = y
            y = up-(up-y)/2
    return y

二、使用牛顿迭代法实现开方#

从函数意义上理解:我们是要求函数 f (x)=x²,使 f (x)=num 的近似解,即 x²-num=0 的近似解。

从几何意义上理解:我们是要求抛物线 g (x)=x²-num 与 x 轴交点(g (x)=0)最接近的点。

我们假设 g (x0)=0,即 x0 是正解,那么我们要做的就是让近似解 x 不断逼近 x0,这是函数导数的定义:

image

可以由此得到

img

从几何图形上看,因为导数是切线,通过不断迭代,导数与 x 轴的交点会不断逼近 x0。

image

对于一般情况:

image

将 m=2 代入:

image

def sqrt_newton(num): 
  x=sqrt(num) 
  y=num/2.0 
  count=1 
  while abs(y-x)>0.00000001: 
    print count,y 
    count+=1 
    y=((y*1.0)+(1.0*num)/y)/2.0000 
  return y 
 
print(sqrt_newton(5)) 
print(sqrt(5)) 

三、利用牛顿迭代法实现立方#

def cube_newton(num): 
  x=num/3.0 
  y=0 
  count=1 
  while abs(x-y)>0.00000001: 
    print count,x 
    count+=1 
    y=x 
    x=(2.0/3.0)*x+(num*1.0)/(x*x*3.0) 
  return x 
 
print(cube_newton(27)) 
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。