« 梅ですよね | トップページ | ヒメリュウキンカ »

2015年3月12日 (木)

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

★プログラム作りというのは妙なもので、頭の中で「自己運動」が起こってしまって、時々「あそこの論理はこうした方がいい」などという着想がぴょんと出てきます。{ですから、プログラム作りは日中に限る。夜にやると、頭の中の自己運動が激しくって睡眠の質が劣化してしまいます。}
何を言い出したかと言いますと。
整数平方根のプログラムを関数化するというアイディアが、頭の中に残って自己運動してしまったのです。

ふと、
http://yamada-kuebiko.cocolog-nifty.com/blog/2015/01/post-857a.html
2015年1月22日 (木)「√2 の話:その12:√2の求め方。★Simpleな考え方:その1」
ここでやった方法が、非常に良いぞ、と頭の中に浮いてきた。

●出発点と歩幅をまず決めます。
出発点=0 歩幅=1{0より大きな有理数に対応したいので、出発点は「0」としました。}
出発点から歩幅分大きくして自乗してみます。
2より小さければ、同じ歩幅で進みます。
2より大きくなったら、一歩戻って、歩幅を1/10にしてまた進みます。
・・・(以下同文)

こう考えるのでした。
ここで「歩幅」=1として進んでいって、越えたところで一歩戻ってその値を報告すれば、整数平方根じゃないですか、これって。
区間幅1の間に真値を挟むことができる。
さらに、やりたければ、例えば「歩幅」=0.1として実行すれば、区間幅0.1の間に真値を挟むこともできる。
つまり、任意の幅の区間で真値を挟むことができる。
そうなんだ!


↓素朴な方法を関数化してみました
十進BASICではグローバル変数(大域変数)が使えませんので、プログラム本体側から歩幅の最小値を与えて呼び出すようにすれば、応用範囲が広いかな。
!********************
DECLARE EXTERNAL FUNCTION f

LET d = 1
FOR i = 1 TO 10 
   LET a =f(i,d)
   PRINT i;
   PRINT a;
   PRINT SQR(i);
   PRINT a + d
NEXT i
END
!********************
EXTERNAL FUNCTION f(n, d)
LET stp =1                    !最初の歩幅は1
LET a = 0                     !出発は0から
DO
   LET a = a + stp            !一歩進む
   IF a^2 > n THEN            !nより大きかったら
      LET a = a - stp         !一歩戻って
      LET stp = stp/10        !歩幅を1/10にして
   END IF
LOOP WHILE(stp >= d)          !精度の限界に達していなければDOから繰り返す
LET f = a
END FUNCTION
!********************


d = 1 で実行 
  1   1  1                            2
  2   1  1.4142135623731    2
  3   1  1.73205080756888  2
  4   2  2                            3
  5   2  2.23606797749979  3
  6   2  2.44948974278318  3
  7   2  2.64575131106459  3
  8   2  2.82842712474619  3
  9   3  3                           4
10   3  3.16227766016838  4

d = 0.1 で実行
  1  1    1                           1.1
  2  1.4  1.4142135623731   1.5
  3  1.7  1.73205080756888  1.8
  4  2    2                            2.1
  5  2.2  2.23606797749979  2.3
  6  2.4  2.44948974278318  2.5
  7  2.6  2.64575131106459  2.7
  8  2.8  2.82842712474619  2.9
  9  3    3                            3.1
10  3.1  3.16227766016838  3.2

◎ちゃんと意図通りに挟んでいます。
ただ、平方数のところは要注意ですね。二分法とかをやるときは、ここをうまく回避しないとまずいでしょう。
ともあれ任意の区間幅で真値を挟む関数ができました。
あとはこれを使ってニュートン法をやってみることにしましょう。

« 梅ですよね | トップページ | ヒメリュウキンカ »

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

コメント

コメントを書く

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

« 梅ですよね | トップページ | ヒメリュウキンカ »

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 暴想
無料ブログはココログ