√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
そう大差ないですが、真値に近いところから出発すればやはりいくらかは速いようです。
★素朴な考え方、というのが結局、実に「堅牢」な手法だったことが判明しましたね。
平方数だって問題にしないし、こうやって汎用性の高い関数に書き換えることもできたし。
さぁ、そろそろ平方根の話から卒業かな、と思っています。
ただ、「ニュートン法」というところから発展する話題があるものですから、現在準備中です。
どういう風に話を展開するのか、見えてきていません。
「理科おじさん」カテゴリの記事
- 化学の日(2022.10.26)
- 秒速→時速(2022.09.01)
- 風速75メートル(2022.08.31)
- 「ウクライナで生まれた科学者たち」(2022.05.31)
- 反射光(2022.05.09)
コメント