中核都市の金沢と被害が激しい輪島は東京と水戸くらい離れていると石川県の広さを説明する投稿を先日見かけたが、石川県の広さは34~35位とランキング下位なので、むしろ東京や大阪が都道府県としては異様に狭いと認識すべきなのだろう
そこで考えたのが次のような指標だ。図形を格子状の正方形に分割する。これらの正方形の全ての対を考え,各対の正方形の中心間の距離の平均値を求める。分割する正方形のサイズを小さくした極限として,一つの長さが定まるのではないか。(方法1)
検索してみると,もっとスマートな方法があった。図形内の点をランダムに選ぶ。その際に縦横方向にそれぞれ座標値が一様分布であるとした確率分布を仮定する。こうして選んだ2点間の距離の期待値を求めればよいというものだ。(方法2)
まず,方法1のプログラムをJuliaで作成して計算してみた。
a=zeros(Int64,1000001,2)function ju(a,m,n)k = 0for i in 1:mfor j in 1:nk = k + 1a[k,1] = ia[k,2] = jendendendfunction su(a,m,n)mn = m*nsum = 0for i = 1:mnfor j = i:mnsum = sum + sqrt((a[i,1]-a[j,1])^2+(a[i,2]-a[j,2])^2)endendreturn sum/binomial(mn,2)endm=800n=800ju(a,m,n)@time su(a,m,n)/m
n= 25 time= 0.016720 0.521829
n= 50 time= 0.018188 0.521513
n= 100 time= 0.065998 0.521433
n= 200 time= 0.788281 0.521412
n= 400 time= 12.1924 0.521407
n= 800 time= 198.615 0.521405
nは正方形の1辺の格子点の数,timeは計算時間(秒)であり,最後が計算結果の平均長である。
方法2による理論値が解析的に得られており,( 2+√2+5 log(√2 + 1) )/15 = 0.521405 なので,nを増やすとともに理論値に収束し,n=800では理論値に一致している。
m = 50; n = 50;
a = Flatten[Table[{i, j}, {i, 1, m}, {j, 1, n}], 1];
Timing[Sum[
Sqrt[(a[[i, 1]] - a[[j, 1]])^2 + (a[[i, 2]] - a[[j, 2]])^2],
{i, 1, n*n}, {j, i, n*n}]/Binomial[n*n, 2]/n // N]
Mathematicaでは,若干コードが簡単になるけれど,時間は n=50 で 12.4801秒と,600倍以上かかってしまった。
(付)このコードはそのまま乱数による計算に置き換えることもできる。Juliaでは,a[k,1] = rand(),a[k,2] = rand() として最後の結果の/nを除く。Mathematicaでは,Tableの中身を{i,j}から{RandomReal[1], RandomReal[1]}に置き換えて最後の結果の/nを除く。
[1]地域内距離(腰塚武志)
0 件のコメント:
コメントを投稿