[Processing] 기체분자의 확산(2)

과학이야기/물리학 2013. 4. 9. 12:33

지난주에 기체분자의 확산현상을 시뮬레이션한 것을 올렸습니다. 

기체의 확산과 관련해서 조금 부연설명을 하려고 합니다.


먼저 왼쪽에 분자 1개가 있다고 가정해 보겠습니다. 그 분자가 움직이면 오른쪽으로도 이동을 합니다. 이 분자 1개가 왼쪽에 있을 확률은 1/2입니다.




그럼 2개의 분자가 있을 때는 어떨까 생각해 보겠습니다. 이 2개의 분자가 동시에 왼쪽에 있을 확률은  이 됩니다.



20개의 분자가 있을 때 20개의 분자가 동시에 왼쪽에 있을 확률을 계산해보면 

이 됩니다. 즉, 거의 0이라고 봐야 겠지요.



실제 엄청나게 많은 기체 분자가 어느 한 쪽에 있다가 확산이 일어난 후 다시 원래 상태인 왼쪽으로 모일 확률은 거의 0입이다. 즉 다시 원상태로 돌려놓을 수 없다고 보는 것이 맞겠죠. 이런 현상을 우리말로 이야기 한다면 '무질서도'가 증가한다라고 합니다. 처음에는 한쪽에 정리되어 있지만 자연스럽게 무질서한 상태가 되고 저절로는 원래의 상태로 돌아갈 수는 없다는 것입니다. 이 무질서도를 영어로 '엔트로피(entropy)'라고 한답니다. 이 시스템에서는 엔트로피가 증가하게 되는 것이지요. 


엔트로피에 대한 자세한 이야기는 생략하도록 하겠습니다. 수식을 써 넣는 것도 일이고, 일반인들을 상대로 하는 이 블로그의 취지에도 맞지 않으니까요. 자세한 것을 공부하고 싶으시다면 열역학에 관한 책이나 통계역학에 관한 책을 읽어 보시면 될 것 같습니다.


오늘은 여기까지 입니다. 좋은 하루 되세요.


--------------------------------------------------------

2014.03.25 추가 : 아래는 위에서 사용한 시뮬레이션의 소스크드입니다. 이 소스코드의 두번째 줄의 int num = 1;에서 숫자가 분자의 숫자입니다. 이 숫자를 바꾸시면 다양한 갯수의 분자의 운동모습을 시뮬레이션해볼 수 있습니다.


int rad=1;

int num = 1;


float[] xpos = new float[num];

float[] ypos = new float[num];


float xspeed = 5;

float yspeed = 5;


float[] xdirection = new float[num];

float[] ydirection = new float[num];


float[] unitDirectionMagnitude = new float[num];


void setup(){

  size(540, 200);

  noStroke();

  frameRate(30);


  background(0);

  rectMode(CORNER);

  fill(105);

  rect(0, 0, 430/2, height);


  for(int i=0; i < num; i++) {

    xpos[i] = random(0, 430/2);

    ypos[i] = random(0, height);

    xdirection[i] = random(-1, 1);

    ydirection[i] = random(-1, 1);

    unitDirectionMagnitude[i] = sqrt((xdirection[i]*xdirection[i] + ydirection[i]*ydirection[i]));

    ellipse(xpos[i], ypos[i], rad, rad);

  }

}


void draw(){

  int leftCount, rightCount;

  if (mousePressed && (mouseButton == LEFT)) {

    update();

  }

  background(0);

  rectMode(CORNER);

  fill(105);

  rect(0, 0, 430/2, height);

  

  leftCount = 0;

  rightCount = 0;

  

  for (int i=0; i < num; i++) {

    xpos[i] = xpos[i] + (xspeed * xdirection[i]/unitDirectionMagnitude[i]);

    ypos[i] = ypos[i] + (yspeed * ydirection[i]/unitDirectionMagnitude[i]);

    

    if (xpos[i] > 430 - rad || xpos[i] < rad) {

      xdirection[i] *= -1;

    }

    

    if ((ypos[i] > height - rad) || (ypos[i] < rad)) {

      ydirection[i] *= -1;

    }

    

    ellipseMode(RADIUS);

    fill(255);

    ellipse(xpos[i], ypos[i], rad, rad);

    

  }

    for (int i = 0; i < num; i++) {

      if (xpos[i] < 430/2) {

        leftCount += 1;

      }

    }

    rightCount = num - leftCount;

    stroke(255);

    rect(680, 20, 50, 150);

    rect(740, 20, 50, 150);

    

    noStroke();

    textSize(12);

    fill(105);

    rect(459, 20+(150-(150*leftCount/num)), 30, 150*leftCount/num);

    text("Left", 459, 190);

    fill(200);

    rect(500, 20+(150-(150*rightCount/num)), 30, 150*rightCount/num);

    text("Right", 500, 190);

    //output.print(leftCount);

    //output.print(",");

    //output.println(rightCount);

}


void update() {

    for(int i=0; i < num; i++) {

    xpos[i] = random(0, 430/2);

    ypos[i] = random(0, height);

    xdirection[i] = random(-1, 1);

    ydirection[i] = random(-1, 1);

    unitDirectionMagnitude[i] = sqrt((xdirection[i]*xdirection[i] + ydirection[i]*ydirection[i]));

    ellipse(xpos[i], ypos[i], rad, rad);

  }

}


[새길]

[이 글이 마음에 드시면 아래 손가락 한번 꾹 찍어 주세요...^_^]


설정

트랙백

댓글