Scilabでブラウン運動 その3

Scilabでブラウン運動 その2では、単位時間あたりに任意の方向に距離1だけ移動するランダムウォークのスクリプトを書きました。これはScilabでブラウン運動 その1では移動できる角度が制限されていたことに対する拡張です。

今回は、さらに発展させて、単位時間あたりに移動する距離もランダムに決定するように拡張を行います。

001_20141109111602617.png
Fig.1: 一次元のランダムウォーク。各ステップでの移動距離を1に固定したもの(青)と移動距離の平均二乗変位平方根が1となるような正規分布から計算したもの(赤)。赤線は、移動距離が1よりも短いこともあれば長いこともある。



一次元のランダムウォーク


二次元から始めてもよいのですが、移動距離を固定したものとの比較が簡単なため、一次元のスクリプトも示します。
各ステップにおける移動量を乱数で与える場合、どのような乱数を使うかの選択肢がいくつかあると思いますが、今回は正規分布(ガウス関数)としました。Scilabにおいてはgrandを利用することによって正規分布に従う乱数を生成する事ができます。

clear;

// *** 計算の設定 ***
u = 1; // 1ステップの間の平均二乗変位平方根
av = 0;
tnum = 20; // 時間ステップ数
t = (0:1:tnum)'; // 時間のベクトル

// *** 位置の計算 ***
// 移動距離が正規分布に従う場合
xigauss = grand(tnum,1,'nor',av,u);
Sgauss = [0; cumsum(xigauss)];
// 移動距離が一定の場合
xifix = 2 * u * (rand(tnum,1) >= 0.5) - u;
Sfix = [0; cumsum(xifix)];

// *** グラフのプロット ***
plot(t,Sgauss,'-or');
plot(t,Sfix,'-ob');
xlabel("x position");
ylabel("y position");


二次元のランダムウォーク


二次元への拡張を行います。ソースコードを比較するなら今回の一次元のものと比較するよりもScilabでブラウン運動 その2の二次元のものと比較する方がわかりやすいです。ほとんど r=1 を r=abs(grand(1,tnum,'nor',av,u)) にしただけなので。

002_20141109111601aa4.png
Fig.2: 二次元のランダムウォーク


clear;

// *** 計算の設定 ***
u = 1; // 1ステップの間の平均二乗変位平方根
av = 0;
tnum = 10000; // 時間ステップ数
t = (0:1:tnum)'; // 時間のベクトル

// *** 位置の計算 ***
// 移動する距離
r = abs(grand(1,tnum,'nor',av,u));
// 移動する方向
theta = 2 * %pi * rand(1,tnum);
// 移動量
xi = r .* cos(theta);
yi = r .* sin(theta);
// 最終的な座標
S = [zeros(2,1), [cumsum(xi,'c'); cumsum(yi,'c')]];

// *** グラフのプロット ***
plot(S(1,:),S(2,:),'-b');
xlabel("x position");
ylabel("y position");


三次元のランダムウォーク


三次元への拡張もこれまでと全く同様です。

003_20141109111601d60.png
Fig.3: 三次元のランダムウォーク


clear;

// *** 計算の設定 ***
u = 1; // 1ステップの間の平均二乗変位平方根
av = 0;
tnum = 10000; // 時間ステップ数
t = (0:1:tnum)'; // 時間のベクトル

// *** 位置の計算 ***
// 移動する距離
r = abs(grand(1,tnum,'nor',av,u));
// 移動する方向
theta = 2 * %pi * rand(1,tnum);
phi = 2 * %pi * rand(1,tnum);
// 移動量
xi = r .* sin(theta) .* cos(phi);
yi = r .* sin(theta) .* sin(phi);
zi = r .* cos(phi);
// 最終的な座標
S = [zeros(3,1), [cumsum(xi,'c'); cumsum(yi,'c'); cumsum(zi,'c')]];

// *** グラフのプロット ***
param3d(S(1,:),S(2,:),S(3,:));
xlabel("x position");
ylabel("y position");
zlabel("z position");


関連エントリ




参考URL




付録


このエントリで使用したLTspiceのシミュレーション用ファイルを添付します。ファイル名末尾の".txt"を削除して、"_"を"."に変更すれば使えるはずです。(参考:ねがてぃぶろぐの付録)


参考文献/使用機器




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。
スポンサーサイト



tag: Scilab 乱数 モンテカルロ解析 確率論 ランダムウォーク 正規分布 

FC2カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRmachikaneyamaScilabKKRPSoC強磁性CPAPICOPアンプecalj状態密度モンテカルロ解析常微分方程式odeトランジスタインターフェースDOSスイッチング回路定電流PDS5022分散関係半導体シェルスクリプトレベルシフト乱数HP6632AR6452Aブレッドボード温度解析トランジスタ技術可変抵抗I2Cバンドギャップ数値積分セミナー確率論反強磁性バンド構造偏微分方程式非線形方程式ソルバ絶縁熱設計A/DコンバータシュミットトリガPWscfマフィンティン半径フォトカプラ三端子レギュレータLM358カオスGW近似LEDISO-I2C補間74HC4053TL431アナログスイッチサーボ数値微分発振回路カレントミラーPC817CUSB直流動作点解析標準ロジックアセンブラVESTAbzqlty電子負荷パラメトリック解析2ちゃんねるチョッパアンプ単振り子量子力学BSch開発環境トレーナーバトルFFTスーパーリーグ基本並進ベクトルブラべ格子LDAイジング模型ポケモンGOQuantumESPRESSOキュリー温度Quantum_ESPRESSO仮想結晶近似Maxima六方最密充填構造熱伝導スピン軌道相互作用抵抗失敗談相対論GGA繰り返しラプラス方程式VCAコバルトgfortran状態方程式不規則合金スイッチト・キャパシタTLP621ランダムウォークQSGWFETewidth最適化位相図SMPcygwinスレーターポーリング曲線シュレディンガー方程式固有値問題条件分岐Writer509awkデータロガーマントル自動計測ガイガー管詰め回路MCU三角波ダイヤモンド過渡解析ハーフメタルubuntu格子比熱UPSQNAPFXA-7020ZR井戸型ポテンシャルテスタ熱力学LM555平均場近似UbuntuNE555最大値第一原理計算最小値TLP521フェルミ面ZnOCIF差し込みグラフ起電力ゼーベック係数TLP552fsolveスーパーセルブラウン運動OpenMPxcrysden不純物問題擬ポテンシャルハイパーリーグgnuplotc/a全エネルギー状態図multiplot合金P-10磁気モーメントcif2cellPWgui半金属BaOOPA2277ウルツ鉱構造edelt2SC1815リジッドバンド模型ナイキスト線図岩塩構造スワップ領域PGA二相共存重積分ノコギリ波ルチル構造CapSenseSICデバイ模型quantumESPRESSOフィルタフォノン電荷密度Excel円周率初期値ヒストグラムGimpシンボル凡例線種interp1不規則局所モーメントウィグナーザイツ胞縮退疎行列文字列PvP入出力軸ラベルグラフの分割specx.fifort正規分布マテリアルデザインヒストグラム確率論等高線ジバニャン方程式境界条件連立一次方程式両対数グラフ片対数グラフHiLAPW熱拡散方程式Crank-Nicolson法陰解法化学反応三次元トラックボールMAS830LCK1026PC直流解析TS-112TS-110トランスPIC16F785MBEEAGLEAACircuit固定スピンモーメントLMC662FSM等価回路モデルパラメータ・モデルフラクタルマンデルブロ集合L10構造fcc面心立方構造クーロン散乱キーボードRealforce最小二乗法日本語関数フィッティングTeX非線型方程式ソルバ結晶磁気異方性負帰還安定性

最新コメント
リンク

にほんブログ村 その他趣味ブログ 電子工作へ