次に仮想世界の圧力を計算してみよう。
理想気体の方程式
は4 つの変数、P, V, n, T のうち、3つを決めると、残りの一つは自動的に決まってしまうことを示している。
これまで扱ってきた2次元系では、
- V は壁に囲まれた正方形の大きさであり、決まっている。
- n は分子の個数であり、(分子を生成するごとに数は変わるが)決まっている。
- T は分子の平均の運動エネルギーであり、これはスライダーで制御できるようにした。
と3つが決まっており、残る P は自動的に定まってしまうはずである。
ここでは系の示す圧力 P を、現実世界に対応する量として取り出す(測定する)ことを考えよう。
系内の分子は壁にぶつかって方向を変えているが、この際に壁に力を及ぼす。これが圧力の源であるから、壁との衝突の際に分子に及ぼす力と、衝突頻度がわかれば圧力を計算することができる。
今ある粒子が x 成分の速度 vx で右側の壁に衝突し、速度が -vx になったとする。
この時の運動量変化は 2mvx である。ニュートンの第2法則によれば、運動量の変化は力積(F Δt)に等しい。よって、分子の衝突によって壁に及ぼされる力 F は
F = (衝突による運動量変化) / 時間
によって計算できる。
ある程度長い時間、衝突による運動量変化を積算し、それを積算した時間で割って 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 で割らなくてはいけません。
ここで扱っている系は2次元なので面積 A を求めることができませんが、系の厚みを分子直径 σ として圧力を算出してみましょう。
( )
例題
- 気体としてふるまっている状態で、温度に圧力がおおむね比例することを確かめてください。
- 液体、固体の領域では上記の関係はどうなるでしょうか。
(執筆中)