« ホトケノザ | トップページ | 温室の中で »

2015年3月13日 (金)

√2 の話:その33 真値を挟む範囲について:4

★前の記事で作った関数を、改めて「approx_sqrt」と名付けて、ニュートン法に組み込んでみました。
!********************
! ニュートン法によって平方根を求める
DECLARE EXTERNAL FUNCTION f
DECLARE EXTERNAL FUNCTION g
DECLARE EXTERNAL FUNCTION approx_sqrt
LET d = 1
!********************
INPUT PROMPT "n =" :n
IF n >1 THEN
   LET x = approx_sqrt(n, d) + d
   PRINT x
ELSE
   LET x = 1
END IF

FOR i = 1 TO 10
   LET x1 = x - (f(x, n)/g(x))
   PRINT i;
   PRINT x1
   PRINT x1*x1
   LET x = x1
NEXT i
END
!********************
EXTERNAL FUNCTION f(x, n)
LET f = x*x - n
END FUNCTION
!********************
EXTERNAL FUNCTION g(x)
LET g = 2*x
END FUNCTION
!********************
EXTERNAL FUNCTION approx_sqrt(n, d)
LET stp =1
LET a = 0
DO
   LET a = a + stp
   IF a^2 > n THEN
      LET a = a - stp
      LET stp = stp/10
   END IF
LOOP WHILE(stp >= d)
LET approx_sqrt = a
END FUNCTION
!********************
d = 1で実行すると
n =1000
32
1  31.625
     1000.140625
2  31.6227766798419
     1000.00000494315
3  31.6227766016838
     1000
4  31.6227766016838
     1000

d = 0.1で実行すると
n =1000
31.7
1  31.6228706624606
     1000.00594893471
2  31.6227766018237
     1000.00000000885
3  31.6227766016838
     1000
そう大差ないですが、真値に近いところから出発すればやはりいくらかは速いようです。

★素朴な考え方、というのが結局、実に「堅牢」な手法だったことが判明しましたね。
平方数だって問題にしないし、こうやって汎用性の高い関数に書き換えることもできたし。

さぁ、そろそろ平方根の話から卒業かな、と思っています。
ただ、「ニュートン法」というところから発展する話題があるものですから、現在準備中です。
どういう風に話を展開するのか、見えてきていません。

« ホトケノザ | トップページ | 温室の中で »

理科おじさん」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« ホトケノザ | トップページ | 温室の中で »

2017年11月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
サイト内検索
ココログ最強検索 by 暴想
無料ブログはココログ