乱数を使って円周率もどきを求める2

先日試した乱数を使った円周率を求める方法を
numpyを使った方法に置き換えた。

実行結果

numpy使わずにwhileで計算していたまえの処理に較べて15倍位早い結果。全て配列に収めてから処理するとさすがに早い。ただしメモリもバカ喰い。

乱数を使って円周率もどきを求める

乱数を使った円周率もどきを求めてみる

下記のような正方形と内接する円を考える。正方形の1辺は2としておく。この正方形の中にランダムに点を打った際、円の中にも入る確率は 円の面積 / 正方形の面積。つまり、確率  =  π / 4  となる。

 

 

π  =  正方形内にランダムに点を打った           際に円の中に入る確率は  ×  4  

 

 

 

ランダムに打った点が円の中に入ったかどうか?はx座標とy座標にそれぞれ0~1の乱数を与えてやり、sqrt(x^2  + y^2)  が1以下であれば円の中といえる。

 

 

この処理を実装したものが下記

実行結果

それなりに近い値かな?

centos7にてpycudaをインストール(pip3)

pycudaを下記コマンドからインストールを試したところ、、、

エラーでストップ。
pycudaのコンパイル時にcuda.hがないとのメッセージで死んでいる。

このエラーについてググるとコンパイル時のPATH/
CPATH/LIBRARY_PATH等にcudaのpathを追加で
対応可能と出てくるが自分の環境では改善せず。。

自分のところでは、gccのバージョンを上げることでエラーが消えて
インストール成功した。gccの対応バージョンがあるっぽい。

エラー時:gcc version 4.8.5 20150623
成功時 :gcc version 7.3.1 20180303

centos7にcudaをインストール

CUDAはNVIDIAが開発・提供しているGPU向けの汎用並列コンピューティングプラットフォーム。専用のC/C++コンパイラ (nvcc) やライブラリ (API) などが提供されている(wiki)。

NVIDIAのサイトからOS/アーキテクチャにあったToolkitをダウンロード。
https://developer.nvidia.com/cuda-downloads


※wget方式でのコマンドラインが指定される。


acceptと入力してEnter


とりあえず全部にチェック入れてInstall

インストールの際はUIをGUIからCUIに変更しておく(参考)。

 

インストールした結果が下記

centos7でNVIDIAドライバのインストール

centos7にてGeForce GTX 1060を使えるようにする為、
NVIDIAのドライバインストールをする。

 

現在利用可能なVGAの確認

lspci

cpuに搭載されているUHD Graphics 630とGeForce GTX 1060 6GBが認識されていることが確認できる。

 

NVIDIAのサイトから上記に対応したドライバをダウンロード
https://www.nvidia.co.jp/Download/index.aspx?lang=jp

NVIDIA_DL_SITE

 

システム起動時のUIをGUIからCUIに変更しておく
default.targetのリンク先をGUI時のgraphical.targetから
CUI用のmulti-user.targetに変更する。

 

システムに反映させて再起動させる

 

ダウンロードしたドライバをインストールする
bash NVIDIA-Linux-x86_64-470.94.run

 

インストールが完了したら下記コマンドでグラフィックカードの状態を確認することができる。

nvidia-smiの結果

ある点(x,y)が多角形の内部にあるかどうかを判定するアルゴリズム

ある点(x,y)が多角形の内部にあるかどうかを判定するアルゴリズム
An algorithm to determine if a point (x, y) is inside a polygon

ある点(x,y)が多角形の内部にあるかどうかを判定する
判定のアルゴリズムは以下3ステップ

・判定対象としたい多角形の、最も大きいx座標を求める(xp)。
・判定対象とした点から、x軸並行で上記で求めたxpまでの線分を作成する(lxp)
・線分lxpと多角形を構成するエッジとの交点の数をカウントする(cross num)。
 →交点の数が・・
  奇数なら、点(x,y)は多角形の内部にある。
  偶数なら、点(x,y)は多角形の外部にある。

polygon max x coordinate
cross count

It is judged whether or not a certain point (x, y) is inside the polygon
The algorithm of the judgment consists of three steps

· Find the largest x coordinate of the polygon you want to judge (xp).
· Create a line segment up to xp obtained in parallel on the x axis from the point to be judged (lxp)
· Count the number of intersection points between the line segment lxp and the edge constituting the polygon (cross num).
→ Number of intersection points
If it is odd, the point (x, y) is inside the polygon.
If it is an even number, the point (x, y) is outside the polygon.

ボロノイ図を使いポリゴン図形の中に中心線を引く

make center line at polygons , using voronoi.

ポリゴンを構成する頂点列から、ポリゴン内に中心線を生成する。中心線の生成にはボロノイ図を用いる。入力としたポリゴン内の長いエッジに対しては細分化を行い、ボロノイ図を生成。生成したボロノイ図を構成するエッジの内、ポリゴン内にあるもののみを抽出すると、そのエッジはポリゴンの中心線のような形状となる。
generate center line in the polygon from the vertex sequence constituting the polygon. at generate we use voronoi diagrams . For long edges in the input polygon, subdivide it and generate Voronoi diagram. When extracting only those in the polygon out of the edges constituting the generated Voronoi diagram, the edge has a shape like the center line of the polygon.

なお、今回扱うポリゴン頂点列のフォーマットしては下記の様なものとしてある。ポリゴンが複数ある場合は、下記を一つのテキストファイルに複数記述することで複数ポリゴンを表現できる。
The format of the polygon vertex sequence handled this time is as follows. If there are multiple polygons, you can express multiple polygons by describing the following in one text file.

XY .. 固定(fixed)
point num .. ポリゴンを形成する頂点数
      (number of vertives forming a polygon)
x1 y1 .. 頂点1つを表すX-Y座標。
    (XY coordinates representing one vertex)


■頂点座標指定のイメージ図(format sample image)
polygon points format sample

最初に生成する中心線の結果画像を示す。青色がポリゴン図形、白線がボロノイ図、緑線が中心線となる。
At first, show results image of the center line generated. Blue is a polygon figure, a white line is a Voronoi diagram, and a green line is a center line.
005_c_inpol_vol_pnt.png

入力としたポリゴン頂点を表すテキストファイルは下記
the input polygon vertex text is as follow URL.
http://hello-python.com/imgs/201901/point_list

■sample code