仮想世界の圧力を測定する

次に仮想世界の圧力を計算してみよう。

理想気体の方程式

 PV = nRT 

は4 つの変数、P, V, n, T のうち、3つを決めると、残りの一つは自動的に決まってしまうことを示している。

これまで扱ってきた2次元系では、

  • V は壁に囲まれた正方形の大きさであり、決まっている。
  • n は分子の個数であり、(分子を生成するごとに数は変わるが)決まっている。
  • T は分子の平均の運動エネルギーであり、これはスライダーで制御できるようにした。

と3つが決まっており、残る P は自動的に定まってしまうはずである。

ここでは系の示す圧力 P を、現実世界に対応する量として取り出す(測定する)ことを考えよう。

系内の分子は壁にぶつかって方向を変えているが、この際に壁に力を及ぼす。これが圧力の源であるから、壁との衝突の際に分子に及ぼす力と、衝突頻度がわかれば圧力を計算することができる。

今ある粒子が x 成分の速度 vx で右側の壁に衝突し、速度が -vx になったとする。
この時の運動量変化は 2mvx である。ニュートンの第2法則によれば、運動量の変化は力積(F Δt)に等しい。よって、分子の衝突によって壁に及ぼされる力 F

F = \displaystyle \sum(衝突による運動量変化) / 時間

によって計算できる。

ある程度長い時間、衝突による運動量変化を積算し、それを積算した時間で割って F を算出してみよう。

例えば、過去 1000 step 分の衝突による F を計算するためには次のようにする。
(方法はいろいろあるので、ルーチンを思いついた人は自分で計算を行ってほしい。)

//プログラム冒頭で次の3つの変数を定義
int step = 0; //step数
float moment; //そのstepでの運動量の和
float[] moment_rec = new float[1000]; //過去1000 step分の運動量の記録

void draw(){
//メインループ
step++; //stepに1を加える
moment = 0; //運動量はいったん0に

//処理いろいろ
//Particle内の衝突処理でmomentを積算する

moment_rec[step%1000] = moment; //momentの値をmoment_recに記録
float moment_ave = 0;
for(int i=0; i<1000; i++){
  moment_ave += moment_rec[i]; //1000 step分の運動量をmoment_aveに加える
  }

//圧力の表示処理 moment_aveに過去1000 step分の運動量変化の和が入っているので、スケールを合わせた時間で割り、表示
} //メインループおしまい

class Particle{

void reflect(){
  moment += xx;
  //ここで衝突のたびに運動量変化をmomentに積算
  //符号に注意
  }
}

F を圧力にするためには、面積A で割らなくてはいけません。

 \displaystyle P = \frac{F}{A} 

ここで扱っている系は2次元なので面積 A を求めることができませんが、系の厚みを分子直径 σ として圧力を算出してみましょう。

( A = 2({\rm width})(s_{scale})\sigma + 2({\rm height})(s_{scale})\sigma )

例題

  • 気体としてふるまっている状態で、温度に圧力がおおむね比例することを確かめてください。
  • 液体、固体の領域では上記の関係はどうなるでしょうか。

(執筆中)