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)) 
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。