午後のひとときに、数学の問題をプログラミングで解いてみる。
図のように円周上の1点から2直線を引くことで3等分する。
θをプログラミングで求めよ。
シンキングタ~イム
プログラミングで求めよとのことですが、流石に数学の知識を必要とするので、まずは数学的に考察してみる。
円の中心から、各交点とを直線で結ぶ。
円周角と中心角の関係より2θ、
残りの2角は等しくπ-θ、
と求まる。
半径を1とすると、円の面積はπである。
3等分ということで、それぞれの面積はπ/3。
π-θを頂角とする斜辺1の二等辺三角形の面積は、二辺夾角からa・b・sin(C)/2を使って、
sin(π-θ)/2=sin(θ)/2
となる。
続いて、2πの角で出来る半径1の扇型の面積は、
(2θ/2π)✕π=θ
となる。
よって、
sin(θ)/2+θ=π/3
を満たすθが求まればよいのだが…
これを代数的ないし幾何的に求めることは厳しい。
ということで、解析的に求めることを考える。
どうやって求めるかというと、二分法だろう。
図もJavascriptでCanvasに描いているので、Javascriptで書いてみる。
θをthetaとか面倒なので、tとして求めてみる。
var t, t_max, t_min, loop;
loop = 100;
t_max = Math.PI/2;
t_min = 0;
while ( loop ) {
t = (t_max+t_min)/2;
if ( Math.sin(t)+t < Math.PI/3 ) {
t_min = t;
} else {
t_max = t;
}
loop--;
}
まぁ、こんな感じでtを求めることが出来る。
t_maxの初期値をMath.PI/2、つまりπ/2=90˚としているが、πからスタートしても、π/4からスタートしても構わないが、後者は数学的な考察をする必要はあるだろう。
また、loopの初期値を100としているが、2分法なので、変数の2進数による桁数だけあれば十分であるので、64ビットの浮動小数点数ならば64でも十分である。
上記では、出力を全くしていないので、出力は各自に任せる。
rad: 0.5362669789888905
deg: 30.725834588294223˚
という答えが導けました。
プログラムではラディアンで計算しているので、弧度法に変換するには、180/πを掛ける必要があります。
類題として、4等分、5等分、…とやっていっても面白いだろう。
実際問題としては、こんなケーキのカットをしようものなら、喧嘩が絶えないだろう。
ではでは