2020年5月16日土曜日

Python: 平方根を求める

Pythonの勉強をしている。本来、私はプログラミングをやったことはあるので、勉強していない人よりはわかりが速いはずと思っている。

しかし、よる年波には勝てず、記憶力が衰えてきており、Pythonで使用されている関数とか、いろいろのことが覚えられない。

そこで、簡単なプログラムを作りながら、Pythonを覚えていこうと思っている。まずは、平方根を求めるプログラム。

-------------------------------------
# X の平方根を求める
x = 3
#
rootnew = x
#
for i in range(10):
    root1 = rootnew
    root2 = x/root1
    rootnew = (root1 + root2)/2
    print(root1, rootnew, root2)
---------------------------------------------

平方根を求める方法では、学生時代にニュートン法という方法で平方根を求めた。詳しい説明はここでは省く。「ニュートン法」で検索するといくつかの説明のサイトが出てくるので見てもらいたい。

今回利用したのは京都大学の学生用Python教育の資料である。
「プログラミング演習 Python 2019」で検索するとでてくる。喜多一先生が作らたものである。私は資料の最初の部分はよく知っていることなので、読み飛ばして、早速プログラムが書かれているところを読むことにした。コンピュータの理解が乏しい人は読んでおくと良い。

プログラムを入力して、走らせると以下のような結果が出てくる。
xの値を色々変えてみると、それぞれの平方根が求まる。

======================= RESTART: C:\Work\kkex2.py ====================
3 2.0 1.0
2.0 1.75 1.5
1.75 1.7321428571428572 1.7142857142857142
1.7321428571428572 1.7320508100147274 1.7319587628865978
1.7320508100147274 1.7320508075688772 1.7320508051230272
1.7320508075688772 1.7320508075688772 1.7320508075688774
1.7320508075688772 1.7320508075688772 1.7320508075688774
1.7320508075688772 1.7320508075688772 1.7320508075688774
1.7320508075688772 1.7320508075688772 1.7320508075688774
1.7320508075688772 1.7320508075688772 1.7320508075688774

上のリストから見て、4回ぐらいループさせると、1.7320508という値が表示される。手書きで計算すると大変なところだが、Pythonを使えば瞬時に解が出てくる。

もちろん、Pythonは
 3**(1/2) 
ですぐに 「3」 の平方根を計算してくれるので、いちいちPythonでプログラムを作る必要はないのだが。

>>> 3**(1/2)
1.7320508075688772

私はプログラミングが面白いのは、結果を表示するための理屈を理解して、それをプログラムするところだと考えている。だから、どうして平方根が計算されるのかというのを理解するのも一つのプログラミング学習だ。
以下、それぞれの行に説明を入れてみた。

-------------------------------------
# X の平方根を求める        
x = 3              まず、xを3にする。
#
rootnew = x           rootnew を xと同じ値にする。
#
for i in range(10):        以下の4行の操作を10回繰り返す。
    root1 = rootnew root1 を rootnewと同じ値にする。
    root2 = x/root1 x を root1 で割って其の結果をroot2 に入れる
    rootnew = (root1 + root2)/2  rootnew は root1 と root2の平均値にする
    print(root1, rootnew, root2)  root1、rootnew、 root2 を印刷する
---------------------------------------------

リストの下の4行の操作を繰り返していくと、root1 と root2 の間隔がだんだん狭まってくる。その感覚の中に  rootnew はあるので、rootnew の値も正しい 3 の平方根の値に近づいてくる。 もちろん、root1 も  root2 も平方根の値に近づく。
つまり、root1 と root2 の値も、rootnew の値に近づいてくる。

root2 = x/root1

の式を見れば良い。限りなく root1 と root2 が近づいてくるので、
x = rootnew**2
という結果に rootnew の値が近づいてくるのだ。

3の平方根は小数点以下無限に続く無理数なので、永遠に算出することはできないのだが、実用上は意味のある小数点以下の数字を得ることが出来る。

面白いことに x = 4 の場合でも、root1, rootnew、root2 の値はすぐに 2.0 にならず、数回の繰り返しで値が固定する。

==================== RESTART: C:\Work\kkex2.py ======================
4 2.5 1.0
2.5 2.05 1.6
2.05 2.000609756097561 1.9512195121951221
2.000609756097561 2.0000000929222947 1.9993904297470284
2.0000000929222947 2.000000000000002 1.9999999070777095
2.000000000000002 2.0 1.9999999999999978
2.0 2.0 2.0
2.0 2.0 2.0
2.0 2.0 2.0
2.0 2.0 2.0
>>>

0 件のコメント:

コメントを投稿

持ち帰りOKの子授け地蔵、3年ぶりに祠へ

 丹波新聞によると、持ち帰り自由の子授け地蔵が3年ぶりに戻ってきたそうです。 (https://tanba.jp/) このお地蔵様は「子授地蔵」と呼ばれ、子授けの御利益があるとされています。 持ち帰って願いが叶えば、元の場所に戻すという風習があります。 2021年4月頃、このお地...