Document - 松本充弘の個人的ページ

機械理工学・マイクロエンジニアリング・航空宇宙工学専攻
熱物理工学 2015(松本担当分)講義資料
松本充弘
第2回 2015/04/20
[email protected]
*レポートの提出状況は別紙の受講者リストで確認してください.間違いがあれば松本まで.
前回のレポート課題について
課題 ブラウン運動の計算プログラムを実行し,「どのくらい遠くに到達したか」をステップ数の関数としてプロ
ットし,考察する.
○レポートから(東野純平さん) 原点からの距離を
r = √𝑥 2 + 𝑦 2 とし,縦軸を r,横軸を時間(=step
数×t)でプロットした.(中略)時間を長くしてい
くにつれて原点から離れていくのが分かる。ただ
し、離れ方に規則性は感じられない。
同じプログラムを再度動かしても同じ結果が得ら
れた。RAND 関数は無作為な数字を毎回出力す
ると思って いたため、予想外の結果であった。
○レポートから(岡田行正さん) 計算を N ステップ進めたときの粒子
の移動距離を算出する試行を 5 回行った。N を 1000 から
100000000 まで変化させたときの粒子の移動距離を表 1 に示す。
なお、5 回の試行における平均値も算出した。また、その結果を
両対数グラフとして図 1、2 にプロットした。
図 1 においてステップ数 N の増加に伴って移動距離も増加す
ることが確認できるが、試行ごとにかなり結果にばらつきが出て
くることもわかる。移動距離の N に対する依存性を調べるために、
図 1 ステップ数と移動距離のプロット
五回の試行における平均値を両対数でプロットしたのが図 2 で
ある。図 2 を見てみると、プロットがほぼ直線に乗っていることが
わかる。つまり、移動距離とステップ数は比例の関係にあると予
想できる。ステップ数は時間の経過に対応しているから、時間
経過に比例して粒子は拡散していくことがわかる。
松本のコメント:5回の試行の平均をとるなど,
「ランダムな現象の扱
い」について,正当な考え方だと評価できます.ただ,せっかく
両対数グラフ上に描いたのに「プロットがほぼ直線に乗っている
ことがわかる。つまり、移動距離とステップ数は比例の関係にあ
図 2 ステップ数と平均移動距離のプロット
る」というのはおかしいですね.
○レポートから(蛭谷摩周さん) 両対数グラフで表してみると,比例に近い形のグラフとなったため,ステップ関
数を 1,10,100…と大きくすると,原点からの距離は指数関数的に大きくなっていくと考えられる.
熱物理工学 講義資料
1
松本のコメント:うーん,
「指数関数」という言葉遣いは間違ってますね.
○レポートから(松岡諒さん) Fig. 1~3 より,計算ステ
ップ数を増やすとブラウン運動する粒子が原点か
ら遠くまで移動することが分かる.また,速度につ
いてステップ数を増やすにつれ,より円に近い軌
跡を描くことから,粒子の速さ√𝑢2 + 𝑣 2 が一定に
近付くと考えられる.
○レポートから(渋野雄一さん) 2 次元ランダムウォー
クでは無限時間後原点に戻るといいますが、案
外遠くへは行きませんでした。100000 回の試行
の場合、グラフの中央部に線が集中していました。
これは。元あった点に点が再び戻ってくること、ひ
いては 2 次元ランダムウォークの無限時間後の回
帰をも示唆しているのではないかと思います。
○レポートから(笠原史禎さん) x 軸にステップ数,y 軸に粒子が最終的に到達した距離をグラフにする (中
略) プロットした点を最小二乗法でフィッティングし,黒実線で示した.実線の式は近似的に以下の式で
表される.
y=
0.21x^(0.52) + 1.21
1.21 は誤差として大きく,グラフは原点を通るとすると,原
点からの粒子の距離はステップ数の約 1/2 に比例すること
がわかる.ステップ数は計算時間と比例するため,これを
言い換えると粒子の距離の2乗は時間に比例していること
がわかる.
全体的なコメントと補足
今日の講義で詳しく扱いますが,このように確率的に決まる問題について「出発点からの距離」を正
しく評価するには,平均2乗変位 mean square displacement (MSD) を求めるのが普通です.ブ
ラウン粒子の場合は,MSD は時間に比例することがちょっとした手計算でわかります.初回のレポー
トは,そのような背景をあえて説明することなしに,
「どのくらい離れたかを調べよ」という漠然とし
た課題にして皆さんに考えてもらいました.
統計平均をとる方法
1.
乱数の「種 seed」を変える:すぐに思いつく,ある意味で「正統な」方法
seed=こちらが指定する非負の整数;
srand(seed);
熱物理工学 講義資料
2
2.
時間平均 time average をとる:長い計算(たとえば 108 ステップとか)を1回行った後,そ
れをいくつもの短いステップに分割すれば,平均をとることができる.分割されたそれぞれの動
きが独立と見なせることがその前提となる.
3.
集団平均 ensemble average をとる:たくさんの独立な粒子の動きを計算して,平均する.例
えば下のプログラムのように少し改造すればよい.
でも,よく考えると,実は,どれもほぼ同じことをやっていますね.
// 2次元ブラウン運動の軌跡を追跡する:ver. 2
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define
#define
#define
#define
#define
mass 1.0 // 粒子質量
gamma 1.0 // 摩擦係数
c_rand 1.0 // ランダム力の大きさ
delta_t 0.1 // 時間刻み
total_step 100000 // 計算ステップ数
10 万ステップ目の位置:10 粒子
double fr( )
{
double factor;
factor=sqrt((3*c_rand)/(2*delta_t));
return ( rand( )/(double)RAND_MAX*2 - 1.0 ) * factor;
}
int main( )
{
double x, y;
double u, v;
int step, repeat;
FILE *fout;
10 万ステップ目の位置:102 粒子
fout = fopen("brown-DifferentSeed.dat","w");
if (fout==NULL) {
printf("Error: cannot open file¥n");
return -1;
}
for (repeat=0;repeat<10000;repeat++) {
x=0.0; y=0.0;
u=0.0; v=0.0;
for (step=0; step<total_step; step++) {
x += delta_t * u;
y += delta_t * v;
u += delta_t/mass * (-gamma*u + fr( ));
v += delta_t/mass * (-gamma*v + fr( ));
}
printf("%4d %12.5f %12.5f %12.5f %12.5f¥n",repeat,x,y,u,v);
fprintf(fout,"%12.5f %12.5f %12.5f %12.5f¥n",x,y,u,v);
}
fclose(fout);
return 0;
10 万ステップ目の位置:103 粒子
10 万ステップ目の位置:104 粒子
}
熱物理工学 講義資料
3
第2回レポート課題
出題日:4 月 20 日(月)
提出期限:4 月 25 日(土)次週の準備の都合上,できるだけ期限内に送って下さい.
提出方法:電子メールで,[email protected]
へ.
課題 今日の講義で,速度自己相関関数 velocity autocorrelation function, VAF から輸送係数(拡散係数)
を求められることを示しました.このように,時系列データの自己相関を求めることは,いろいろな分野のデー
タ解析において基礎的な手法であり,身につけておくとどこかで役に立つかもしれません.そこで,ブラウン運
動について,速度自己相関関数 VAF(𝑡) を求めてみることにします:
VAF(|𝑡1 − 𝑡2 |) ≡ 〈𝑣⃗(𝑡1 ) ∙ 𝑣⃗(𝑡2 )〉
今回は,Cプログラミング初心者のために,途中まで作ったプログラムを示しますので,欠けている部分を補っ
て完成させ,VAF を求めてプロットし,簡単な考察と共に送って下さい.
(注意1) total_step 回 (ここでは 10 万ステップとした) 計算して統計平均をとるが,急速にゼロに減衰
することが予めわかっているので,相関関数は out_step (ここでは 1000 ステップ) までしか計算しな
い.
(注意2) 講義中に触れたように,この系の時定数(減衰時間)は 𝛾⁄𝑚 程度と予想される.我々の単位系
(γ=1, m=1 )では,これは 1 なので,計算時間刻み delta_t は 0.1 から 0.01 程度に小さくしない
と,詳細がわからない.
(注意3) プログラミングにある程度慣れている人は,このプログラムの構造が少し非効率であることに気付く
8
だろう.total_step が大きいと (たとえば 10 ステップとか) それが顕著に現れる.余力があれば,
その改善方法を考えてみよ.
// 2次元ブラウン運動の速度自己相関関数を求める
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define
#define
#define
#define
#define
#define
mass
1.0
gamma
1.0
c_rand 1.0
delta_t 0.01
total_step 100000
out_step 1000
double fr( )
{
double factor;
// 粒子質量
// 摩擦係数
// ランダム力の大きさ
// 時間刻み
// 計算ステップ数
// 出力ステップ数
// 0 以上 1 以下の一様乱数
factor=sqrt((3*c_rand)/(2*delta_t));
return ( rand( )/(double)RAND_MAX*2 - 1.0 ) * factor;
}
熱物理工学 講義資料
4
int main( )
{
double x, y;
double u, v;
int step;
FILE *fout;
int i, j;
double dx, dy;
static int count[out_step];
static double vaf[out_step];
static double velx[total_step], vely[total_step];
x=0.0; y=0.0;
// 初期条件:原点から初速度ゼロで出発
u=0.0; v=0.0;
for (step=0; step<total_step; step++) {
x += delta_t * u;
y += delta_t * v;
u += delta_t/mass * (-gamma*u + fr( ));
v += delta_t/mass * (-gamma*v + fr( ));
velx[step]=u;
// 速度データ蓄積
vely[step]=v;
}
for (step=0; step<out_step; step++) {
count[step]=0;
vaf[step]=0;
}
for (i=0; i<total_step; i++) {
for (j=i; j<total_step; j++) {
step=j-i;
・
・
この間のプログラムを作る
・
・
}
}
// カウンタ初期化
// 速度自己相関関数の計算
fout = fopen("vaf.dat","w");
for (step=0; step<out_step; step++)
// 結果をファイルに出力
fprintf(fout, "%10.3f %10.3f¥n", delta_t*step, vaf[step]/count[step]);
}
fclose(fout);
return 0;
}
本日のレポート課題は以上です.次回は 4 月 27 日.
熱物理工学 講義資料
5