ページ

2014年10月30日木曜日

計算方法を調べるよりもLaTeXで図を作成する方が面倒だった

前回は水平線までの距離を計算する方法を調べたが、せっかく調べたのだからLaTeXで綺麗に印刷したいと思うものである。しかし計算方法を調べるよりもLaTeXで図を作成する方がずっと大変だった。 単純な図だからわざわざInkscapeなどのツールで画像を作成するよりもpicture環境などで直接描画した方がよろしかろうと思ったのだ。しかしこれが大変だった。
適当な直径の円を書きたければ circle コマンドを使えばいいが、直線との接点の座標はどうやって決めたらよいのか、いちいち計算するのがとても面倒だったのだ。しかも図はピクセル単位というかドット単位でしか描画できないのに計算結果はきれいな整数にはなってくれない。見た目ではわからないからだいたいあっていればいいのだけど計算すること自体が手間である。
もっと頭のよい方法があるはずである。ようするに今回は円周上の点との接線をうまく描けばいいのだから円周上の点の座標が綺麗な整数値になってくれる r と x と y の組み合わせを見つければ良いのである。 そこで散々頭を悩ました結果、単に r2 = x2 + y2 としたときの r, x, y の全てが整数になる組み合わせをリストアップすれば済むことに気が付いた。
しかしこのような組み合わせを簡単に見つけるのは難しい、32 + 42 = 52 のような簡単な例ならすぐに思いつくが今回のように割と x と y の比が大きめの組み合わせはどうやって調べたらいいのだろうか。
それで中高生向けの数学の本などを読んでいたら面白いのをみつけた。
隣り合った2つの奇数、たとえば 5 と 7 をとります。このとき、次のような分数の式が成り立ちます。
1   1   12
- + - = --
5   7   35
この分母と分子に現れる 35 と 12 は
352 + 122 = 372
となっています。したがって、35 と 12 を直角にはさむ 2辺とする直角三角形をつくることができます。
同じようなことを、他の隣り合った奇数を使ってできるでしょうか。・・・
--志賀浩二「中高一貫数学コース 数学1」(p125)
なるほどこれは面白い。確かめてみよう。
確かめるために次の python プログラムを用意。
#!/usr/bin/python
from math import *
for i in range(1,101):
 if i % 2 != 0:
  j = i + 2
  a = 2*i+2
  b = i**2 + 2*i
  print " 1     1    {0:3d}".format(a)
  print "--- + --- = ---     {0}^2 + {1}^2 = {2}^2".format(a,b,sqrt(a**2 + b**2))
  print "{0:3d}   {1:3d}   {2:3d} ,".format(i,j,b)
  print
実行結果。
 1     1      4
--- + --- = ---     4^2 + 3^2 = 5.0^2
  1     3     3 ,

 1     1      8
--- + --- = ---     8^2 + 15^2 = 17.0^2
  3     5    15 ,

 1     1     12
--- + --- = ---     12^2 + 35^2 = 37.0^2
  5     7    35 ,

 1     1     16
--- + --- = ---     16^2 + 63^2 = 65.0^2
  7     9    63 ,

 1     1     20
--- + --- = ---     20^2 + 99^2 = 101.0^2
  9    11    99 ,

 1     1     24
--- + --- = ---     24^2 + 143^2 = 145.0^2
 11    13   143 ,

 1     1     28
--- + --- = ---     28^2 + 195^2 = 197.0^2
 13    15   195 ,

~~~中略~~~

 1     1    192
--- + --- = ---     192^2 + 9215^2 = 9217.0^2
 95    97   9215 ,

 1     1    196
--- + --- = ---     196^2 + 9603^2 = 9605.0^2
 97    99   9603 ,

 1     1    200
--- + --- = ---     200^2 + 9999^2 = 10001.0^2
 99   101   9999 ,
ということで、どうやら確からしいので確かめると、
奇数というのは任意の整数 n に対して 2n - 1 となる整数だが、2n - 1 の次の奇数は 2n + 1 である。
先程の式に当てはめると
   1         1       2n + 1 + 2n - 1        4n
------- + ------- = ----------------- = ----------
 2n -1     2n + 1   (2n - 1)*(2n + 1)    4n2 - 1
となり、これは
(4n)2 + (4n2 - 1)2 = 16n4 + 8n2 + 1
つまり
(4n)2 + (4n2 - 1)2 = (4n2 + 1)2
となるので右辺は必ず整数の2乗となるのがわかる。
しかし、次の python プログラムを実行して r2 = x2 + y2 において r , x , y が全て整数となる組み合わせ探すと更にたくさんあることがわかる。
#!/usr/bin/python
from math import *
for x in range(1, 101):
 for y in range(1, 1001):
  if x <= y and sqrt( x**2 + y**2 ) == round( sqrt( x**2 + y**2 ) , 0):
   print '{0}\t{1}\t{2:.0f}'.format(x , y , sqrt(x**2+y**2))
実行結果
3 4 5
5 12 13
6 8 10
7 24 25
8 15 17
9 12 15
9 40 41
10 24 26
11 60 61
12 16 20
12 35 37
13 84 85
14 48 50
15 20 25
15 36 39
15 112 113
~~~省略~~~
35 120 125
~~~省略~~~
99 132 165
99 168 195
99 440 451
99 540 549
100 105 145
100 240 260
100 495 505
100 621 629
こうやって見ると今回は半径130px前後の円を描きたいので 352 + 1202 = 1252 の組み合わせが手ごろな感じがする。 つまり半径125pxの円上の点の座標が x, y ともに整数値になるのは x = 35 , y = 120 または x = 120 , y = 35 の場合とわかる。 これを使えば円の接線の方程式を求める計算の手間が省略できてLaTeXのpicture環境で次のように描画すればよい。
% 35^2 + 120^2 = 125^2
% 135 + 35 =170 , 135 + 120 = 255
\begin{center}
\begin{picture}(270,280)
 \put(135,135){\circle{250}}
 \put(135,135){\line(7,24){35}}
 \put(170,255){\line(-24,7){35}}
 \put(135,135){\line(0,1){130.2}}
 \put(128,127){O}
 \put(128,262){h}
 \put(152,262){d}
 \put(128,197){r}
 \put(157,195){r}
\end{picture}
\end{center}
図の領域を幅270高さ280とすると、picture環境の原点は左下の角なので、ここから座標(135,135)を中心とした半径125の円を描くことにする。 接線と円の接点の座標は(135+35, 135+120)にすればよい。また接線の傾きは -35/120 = -7/24 である。 直角の記号を描きたいなら接線の傾きはわかっているので比較的簡単に求められる。
 %170-12,255+3.5 ,-7/-24, 3.5
 %170-3.5,255-12 ,-24/7, 12
 \put(158,258.5){\line(-7,-24){3.5}}
 \put(166.5,243){\line(-24,7){12}}
というのを追加すればよい。残念ながら全て整数にはならなかったが何も考えずに半径 r を100とか150とか高さ h を 10 とかにしてしまうと接点を計算した時にきれいな整数になることはまずないのだから、それに比べたらずいぶんマシである。

こうして作ったPDFファイルが次のものである。

https://drive.google.com/file/d/0B8A5Lx3UeWQcVHVuMXFqcVFWRHM/view?usp=sharing

これでもう水平線までの距離について悩まなくて済むばかりでなく似たような図を描画するときに円の接線と接点を決めるのが楽になる。

2014年10月28日火曜日

水平線までのおよその距離を計算する方法を調べてみた

大雑把に水平線までの距離を計算したくなったので考えたり調べたりしてみた。
それで計算してみたらだいたいこんな感じになった。


水平線までの距離を d [m] 、目の高さを h [m] として、
地球の半径は地球の円周の長さが 4.0 × 104 [km] だから
 2πr = 4.0 × 104 × 103
      r = 4.0 × 104 × 103 / 2π
        = 2.0 × 107 / π
なので r = 6.37×106 [m] 、地球の直径 2r = 1.27×107 [m] となる。
目の高さ h [m] での水平線までの距離 d [m] は
d2 + r2 = (r + h)2
d = sqrt{ (2r + h) h }
となる。目の高さ h は地球の半径 r に対してとても小さいので (2r + h) の h は実用上は無視できるほど小さくなるので d = sqrt{ 2rh } として問題なし。
数値を入れてみると次の通り。
d = sqrt{ 12.7 × h × 106 } = sqrt{ 12.7 × h } × 10[m]
もっと精度を上げると d = 3568 × sqrt{ h } [m] になるが、実際には大気の屈折でもっと遠くまで見えてしまうらしい。
だから d = sqrt{ 13 × h } × 10[m] で大雑把な計算としては十分なようだ。