Simulizer

1D diffusion

Simulizer는 막대 한쪽 끝의 온도가 시간에 따라 막대 전체로 어떻게 퍼져 나가는지 보여 줍니다. 가장 단순한 편미분방정식(PDE) 예제입니다.

Model

∂u/∂t = D · ∂²u/∂x² — 확산 방정식.

여기서 u(x, t) 는 위치 x, 시간 t 에서의 온도이고, D 는 확산 계수입니다.

Steps

  1. 새 파일을 만들고 다음을 두세요:
    • 격자 점 수 nx = 100
    • 시간 단계 수 nt = 500
    • 공간 간격 dx = 1.0 / nx
    • 시간 간격 dt = 0.0001
    • 확산 계수 D = 0.5
  2. 길이 nx 인 배열 u 를 만들고, 처음 10개만 1.0, 나머지는 0.0 으로 초기화하세요. (왼쪽 끝은 뜨겁고 나머지는 차가운 상태입니다.)
  3. 같은 길이의 임시 배열 u_new 를 만드세요.
  4. t0 부터 nt - 1 까지 도는 바깥 반복문 안에:
    • 내부 반복문 i1 부터 nx - 2 까지:
      • u_new[i] = u[i] + D * dt / (dx*dx) * (u[i+1] - 2*u[i] + u[i-1])
    • 경계: u_new[0] = 1.0 (계속 뜨거움), u_new[nx-1] = 0.0 (계속 차가움)
    • u_new 의 모든 값을 u 로 복사하세요 — u = u_new.
  5. 바깥 반복문 뒤에 u그래프로 보내기 또는 행렬 표시 패널로 넘기세요.

Pitfalls — important

확산 방정식은 시간 간격과 공간 간격 사이에 안정성 조건이 있습니다:

D · dt / dx² ≤ 0.5

이 조건을 어기면 결과가 빠르게 발산합니다. dtD 를 줄여 조건을 맞추세요. Simulizer는 이 조건을 자동으로 검사해 주지 않습니다.

Variations

  • 시간 진행 보기 — 100 시간 단계마다 그 시점의 u 사본을 모아 두었다가 여러 곡선으로 한 그래프에 겹쳐 그리세요. 시간이 갈수록 분포가 매끈해지는 모습이 나타납니다.
  • 양쪽 모두 뜨겁게 — 경계 조건을 u_new[0] = 1.0, u_new[nx-1] = 1.0 으로 두면 전체가 균일해집니다.
  • 단열 경계 — 끝 점에서 변화가 0이 되도록 u_new[0] = u_new[1], u_new[nx-1] = u_new[nx-2]. 열이 갇혀 평균값으로 수렴합니다.

Accuracy

위 코드는 가장 단순한 명시적 유한차분 방법입니다. 안정성 조건만 지키면 정성적으로나 정량적으로나 알려진 해와 잘 맞습니다. 더 큰 시간 단계를 쓰고 싶다면 Crank-Nicolson 같은 암시적 방법을 직접 구현해야 합니다.

다른 모델의 격자 안정성 조건이 궁금하다면 수치 안정성과 검증 페이지를 참고하세요.

simulizer · diffusion-1d