(Haskellの乱数事情より)
https://qiita.com/philopon/items/8f647fc8dafe66b7381b
だそうですがここでは便利さをとり
System.Random
モジュールを使います。
System.Randomモジュールはcabalコマンドでパッケージを導入しなければなりません。
まず
sudo apt install cabal-install
でcabalをインストール。
$ cabal update -v
$ cabal install random -v
でImportできるようになります。
結構時間がかかるので -v オプションをつけて経過を見ながら。
なお表題の「ランダム法」はランダムを使っているという意味であり「モンテカルロ法」とは関係ありません。
基本のコードは
これで、未知数が一つ、解の範囲があらかじめ推測できるという条件の方程式を解くことができます。
上のコードに
root n x = evalStateT (try (pf n x)) (1,x) >>= return
pf n x g = g^n < x
main = root 2 2 >>= print
を付け加えて実行しますと
$ runghc -XFlexibleContexts randomMethod.hs
(1.4142135623728276,1.4142135623731693)
3角形の3辺の長さがわかっていれば、その形と大きさが決まることから面積を計算できるはずです。
ヘロンの公式です。
ちなみにヘロンの公式はHaskellでは極めて簡潔にこう書けます。
heron a b c = sqrt (s*(s-a)*(s-b)*(s-c)) where s = (a+b+c) / 2
余談ですがどんな複雑な形の土地でも3角形に分割することで巻き尺1本で面積計算ができます。
(ただし平面地)
ヘロンの公式が思い出せなくてもランダム法で直感的に解くことができます。
三角形の3辺の長さが a,b,c で
bを複素平面上の実数軸においたとき、
三角形の頂点は極座標で
(a,θ)
で表せます。
このθをランダム法で探ればよいのです。
$ runghc -XFlexibleContexts heron.hs
6.0
円に内接する正6角形と、同じ円に外接する正4角形を考えると、
円周率は3と4の間に存在するとわかります。
3と4の間の実数のどれかはπの近似値になるはずです。
では、それをランダム法で求められるでしょうか。
残念ながらできません。円周率を求める方程式が存在しないからです。
複素数を使えば間接的にπを求めることはできます。
複素数 c=-1+0i を極座標で表しますと (1、π)
位相を未知数θとして θを 3と 4 の間で、さまざまに変化させ c と近似する値をみつければよい。
でもこれはチートなのでは?
0 件のコメント:
コメントを投稿