Processing으로 시뮬레이션~열전도

소개



Processing을 사용하여 열전도를 시뮬레이션합니다.

열전도 방정식



시간에 따라 변화하는 온도의 분포를 가르쳐 주는 방정식입니다.

온도 $T(x,t)$ 는 시간과 위치의 함수입니다.
\frac{\partial T}{\partial t} = k \frac{\partial ^2 T}{\partial x^2}

차분화·이산화



차이로 변환합니다.
\frac{1}{Δt}(T(x,t+Δt) - T(x,t)) = k\frac{1}{Δx^2}(T(x+Δx,t)-2T(x,t)+T(x-Δx,t))

이산화
Δt = 1, t = 0,1,2, ...
Δx=1, x=0,1,2,...,len
합니다.
T(x,t+1) - T(x,t) = k(T(x+1,t)-2T(x,t)+T(x-1,t))

t=0일 때
T(x,1) = T(x,0) + k(T(x+1,0)-2T(x,0)+T(x-1,0))

$T(x,0)$ 는 초기 조건입니다. 시간 0에서의 온도 분포입니다.
$T(x,1)$ 는 1시간 진행된 온도 분포입니다.
x가 0~len의 범위를 취하면 $x(-1,t),x(len+1,t)$의 데이터가 필요합니다. 이것은 경계 조건이 됩니다.

Processing으로 시각화



서모그래피와 같은 색칠



HSB 컬러 모드를 사용하여 Hue 값을 0%~68%까지 사용하면 0%가 적색, 68%가 청색이 됩니다.
고온을 빨강, 저온을 파랑으로 색칠합니다.
void setup() 
{
  size(680, 120);
  int step = 100;
  PImage img = createImage(step, 1, RGB);
  colorMode(HSB, step*100/68, 100, 100);
  noSmooth();
  for (int i=0; i<step; i++) {
    img.pixels[i] = color(i+1, 100, 100);
  }
  img.updatePixels();
  image(img, 0, 0, width, height);
}



시뮬레이션



t1은 현재 온도 분포이고 t0은 1시간 전의 온도 분포입니다.
xmin은 가장 왼쪽의 온도이고 xmax는 오른쪽 끝의 온도입니다. 초기 조건은 모두 온도 0입니다.
오른쪽이 고온, 왼쪽이 저온으로 되어 있고, 온도가 오른쪽에서 왼쪽으로 이동합니다.
float k = 0.5;
float[] t0;
float[] t1;
float xmin;
float xmax;
PImage img;
int step = 100;

void setup() {
  size(640, 100);
  init();
  noSmooth();
  frameRate(60);
}

void draw() {
  for (int i=0; i<step; i++) {
    img.pixels[i] = color(255-t1[i], 100, 100);
  }
  img.updatePixels();
  image(img, 0, 0, width, height);
  for (int i=0; i<10; i++) // speed up
    updateTime();
}

void init()
{ 
  t0 = new float[step];
  t1 = new float[step];
  xmin = 0;
  xmax = 255;
  img = createImage(step, 1, RGB);
  colorMode(HSB, 255*100/68, 100, 100);
}

void updateTime()
{
  for (int i=0; i<step; i++) {
    t0[i] = t1[i];
  }

  t1[0] = t0[0] + k * (xmin - 2 * t0[0] + t0[1]);
  for (int i=1; i<step-1; i++) {
    t1[i] = t0[i] + k * (t0[i-1] - 2 * t0[i] + t0[i+1]);
  }
  t1[step-1] = t0[step-1] + k * (t0[step-2] - 2 * t0[step-1] + xmax);
}

IMAGE ALT TEXT HERE

좋은 웹페이지 즐겨찾기