- 高校地学の教科書を読んでいたら計算したくなったので。久しぶりのプログラミング楽しかったです。
- 計算結果は教科書に載っているものと微妙に異なる数値が出てきます。
- 楕円の弧長の近似値を求めるのに区分求積法を使いました。もっと良い方法がありそうです。
- 区分求積法を実装したついでにπの近似値も求めてみたり
- 調べてみると、緯度差1°あたりの経線弧の長さを求めるという問題からは、どうやら「楕円積分」という話題に発展できるみたいですね。
include Math
A = 6378.137
B = 6356.752
N = 50000
EPSILON = 1.0/180*PI
def main
p lng(deg2rad(90))
p lng(deg2rad(66.0 + 20.0/60))
p lng(deg2rad(45.0))
p lng(deg2rad(1.0 + 31.0/60))
p lng(deg2rad(0))
end
def deg2rad(deg)
deg/180.0*PI
end
def lng(alpha)
theta_1 = alpha_to_theta(alpha-EPSILON/2)
theta_2 = alpha_to_theta(alpha+EPSILON/2)
arc(theta_1, theta_2, N)
end
def arc(theta_1, theta_2, n)
integrate(->theta { sqrt((A*sin(theta))**2 + (B*cos(theta))**2) }, theta_1, theta_2, n)
end
def alpha_to_theta(alpha)
atan2(B*sin(alpha), A*cos(alpha))
end
def integrate(f, a, b, n)
delta_x = (b-a).to_f / n
sum = 0.0
n.times do |i|
x = a + delta_x * i
sum += f.(x) * delta_x
end
sum
end
main() if $0 == __FILE__