반응형

./copernicus/ E000N60_PROBAV_LC100_global_v3.0.1_2015-base_Discrete-Classification-map_EPSG-4326

 

Copernicus Global Land Service의 100m 해상도 토지피복 지도

 

구성 요소 의미

E000N60 타일 위치 — 경도 0°E, 위도 60°N 기준 (20×20도 타일의 좌상단 좌표)
PROBAV 센서 — PROBA-V 위성 데이터 기반
LC100 제품 — Land Cover 100m 해상도
global_v3.0.1 버전 — Collection 3, 패치 0.1
2015-base 기준 연도 — 2015년
Discrete-Classification-map 레이어 유형 — 이산(discrete) 분류 지도
EPSG-4326 좌표계 — WGS84 위경도

한국 지역을 커버하는 타일은?

E000N60 타일은 유럽 지역(경도 0°~20°E, 위도 40°~60°N)을 커버합니다. 한국(약 경도 124°~132°E, 위도 33°~39°N)을 받으려면 E120N40 타일이 필요합니다 (경도 120°~140°E, 위도 20°~40°N 범위).


다운로드 방법

  1. https://land.copernicus.eu/en/products/global-dynamic-land-cover 접속
  2. 계정 로그인 (무료 가입)
  3. Download 섹션에서 한국을 포함하는 E120N40 타일 선택
  4. 연도 선택 (2015~2019 가능)

또는 LC Viewer에서 직접: https://lcviewer.vito.be/download

한국 지역용 파일명 예시:

E120N40_PROBAV_LC100_global_v3.0.1_2019-nrt_Discrete-Classification-map_EPSG-4326.tif

 


pyVPRM에서 사용 시

이 제품은 pyVPRM의 copernicus 토지피복 타입에 해당하며, pyVPRM/vprm_configs/ 폴더에 Copernicus 클래스를 VPRM 8개 식생 클래스(상록수림, 낙엽수림, 혼합림, 관목지, 농경지, 초지, 비식생, 습지)로 매핑하는 설정 파일이 포함되어 있습니다.

반응형
반응형

 

(vprm) chpark@Dell-7820:~/pyVPRM_examples/vprm_predictions/data/era5$ ncdump -v time 2022_1.nc | more
netcdf \2022_1 {
dimensions:
        lat = 14 ;
        lon = 20 ;
        time = 743 ;
variables:
        double lat(lat) ;
                lat:_FillValue = NaN ;
                lat:units = "degrees_north" ;
                lat:axis = "Y" ;
                lat:long_name = "latitude" ;
                lat:standard_name = "latitude" ;
        double lon(lon) ;
                lon:_FillValue = NaN ;
                lon:units = "degrees_east" ;
                lon:axis = "X" ;
                lon:long_name = "longitude" ;
                lon:standard_name = "longitude" ;
        int64 time(time) ;
                time:units = "hours since 2022-01-01 01:00:00" ;
                time:calendar = "proleptic_gregorian" ;
        int64 spatial_ref ;
                spatial_ref:crs_wkt = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AU
THORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"de
gree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EP
SG\",\"4326\"]]" ;
                spatial_ref:semi_major_axis = 6378137. ;
                spatial_ref:semi_minor_axis = 6356752.31424518 ;
                spatial_ref:inverse_flattening = 298.257223563 ;
                spatial_ref:reference_ellipsoid_name = "WGS 84" ;
                spatial_ref:longitude_of_prime_meridian = 0. ;
                spatial_ref:prime_meridian_name = "Greenwich" ;
                spatial_ref:geographic_crs_name = "WGS 84" ;
                spatial_ref:horizontal_datum_name = "World Geodetic System 1984" ;
                spatial_ref:grid_mapping_name = "latitude_longitude" ;
                spatial_ref:spatial_ref = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.25722356
3,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[
\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[
\"EPSG\",\"4326\"]]" ;
                spatial_ref:GeoTransform = "8.859356528537921 0.28124941360437844 0.0 50.0233983883556 0.0 -0.2810302529
911226" ;
        double ssrd(time, lat, lon) ;
                ssrd:_FillValue = NaN ;
                ssrd:coordinates = "spatial_ref" ;
        double t2m(time, lat, lon) ;
                t2m:_FillValue = NaN ;
                t2m:coordinates = "spatial_ref" ;
data:

 time = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
    20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
    38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
    56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
    74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
    92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
    108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
    122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,

이 era5.nc 파일은 https://cds.climate.copernicus.eu/datasets?q=era5&limit=30 여기서 다운 받으려고 하는데 정확한 이름을 모르겠어

 

ncdump 결과의 변수명(ssrd, t2m)과 시간 단위(hourly)를 바탕으로 볼 때, 해당 데이터는 ERA5 Reanalysis 데이터셋에서 추출된 것입니다.

Copernicus Climate Data Store(CDS)에서 찾으셔야 할 정확한 데이터셋 이름과 선택 항목은 다음과 같습니다.


1. 정확한 데이터셋 명칭

가장 가능성이 높은 데이터셋은 아래와 같습니다.

  • 데이터셋 이름: ERA5 hourly data on single levels from 1940 to present
  • 데이터 카테고리: Reanalysis

VPRM 모델은 지표면 근처의 기온과 복사 에너지를 필요로 하기 때문에, 입체적인 층(Pressure levels) 데이터가 아닌 Single levels(지표면/단일 층) 데이터를 사용합니다.

2. 선택해야 할 변수 (Variables)

ncdump에 나타난 변수들과 매칭되는 CDS 상의 명칭입니다.

ncdump 변수명 CDS 선택 항목 명칭 (Full Name) 설명
t2m 2m temperature 지표면 2m 높이의 기온
ssrd Surface solar radiation downwards 지표면에 도달하는 태양 복사 에너지

3. ERA5-Land 가능성

만약 연구 지역이 육상 생태계에 집중되어 있고 더 높은 해상도(약 9km)를 사용하고자 한다면, 아래 데이터셋을 사용했을 수도 있습니다. 변수명은 동일합니다.

  • 데이터셋 이름: ERA5-Land hourly data from 1950 to present

4. 데이터 다운로드 시 팁

https://cds.climate.copernicus.eu/datasets?q=reanalysis&limit=30

 

Catalogue — Climate Data Store

Search for datasets inside the CDS catalogue

cds.climate.copernicus.eu

 

CDS 웹사이트에서 데이터를 선택할 때 다음 설정을 확인하시기 바랍니다.

  1. Product type: Reanalysis 선택
  2. Variable: Popular 또는 Radiation and heat 탭에서 위 두 변수 선택
  3. Year/Month/Day/Time: 필요한 기간 선택 (파일 이름이 2022_1.nc인 것으로 보아 2022년 1월 데이터를 모두 선택한 것으로 보입니다.)
  4. Format: NetCDF 선택 (기본값은 GRIB일 수 있으므로 반드시 변경해야 합니다.)

💡 추가 확인 사항

현재 보여주신 ncdump 결과에서 spatial_ref와 같은 좌표계 정보가 매우 상세하게 포함되어 있는데, 이는 CDS에서 갓 받은 원본 상태라기보다 Python의 rioxarrayclimetlab 같은 라이브러리를 통해 한 차례 가공(Reprojection)된 상태로 보입니다.

VPRM 모델 인스턴스를 생성할 때 이 ERA5 데이터를 ds로 입력하시려는 것 같은데, 혹시 데이터를 불러오는 과정에서 위경도 좌표 충돌이나 시간 축 설정 관련하여 도움이 더 필요하신가요?

반응형
반응형

 

반응형
반응형

3장에서는 다음 내용을 다룬다.

  1. 연립 1차방정식을 행렬과 벡터로 표현하고, 가우스 소거와 랭크로 해 구조를 분석한다.
  2. 행렬식과 Cramer 공식을 통해 역행렬 존재 여부, 해의 유일성 조건을 정리한다.
  3. 벡터와 내적·외적, 직선·평면, 거리의 기하적 해석을 제공한다.
  4. 선형연산자(행렬)의 개념을 도입하고, 선형독립·기저·차원·벡터공간 구조를 다룬다.
  5. 고유값·고유벡터와 대각화를 통해 선형변환의 “좋은 좌표계”를 찾는 방법을 제시한다.
  6. 직교·유니터리 행렬을 회전·반사 변환으로 해석하고, 특수 행렬과 기본 공식들을 정리한다.

1. 선형대수와 벡터의 도입

  • 여러 개의 미지수를 갖는 연립 1차방정식을 기하적으로 해석하면, 2차원에서는 직선들의 교점, 3차원에서는 평면들의 교선/교점이 된다.
  • 물리에서 사용하는 속도, 힘, 자기도 등 방향과 크기를 가진 양을 벡터라 하고, 질량, 시간, 온도처럼 크기만 있는 양을 스칼라라 한다.
  • 벡터는 화살표(기하적 개체)로도, 성분(좌표계에 대한 숫자 배열)로도 나타낼 수 있다.
  • 벡터 방정식은 좌표계 선택과 무관하게 쓸 수 있고, 이는 물리 법칙을 간결하게 표현하는 데 중요하다.
  • n개의 미지수에 대한 n개의 1차방정식 집합을 n차원 벡터 방정식으로 해석하는 관점이 이후 전개의 핵심이다.

2. 행렬과 행 소거(Row Reduction)

  • 행렬이란 숫자를 직사각형 배열로 나열한 것이다. m×n 행렬은 m개의 행과 n개의 열을 가진다.
  • 전치(transpose)는 행을 열로, 열을 행으로 바꾸는 연산이다.
  • 연립방정식

$$
\begin{cases}
2x - z = 2\\
6x + 5y + 3z = 7\\
2x - y = 4
\end{cases}
$$

에서 계수행렬 M, 미지수벡터 r = (x,y,z)^T, 상수벡터 k를 정의하여 Mr = k 형태로 쓴다.

  • 증강행렬은 계수행렬에 상수항 열을 붙인 것이다.
  • 행 기본변환(행 소거에 허용되는 연산)은:
  1. 두 행을 교환한다.
  2. 한 행에 0이 아닌 상수를 곱하거나 나눈다.
  3. 한 행에 다른 행의 상수배를 더하거나 뺀다.
  • 이 연산들로 증강행렬을 계단형 또는 기약계단형으로 만들면, 연립방정식의 해 구조를 쉽게 읽을 수 있다.
  • 랭크(rank)는 행 소거 후 남는 “0이 아닌 행”의 개수이다.
    • 계수행렬 M의 랭크와 증강행렬 A의 랭크를 비교하여:
      • rank M < rank A → 연립방정식은 모순, 해 없음.
      • rank M = rank A = 미지수 수 → 유일해.
      • rank M = rank A < 미지수 수 → 자유변수 존재, 무한히 많은 해.

3. 행렬식(Determinant)과 Cramer 공식

  • 정방행렬(행과 열 수가 같은 행렬)에 대해 행렬식(det)을 정의한다.
  • 2×2 행렬에 대해

$$
\det\begin{pmatrix} a & b\\ c & d\end{pmatrix} = ad - bc
$$

이다.

  • 고차 행렬식은 소행렬(minor)과 여인수(cofactor)를 이용한 Laplace 전개로 정의한다.
  • 행렬식의 기본 성질:
    • 한 행(또는 열)에 상수 k를 곱하면 det 전체도 k배가 된다.
    • 두 행이 같거나 서로 배수이면 det = 0이다.
    • 두 행을 바꾸면 det의 부호가 바뀐다.
    • 한 행에 다른 행의 상수배를 더해도 det는 변하지 않는다.
  • Cramer 공식:
    • n×n 계수행렬의 행렬식 D가 0이 아니면, 연립 1차방정식은 유일해를 가지며, 각 미지수는 해당 열을 상수항으로 대체한 행렬의 행렬식을 D로 나눈 값으로 주어진다.
  • 행렬의 랭크를 “모든 정사각 부분행렬의 행렬식”을 이용해 정의할 수도 있다. 이때, 0이 아닌 최대 차수의 부분행렬식의 차수가 랭크가 된다.
  • det M ≠ 0 이면 M은 역행렬을 가지며, det M = 0 이면 M은 특이(singular)행렬이다.

4. 벡터와 내적·외적

  • 벡터는 성분 형태로 $\mathbf{A} = (A_x, A_y, A_z)$와 같이 쓴다.
  • 벡터의 크기(노름)는 $|\mathbf{A}| = \sqrt{A_x^2 + A_y^2 + A_z^2}$이다.
  • 벡터의 덧셈·뺄셈은 성분별로 한다.
  • 내적(dot product):

$$
\mathbf{A}\cdot\mathbf{B} = A_xB_x + A_yB_y + A_zB_z = |\mathbf{A}||\mathbf{B}|\cos\theta
$$

이며, 각도와 투영을 구하는 데 사용한다.
- $\mathbf{A}\cdot\mathbf{B} = 0$이면 두 벡터는 직교(orthogonal)이다.

  • 외적(cross product):

$$
\mathbf{A}\times\mathbf{B} = \begin{vmatrix}
\mathbf{i} & \mathbf{j} & \mathbf{k}\\
A_x & A_y & A_z\\
B_x & B_y & B_z
\end{vmatrix}
$$

이고, 그 크기는 $|\mathbf{A}||\mathbf{B}|\sin\theta$이다.
- 방향은 오른손 법칙에 의해 결정된다.
- 외적은 두 벡터 모두에 수직인 벡터를 준다.

  • 내적과 외적을 통해 각도, 투영, 면적, 법선벡터 등을 계산한다.

5. 직선과 평면의 벡터 방정식

  • 직선:
    • 점 $\mathbf{r}_0$과 방향벡터 $\mathbf{A}$가 주어지면,

$$
\mathbf{r} = \mathbf{r}_0 + t\mathbf{A}
$$

로 직선을 나타낸다.
- 성분식: $x = x_0 + at,, y = y_0 + bt,, z = z_0 + ct$.
- 대칭형: $(x-x_0)/a = (y-y_0)/b = (z-z_0)/c$.

  • 평면:
    • 법선벡터 $\mathbf{N} = (a,b,c)$와 평면 위의 한 점 $\mathbf{r}_0=(x_0,y_0,z_0)$가 주어지면,

$$
\mathbf{N}\cdot(\mathbf{r} - \mathbf{r}_0) = 0
$$

이다.
- 이는 $a(x-x_0) + b(y-y_0) + c(z-z_0) = 0$ 또는 $ax+by+cz=d$ 형태이다.

  • 점–평면 거리:
    • 점 $(x_0,y_0,z_0)$와 평면 $ax+by+cz+d=0$ 사이의 거리는

$$
D = \frac{|ax_0+by_0+cz_0+d|}{\sqrt{a^2+b^2+c^2}}
$$

이다.

  • 점–직선 거리와 두 직선 사이 거리도 내적·외적과 투영을 이용해 유도한다.

6. 행렬 연산과 역행렬

  • 행렬과 스칼라의 곱: 각 성분에 스칼라를 곱한다.
  • 행렬의 덧셈: 대응하는 성분끼리 더한다.
  • 행렬 곱셈:
    • (AB)의 i,j원소는 A의 i행과 B의 j열의 내적이다.
    • 곱셈은 일반적으로 교환법칙이 성립하지 않는다 (AB ≠ BA인 경우가 많다).
    • 그러나 결합법칙과 분배법칙은 성립한다.
  • 단위행렬(Identity matrix) I:
    • 대각성분이 1이고 나머지는 0인 정방행렬로, AI = IA = A이다.
  • 역행렬:
    • 정방행렬 M에 대해 M⁻¹이 존재하면 MM⁻¹ = M⁻¹M = I이다.
    • 역행렬은 cofactor(여인수) 행렬과 det M을 이용해 공식으로 구할 수 있다.
  • 행렬식의 곱:
    • 정방행렬 A, B에 대해 det(AB) = (det A)(det B)이다.

7. 선형결합, 선형함수, 선형연산자

  • 두 벡터 A, B의 선형결합은 aA + bB 형태이다.
  • 보다 일반적으로, 벡터공간의 벡터들을 스칼라 계수로 가중합한 것을 선형결합이라 한다.
  • 선형함수 f는
    • $f(\mathbf{u}+\mathbf{v}) = f(\mathbf{u})+f(\mathbf{v})$,
    • $f(c\mathbf{u}) = c f(\mathbf{u})$
      를 만족한다.
  • 선형연산자도 같은 조건을 만족하는 연산이며, 행렬이 대표적인 예이다. 행렬 M에 대해, $T(\mathbf{x}) = M\mathbf{x}$는 선형연산자이다.
  • 선형변환은 평면이나 공간을 다른 평면·공간으로 선형적으로 보내는 변환이며, 행렬로 표현한다.
    • 예: 회전, 반사, 축척(scaling) 등.

8. 선형독립, 기저, 차원

  • 벡터 집합 ${\mathbf{v}_1,\ldots,\mathbf{v}_k}$이 선형독립(linearly independent)이라는 것은

$$
c_1\mathbf{v}_1 + \cdots + c_k\mathbf{v}_k = \mathbf{0}
$$

인 경우 $c_1=\cdots=c_k=0$ 외에는 해가 없다는 뜻이다.

  • 선형종속(linearly dependent)이라 함은 위 선형결합이 0이 되도록 하는 비자명한 계수들이 존재함을 의미한다.
  • 한 벡터공간을 생성(span)하는 선형독립 벡터들의 집합을 기저(basis)라 한다.
  • 기저 벡터의 개수가 그 벡터공간의 차원(dimension)이다.
    • 예: $\mathbb{R}^3$에서 표준기저 (i, j, k)는 3차원 공간의 기저이다.
  • 행렬의 랭크는 행벡터(또는 열벡터)들이 생성하는 부분공간의 차원과 같다.

9. 특수 행렬과 유용한 공식

  • 여러 종류의 특수 행렬이 있다:
    • 대칭(symmetric): $A^T = A$.
    • 반대칭(skew-symmetric): $A^T = -A$.
    • 직교(orthogonal): $A^T A = I$, 즉 역행렬이 전치와 같다.
    • 에르미트(Hermitian): 복소 케이스에서 $A^\dagger = A$.
    • 유니터리(unitary): $A^\dagger A = I$.
  • 직교행렬은 유클리드 노름을 보존하는 회전·반사 변환에 해당한다.
  • 행렬의 대각합(trace) Tr(A)는 주대각 원소들의 합이며, 곱의 순환적 성질
    • Tr(ABC) = Tr(BCA) = Tr(CAB) 등의 관계를 가진다.
  • (AB)^T = B^T A^T, (AB)⁻¹ = B⁻¹ A⁻¹와 같은 공식은 계산을 크게 단순화한다.

10. 일반 벡터공간, 내적, 정규직교 기저

  • 벡터공간 개념은 $\mathbb{R}^n$ 뿐 아니라 다항식 공간, 함수 공간, 행렬 공간 등에까지 확장된다.
  • 내적(inner product)은 두 벡터 사이의 “각도”와 “길이” 개념을 추상화한 것이다.
    • $\langle \mathbf{u}, \mathbf{v} \rangle$가 대칭, 선형, 양의 정부호 등의 성질을 만족한다.
  • 노름(norm)은 $|\mathbf{v}| = \sqrt{\langle \mathbf{v}, \mathbf{v} \rangle}$로 정의한다.
  • 코시–슈바르츠 부등식 $|\langle \mathbf{u}, \mathbf{v} \rangle| \le |\mathbf{u}||\mathbf{v}|$가 성립한다.
  • 정규직교(orthonormal) 기저는 서로 직교하고 각 벡터 길이가 1인 기저이다.
  • Gram–Schmidt 과정은 주어진 선형독립 벡터 집합으로부터 정규직교 기저를 만드는 방법이다.

11. 고유값과 고유벡터, 대각화

  • 선형변환 $T$에 대해 $T\mathbf{v} = \lambda\mathbf{v}$를 만족하는 0이 아닌 $\mathbf{v}$와 상수 $\lambda$를 각각 고유벡터(eigenvector), 고유값(eigenvalue)이라 한다.
  • 행렬 M의 고유값은 det(M - λI) = 0의 해로 구한다.
  • 대각화(diagonalization):
    • 충분한 수의 선형독립 고유벡터가 있으면, 이들을 열로 갖는 행렬 C에 대해

$$
C^{-1} M C = D
$$

가 되는데, D는 대각행렬이며 대각원소가 고유값이다.

  • 대칭(또는 Hermitian) 행렬은 항상 실수 고유값을 가지며, 서로 다른 고유값에 대응하는 고유벡터들은 서로 직교한다.
    • 이 경우 직교(또는 유니터리) 행렬 C로 대각화할 수 있고, 이는 좌표축을 고유벡터 방향으로 “회전”한 효과이다.
  • 대각화를 통해 선형변환의 기하적 의미(순수한 축 방향의 스케일링, 회전축 등)를 명확히 이해할 수 있다.

12. 응용: 직교변환과 회전/반사

  • 2차원에서 회전변환은

$$
R(\theta) = \begin{pmatrix}
\cos\theta & -\sin\theta\\
\sin\theta & \cos\theta
\end{pmatrix}
$$

같은 직교행렬로 표현한다.

  • 3차원에서는 특정 축을 중심으로 하는 회전과 반사를 3×3 직교행렬로 나타낸다.
  • 직교행렬의 행(또는 열)은 새로운 좌표축의 단위벡터로 해석할 수 있다.
  • 이러한 관점에서, 선형대수는 점들의 좌표가 아니라 “좌표계 자체”를 바꾸는 도구이기도 하다.

 

이 장의 개념은 이후 선형 미분방정식, 정상모드 해석, 행렬 지수, 푸리에·특수함수 전개 등 거의 모든 응용 선형대수의 기반이 되는 것이라 할 수 있다.
^1^3

 

 

 

Boas 3장 필수 연습문제 

문제

 

반응형
반응형

기상학에서 순열(Permutations)과 조합(Combinations)은 기상 데이터의 가짓수를 계산하거나, 예보 모델의 시나리오를 구성할 때 아주 유용하게 쓰인다.

1. 순열(Permutation): 순서가 중요한 경우

기상 현상이 발생하는 '순서''시간적 배열'이 중요할 때 순열을 사용.

[문제 1] 기상 특보 알림 순서
어느 날 갑작스러운 기상 악화로 인해 강풍, 호우, 대설, 풍랑, 우박의 5가지 기상 특보를 순차적으로 발표해야 한다. 이 중 가장 시급한 3가지를 골라 발표 순서를 정하는 방법은 몇 가지일가?

  • 풀이: 5가지 중 3가지를 선택하여 순서대로 나열하는 순열 (5_P_3)
  • 5_ P_3 = 5 x 4 x 3 = 60가지

2. 조합(Combination): 순서와 상관없이 선택하는 경우

여러 요소 중 특정 개수를 '뽑기'만 할 때, 즉 선택된 순서가 결과에 영향을 주지 않을 때 사용.

[문제 2] 기상 관측소 선정
한반도 주변 해역에 설치된 10개의 해양 기상 부이(Buoy) 중 정밀 점검을 위해 3개의 부이를 무작위로 선정하려고 한다.점검 대상을 선정하는 방법은 총 몇 가지인가? (어떤 것을 먼저 뽑든 점검 대상 리스트는 동일함)

  • 풀이: 10개 중 순서 없이 3개를 선택하는 조합(10_C_3)입니다.
  • 10_C_3 = (10 x 9 x 8 ) / (3 x 2 x 1) = 120 가지

3. 응용 예제: 앙상블 예보 시스템

[문제 3] 앙상블 멤버 분석
기상청에서 총 20개의 앙상블 멤버(서로 다른 예측 시나리오)를 생성하였다. 이 중 '태풍 경로가 북상할 것으로 예측하는 멤버'가 12개, '대한해협을 통과할 것으로 예측하는 멤버'가 8개이다.

  1. 북상 시나리오 멤버 중 2개, 대한해협 통과 시나리오 멤버 중 2개를 각각 뽑아 비교 분석 팀을 구성하는 방법은 몇 가지인가?
  2. 전체 20개 멤버 중 15개 이상이 동일한 지역을 가리킬 때 '예보 신뢰도 높음'으로 판단한다면, '신뢰도 높음' 판정을 내릴 수 있는 멤버 조합의 수는 총 몇 가지인가? (북상 시나리오 기준)
  • 풀이: 각각의 그룹에서 조합을 구한 뒤 곱한다.
    • 북상 멤버 선택: 12_C_2 = (12 x 11 ) / 2 = 66
    • 대한해협 멤버 선택: 8_C_2 = (8 x 7)/2 = 28
    • 총 가짓수: 66 x 28 = 1,848
구분 기상학적 의미 핵심 키워드 공식
순열 (P) 날씨의 변화 순서, 특보 우선순위 순서, 배열, 시간순 n x (n-1) x ...
조합 (C) 관측 장비 선택, 앙상블 그룹핑 선택, 구성, 세트 n_P_r/r!

확률과 통계적 사고는 기상 예보관들이 "내일 비가 올 확률이 몇 퍼센트인가"를 계산할 때 기초가 되는 논리.


4. 중복 순열 (Permutation with Repetition)

"중복을 허용하고, 순서가 중요한 경우"

기상학에서는 매일의 날씨 상태를 유형별로 분류하고, 일정 기간 동안 어떤 패턴으로 나타날 수 있는지 계산할 때 사용

[문제 4] 이번 주 월, 화, 수 3일간의 날씨를 '맑음(S), 흐림(C), 비(R)'의 3가지 유형으로 예보하려고 한다. 발생 가능한 모든 날씨 시나리오는 몇 가지인가? (어제 맑았어도 오늘 또 맑을 수 있으므로 중복이 가능하며, 월요일에 비가 오는 것과 수요일에 비가 오는 것은 다른 시나리오이므로 순서가 중요.)

  • 풀이: n^r = 3^3
  • 3 x 3 x 3 = 27 가지

5. 중복 조합 (Combination with Repetition)

"중복을 허용하지만, 순서는 상관없는 경우"

순서보다는 '각 항목이 몇 개씩 포함되었는가'라는 구성 비율이 중요할 때 사용.  장비 구성을 결정할 때 필수.

[문제 5-1]  (장비 구성) 기상 관측소에서 온도 센서, 습도 센서, 기압 센서의 3가지 종류를 구입하려고 한다. 예산에 맞춰 이 중 총 5개의 센서를 자유롭게 구입하려고 한다. 구입할 수 있는 센서 세트의 구성 방법은 총 몇 가지인가? (같은 종류를 여러 개 사도 되며, 가방에 담는 순서는 상관없음.)

  • 풀이 : n_H_r = (n+r-1)_C_r
  • 3_H_5 = (3+5-1)_C_5 = 7_C_5 = 7_C_2 = (7 x 6 ) / (2 x1) = 21가지

[문제 5-2]  (시나리오 구성) 기상 연구자가 미래 기후 예측 모델을 돌리기 위해 3가지 주요 기후 시나리오(SSP1, SSP2, SSP5) 중에서 총 4개의 실험 세트를 구성하려고 한다. (SSP는 기후 변화에 대응하는 인류의 시나리오)

  • 중복 허용: 특정 시나리오의 신뢰도를 높이거나 매개변수 민감도를 테스트하기 위해 동일한 SSP 시나리오를 여러 번 선택할 수 있다. 예: "안정적인 미래인 SSP1만 4번 돌려보자!"
  • 순서 무관: 연구 보고서에 들어갈 전체 실험 구성이 "SSP1 2개, SSP5 2개"인 것이 중요하지, 어떤 순서로 시나리오를 뽑았는지는 최종 '실험 세트'의 성격에 영향을 주지 않는다.
  • 종류 (n): 3가지 (SSP1, SSP2, SSP5)
  • 선택 횟수 (r): 4번
  • 풀이 :
  • 3_H_4 = (3+4-1)_C_4 = 6_C_4 = 6_C_2 = (6 x 5)/ (2 x 1) = 15가지

 

(팁) 중복 조합이 헷갈릴 때는 '칸막이'를 생각.

위의 센서 문제에서 5개의 센서 (*)를 사고, 3종류를 구분하기 위해 2개의 칸막이(|)를 세운다고 생각

 

               예: ** | * | **   --> (온도계 2개, 습도계 1개, 기압계 2개)

 

전체 7개 자리(별 5개 + 칸막이 2개) 중에서 칸막이가 들어갈 자리 2개를 뽑는 것(7_C_2)과 원리가 같다.

이 중복의 개념은 '몬테카를로 방법'에서 무작위 샘플을 추출할 때, 특정 상태가 중복해서 선택될 확률을 계산하는 기초가 된다.

 

                                                                                    

  중복 순열 (n^r)        중복 조합 (n_H_r)
핵심 사고 "내일, 모레, 글피 날씨가 각각 어떨까?" "이번 달에 비 오는 날이 며칠이나 있을까?"
순서 유무 중요함 (월: 비, 화: 맑음 ≠ 월: 맑음, 화: 비) 상관없음 (비 1일, 맑음 1일 구성만 같으면 됨)
활용 예시 시계열 기상 패턴 분석 기상 자원 배분, 입자 통계 분석

 

 

 

 

~50% assisted by Gemini

반응형
반응형

몬테카를로 시뮬레이션과 앙상블 시뮬레이션

몬테카를로 시뮬레이션과 앙상블 시뮬레이션은 모두 '불확실성'을 다룬다는 공통점

하지만, 그 불확실성을 어디서 가져오고 어떻게 처리하는가라는 철학적, 기술적 측면에서 큰 차이가 있다.

대기과학과 통계학의 관점에서 두 개념의 차이를 정리해 드립니다.


1. 몬테카를로 시뮬레이션 (Monte Carlo Simulation)

"무작위 난수를 이용한 통계적 근사"

몬테카를로 시뮬레이션은 시스템의 물리적 법칙 내부에 무작위성(Randomness)을 직접 주입. 시스템 자체가 확률적으로 움직인다고 가정하거나, 계산하기 너무 복잡한 값을 무작위 샘플링을 통해 알아내는 방법.

  • 변동성: 매 단계(Step)마다 발생하는 무작위 난수($\epsilon$)가 변동성 유발
  • 핵심 원리: 주사위를 수만 번 던져서 평균값을 구하는 것과 같다. 입자가 이동할 때마다 어느 방향으로 튈지 난수를 발생시켜 결정.
  • 대기과학 예시: 입자 확산 모델. 오염 물질 입자가 매 초마다 난류에 의해 어느 방향으로 갈지 무작위로 결정하여 수만 개의 궤적을 만든다.

2. 앙상블 시뮬레이션 (Ensemble Simulation)

"초기 조건의 미세한 차이를 이용한 확률적 예보"

앙상블 시뮬레이션은 대기의 초기 상태에 대한 불확실성에 집중한다. 기상 관측 값에는 항상 미세한 오차가 있는데, 이 작은 차이가 카오스 이론에 의해 나중에 거대한 결과의 차이를 만든다는 점을 이용.

  • 변동성: 시뮬레이션 시작 시점의 초기 조건(Initial Condition)에 의한 교란에 의해 변동
  • 핵심 원리: 같은 물리 법칙(모델)을 사용하되, 시작점만 아주 조금씩 다른 여러 개의 시나리오(멤버)를 동시에 실행.
  • 대기과학 예시: 앙상블 기상 예보. 태풍의 현재 위치와 강도를 조금씩 다르게 설정한 50개의 모델을 돌려, 태풍이 갈 수 있는 여러 경로(스파게티 차트)를 분석.  결과적으로 기상 예보가 얼마나 믿을만한지(신뢰도)와 발생 가능성을 판단

차이점 비교 요약

구분 몬테카를로 시뮬레이션 앙상블 시뮬레이션
주요 목적 복잡한 적분 계산 또는 미시적 확률 과정 모사 수치 예보의 불확실성 정량화 및 확률 예보
불확실성 주입 모델 실행 도중 계속해서 난수를 발생시킴 모델 실행 직전 초기 조건을 약간씩 변형함
물리적 가정 시스템 내부에 무작위적 요소가 포함됨 시스템은 결정론적이지만 초기값을 정확히 모름
결과 해석 수많은 시도의 평균과 분산 도출 각 시나리오(멤버) 간의 일치도 및 확률 분포 확인
비유 취객의 걸음걸이 (매 걸음이 무작위) 100미터 달리기 (출발 자세가 조금씩 다름)

 

몬테카를로는 "세상은 확률적으로 움직인다"는 가정하에 매 순간 주사위를 던지는 방식

앙상블은 "시작점을 완벽히 알 수 없다"는 한계 때문에 살짝 다른 여러 시작점에서 동시에 출발해 보는 방식

 

 


 앙상블 칼만 필터(Ensemble Kalman Filter, EnKF):

위 두 기법이 기상 모델링에서 구체적으로 결합되어 쓰이는지 가장 대표인 사례. 기상 예보의 정확도를 획기적으로 높인 일등 공신. "현재 상태를 가장 정확하게 알아내기 위해(자료 동화)" 두 기법의 장점을 섞어 사용.

1. 왜 섞어서 쓰나? (자료 동화의 핵심)

기상 예보를 하려면 현재 날씨(초기 조건)를 알아야 한다. 하지만 두 가지 문제가 발생.

  • 수치 모델: 물리 법칙은 알지만, 계산 과정에서 오차가 쌓임.
  • 실제 관측: 센서(기상 스테이션, 위성) 데이터가 있지만, 모든 지점에 센서가 있는 건 아니고 관측 장비 자체에도 오차가 존재.

이때 모델의 예측값실제 관측값 사이에서 "누구를 더 믿을 것인가?"를 결정하여 최적의 정답(분석장)을 찾아내는 과정이 자료 동화(Data Assimilation) 기법.


2. 어떻게 결합하는가? (EnKF의 원리)

앙상블(Ensemble) 기법으로 시작, 그 내부에 복잡한 통계 계산을 몬테카를로(Monte Carlo)방식으로 해결.

  1. 앙상블 예측 (Ensemble Part):
    조금씩 다른 초기 조건을 가진 수십 개의 모델(멤버)을 미래로 실행해서 서로 다른 결과를 산출 --> 이들의 분산(퍼짐) 정도가  "모델이 현재 얼마나 불확실한가"를 나타내는 척도가 된다.
  2. 몬테카를로 샘플링 (Monte Carlo Part):
    칼만 필터는 수학적으로 매우 복잡한 행렬 계산(오차 공분산)이 필요.
    하지만 대기처럼 변수가 수억 개인 시스템에서는 계산이 불가능하기 때문에 몬테카를로 방식을 사용. 수천 개의 변수를 일일이 계산하는 대신, 앙상블 멤버들(샘플)의 통계적 분포를 통해 오차 범위를 추정한다.
  3. 업데이트 (Kalman Gain):
    실제 관측값이 들어오면, 앙상블 멤버들의 분포와 관측값의 오차를 비교하여 가중치를 둔다.
    $$x^a = x^f + K(y - Hx^f)$$
    (여기서 $K$는 칼만 이득, 모델과 관측 중 어느 쪽이 더 신뢰도가 높은지에 따라 결정.)

3. 결합의 효과: "지능적인 일기예보"

이 결합 기법이 대단한 이유는 '흐름에 의존적인 오차(Flow-dependent Error)'를 잡아내기 때문입니다.

  • 폭풍이 올 때: 앙상블 멤버들이 폭풍 위치에 대해 크게 갈린다면, 몬테카를로 통계는 "지금 이 지역은 모델이 아주 불안정하니 관측값을 더 많이 반영하자!"라고 판단합니다.
  • 평온할 때: 멤버들이 거의 일치한다면 "모델이 잘 맞고 있으니 관측값의 미세한 노이즈는 무시하자"라고 결정합니다.

요약

  • 앙상블은 여러 시나리오를 동시에 돌리는 '구조'를 제공,
  • 몬테카를로는 그 방대한 시나리오들 속에서 복잡한 수학 대신 '확률적 샘플링'으로 계산 효율을 극대화.

기상청의 예보관들은 매일 아침 이 두 기법이 함께 만든 '앙상블 평균'과 '확률 분포'를 보며 "오늘 비 올 확률 60%입니다"라고 예보한다. 

 

반응형
반응형

 

 

 

 

 



이 식에 K-theory 을 적용하고, K_m  상수로 취급하면, 에크만 층에서의 아래 운동 방정식을 얻을 수 있다.

 

 

 

반응형
반응형

pyVPRM은 식생의 광합성과 호흡을 계산하는 모델로, 대용량 격자 데이터(NetCDF)와 위성 영상(MODIS 등)을 처리하기 위해 특정 과학 계산 라이브러리들과 긴밀하게 연결되어 있습니다. 2026년 현재 기준, 안정적인 구동이 확인된 권장 사양은 다음과 같습니다.


pyVPRM 호환성 및 권장 버전 정보

pyVPRM의 핵심은 위성 데이터의 리그리딩(Regridding)을 담당하는 ESMF/ESMPy와의 호환성입니다. 이를 기준으로 구성된 권장 스택은 다음과 같습니다.

구분 권장 버전 비고
Python 3.10 ~ 3.12 3.11 버전이 가장 안정적이다.
NumPy 1.26.x 이상 NumPy 2.0과의 호환성은 패키지 업데이트 확인이 필요하다.
Pandas 2.1.x 이상 시계열 데이터 처리를 위해 최신 안정판을 권장한다.
Xarray 2023.10.0 이상 NetCDF 데이터 핸들링을 위한 핵심 라이브러리이다.
ESMF / ESMPy 8.4.0 이상 설치가 가장 까다로우며, conda 설치가 필수적이다.
NetCDF4 1.6.0 이상 기상 데이터 입출력에 사용된다.
Geopandas 0.14.0 이상 공간 데이터 처리에 필요하다.

주요 라이브러리별 역할 및 주의사항

  • Python 3.11 (권장): 최신 라이브러리들과의 속도 및 호환성 측면에서 가장 유리하다. 3.13 이상의 최신 버전은 일부 수치 계산 라이브러리의 컴파일 문제가 발생할 수 있다.
  • ESMPy (가장 중요): pyVPRM 설치 실패의 90%는 이 라이브러리에서 발생한다. 일반적인 pip install로는 설치가 거의 불가능하며, conda install -c conda-forge esmpy 명령어를 통해 바이너리 형태로 설치해야 한다.
  • Xarray & Dask: 대규모 격자 데이터를 메모리에 다 올리지 않고 처리(Lazy Loading)하기 위해 사용된다. 버전이 너무 낮으면 pyVPRM 내부의 데이터 구조와 충돌할 수 있다.

가상 환경 구성을 위한 최적의 순서

의존성 꼬임을 방지하기 위해 아래 순서대로 설치하는 것을 권장합니다.

  1. Conda 환경 생성: 파이썬 3.11 기반의 깨끗한 환경을 만든다.
  2. 무거운 라이브러리 선점: esmf, esmpy, netcdf4conda-forge 채널에서 먼저 설치한다.
  3. pyVPRM 설치: 마지막에 pip를 통해 pyVPRM을 설치하여 나머지 의존성을 자동으로 해결한다.

설치 검증 코드

설치 후 아래 코드를 실행하여 핵심 라이브러리들이 충돌 없이 로드되는지 확인할 수 있습니다.

import numpy as np
import pandas as pd
import xarray as xr
import ESMF
import pyVPRM

print(f"ESMF: {ESMF.__version__}")
print("pyVPRM load successful!")

현재 설치하시려는 환경에 맞춰 이 모든 설정을 한 번에 해결할 수 있는 environment.yaml 파일 내용을 만들어 드릴까요? 혹은 특정 라이브러리 설치 중에 발생한 에러가 있으신가요?

반응형
반응형

몬테카를로 시뮬레이션(Monte Carlo Simulation)

몬테카를로 시뮬레이션 무작위 샘플링 반복적인 시뮬레이션을 통해 복잡하고 불확실한 시스템의 결과를 예측하는 수학적 기법.

 

원주율($\pi$) 값 근사 계산 예시:  가장 대표적인 예시인 원주율($\pi$) 값을 근사적으로 구하는 과정.

 

 

 

 

  1. 무작위 점 생성 (Generate Random Points):
    • 한 변의 길이가 1인 정사각형과 그 안에 반지름이 1인 사분원.
    • 시뮬레이션은 정사각형 내부에 수천, 수만 개의 무작위 점 point (X, Y)을 생성하는 것에서 시작. (초록색과 빨간색 점들)
  2. 점 분류 및 계산 (Classify & Calculate):
    • 생성된 무작위 점들을 사분원 안에 있는지 확인. 점의 좌표 $(X, Y)$에 대해 $X^2 + Y^2 \le 1$을 만족하면 사분원 안의 점(초록색)으로 분류.
    • 핵심 수식: 전체 point 수에 대한 원 안의 point 수의 비율은 전체 면적에 대한 원의 면적 비율과 비슷해짐
      $$\frac{\text{원 안의 점 수}}{\text{전체 점 수}} \approx \frac{\text{사분원 면적}}{\text{정사각형 면적}} = \frac{(\pi \times 1^2 / 4)}{(1 \times 1)} = \frac{\pi}{4}$$
    • 따라서, 이 비율에 4를 곱하여 $\pi$ 값을 근사적으로 계산.
      $$\pi \approx 4 \times \frac{\text{원 안의 점 수}}{\text{전체 점 수}}$$
    • 작은 그래프는 시뮬레이션 시도 횟수가 늘어날수록 계산된 $\pi$ 값이 실제 원주율(3.14159...)에 가까워지는 것을 보여줌. 줍니다. 반복 시행을 통해 정밀도가 향상되는 것을 시각적으로 이해할 수 있습니다.

핵심 원리 (Core Principles)

  • 수많은 무작위 시행: 주사위나 난수 생성기를 사용하여 다양한 불확실한 입력 변수를 생성하고 많은 횟수의 시뮬레이션 반복.
  • 결과의 확률적 분포: 수많은 시행의 결과는 하나의 고정된 값이 아닌 확률적 분포로 표현됨. (히스토그램)
  • 평균 및 불확실성 예측: 결과의 평균, 표준편차 등으로 시스템의 미래 행동을 예측하고 위험성을 분석.

활용 분야 (Applications)

다양한 불확실성이 존재하는 분야에서 활용.

  • 금융: 주가 예측, 옵션 가격 결정, 리스크 관리 및 포트폴리오 분석.
  • 공학: 시스템의 신뢰성 및 안전성 분석, 품질 관리.
  • 물리학: 입자 이동 시뮬레이션, 복잡한 시스템의 통계 역학 분석.
  • 게임: AI 의사결정 모델링 (예: 알파고), 복잡한 시나리오 분석.

 

몬테카를로 시뮬레이션 : 대기과학 응용

 

대기 시스템의 복잡성과 불확실성을 다루는 핵심 도구

대기는 아주 작은 변화에도 결과가 크게 달라지는 '카오스'적 특성이 있어, 수천 번의 가상 시나리오를 돌려 확률적 결론을 내리는 것이 필요.

"정확한 정답 하나를 맞히는 것"이 아닌 "발생 가능한 모든 시나리오 중 무엇이 가장 유력한지"를 찾아내는 것.

 

대기 난류에 의한 오염 물질 확산, 구름 내부에서의 태양 복사 에너지 산란(Radiative Transfer), 대기 난류에 의한 오염 물질 확산, 구름 내부에서의 태양 복사 에너지 산란(Radiative Transfer), 또는 초기 조건의 오차를 반영하는 앙상블 일기예보(Ensemble Forecasting) 에 널리 쓰임.

1. 앙상블 예보 (Ensemble Forecasting)

가장 대중적으로 쓰이는 예. 현재의 기상 관측값(온도, 습도, 풍향 등)에는 항상 미세한 오차가 존재.

  • 방법: 초기 관측값에 아주 미세한 무작위 변동(난수)을 주어 수십 개의 초기 상태를 만듬. 이 각각의 상태를 슈퍼컴퓨터로 시뮬레이션 수행.
  • 결과: 시뮬레이션 결과들이 한곳으로 모이면 "예보의 신뢰도가 높다"고 판단하고, 결과들이 사방으로 흩어지면(일명 '스파게티 차트') "불확실성이 크다"고 발표.

drawn by Nano Banana

2. 태풍 진로 및 상륙 지점 예측

태풍은 주변 기압계의 영향을 크게 받기 때문에 이동 경로를 단정하기 어려움.

  • 방법: 태풍을 움직이는 주변 지형, 고기압의 위치, 해수면 온도 등에 확률적인 변수를 부여하여 수천 개의 가상 태풍 경로를 생성.
  • 결과: 특정 도시 근처를 지나는 경로가 1,000번 중 700번 발생했다면, 해당 도시의 태풍 상륙 확률을 70%로 산정. 이는 방재 계획(대피령 등)을 세울 때 매우 중요한 근거.

3. 수문 기상학의 홍수 위험 분석 (Flood Risk Assessment)

특정 지역에 100년에 한 번 올 법한 '백년 빈도 강수'가 내렸을 때 홍수가 날 확률을 계산.

  • 방법: 과거 수십 년간의 강수량 데이터를 기반으로, 발생 가능한 수만 가지의 비 시나리오를 무작위로 생성. 이후 이 비가 지면의 흡수량, 강 하류의 배수 능력과 만났을 때 수위가 어떻게 변할지 시뮬레이션.
  • 결과: 댐의 범람 확률이나 하수도 용량 초과 가능성을 확률 분포 그래프(PDF) 형태로 얻을 수 있어, 도시 설계의 안전 기준을 마련하는 데 사용

'대기 오염 물질의 난류 확산(Turbulent Dispersion)' 예제

🌬️ 오염 물질의 2차원 무작위 행보 (Random Walk)

공장 굴뚝에서 오염 물질(입자)이 배출된다고 가정. 이 입자들은 다음 두 가지 물리적 요인의 영향을 받음:

  1. 평균 풍속 (결정론적 이동): 바람 부는 방향(예: X축)으로 일정하게 이동.
  2. 대기 난류 (확률론적 이동): 크고 작은 무작위 소용돌이에 의해 사방으로 불규칙하게 흩어짐. --> 몬테카를로 방법에서는 이를 정규분포를 따르는 난수(Random Number)를 추출하여 시뮬레이션 수행.

위치 업데이트 공식은 다음과 같이 표현

x_{t+1} = x_t + u*Δt + ε_x*√Δt
y_{t+1} = y_t + v*Δt + ε_y*√Δt

(여기서 u, v는 평균 풍속, ε 은 난류 강도를 나타내는 난수.)

💻 Python 코드 예제

아래는 numpymatplotlib을 이용해 굴뚝에서 배출된 1,000개의 입자가 바람과 난류를 타고 어떻게 퍼져나가는지 시뮬레이션하는 간단한 코드.

import numpy as np
import matplotlib.pyplot as plt

# 1. 시뮬레이션 파라미터 설정
n_particles = 1000  # 시뮬레이션할 총 입자 수
n_steps = 100       # 시뮬레이션 시간 스텝 수
dt = 1.0            # 시간 간격 (초)

# 2. 물리적 환경 설정
wind_speed_x = 2.0  # 평균 풍속 (X축 방향, m/s)
wind_speed_y = 0.0  # 평균 풍속 (Y축 방향, m/s)
turb_diff = 1.5     # 난류 확산 강도 (표준편차)

# 3. 입자들의 초기 위치 (굴뚝 위치: x=0, y=0)
x = np.zeros((n_particles, n_steps))
y = np.zeros((n_particles, n_steps))

# 4. 몬테카를로 시뮬레이션 (Random Walk 루프)
for i in range(1, n_steps):
    # 각 스텝마다 정규분포(평균 0, 표준편차 turb_diff)에서 무작위 난류 값을 추출
    random_turb_x = np.random.normal(0, turb_diff, n_particles)
    random_turb_y = np.random.normal(0, turb_diff, n_particles)

    # 다음 위치 = 현재 위치 + (바람에 의한 이동) + (난류에 의한 무작위 확산)
    x[:, i] = x[:, i-1] + (wind_speed_x * dt) + (random_turb_x * np.sqrt(dt))
    y[:, i] = y[:, i-1] + (wind_speed_y * dt) + (random_turb_y * np.sqrt(dt))

# 5. 결과 시각화
plt.figure(figsize=(10, 6))

# 입자들의 이동 궤적 그리기 (시각적 편의를 위해 50개만 표시)
for p in range(50):
    plt.plot(x[p, :], y[p, :], color='gray', alpha=0.3, linewidth=0.5)

# 마지막 시간 스텝에서의 전체 입자 최종 분포 (연기 기둥의 단면)
plt.scatter(x[:, -1], y[:, -1], color='red', s=5, label='Final Plume Distribution', zorder=5)

plt.title("Monte Carlo Simulation: Atmospheric Pollutant Dispersion")
plt.xlabel("Downwind Distance (m)")
plt.ylabel("Crosswind Distance (m)")
plt.axhline(0, color='black', linewidth=0.5, linestyle='--')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

이 코드를 실행하면, 입자들이 X축으로 이동하면서 점차 부채꼴 모양(Plume)으로 넓게 흩어지는 전형적인 대기 확산 모델의 결과를 확인할 수 있다.

아래에 이 몬테카를로 확산 과정을 직접 매개변수를 조절하며 실시간으로 관찰해 볼 수 있는 시뮬레이터

풍속과 난류 강도를 변경해 보며 입자들의 퍼짐(Plume) 형태가 어떻게 달라지는지 확인.

 

 

{"component":"LlmGeneratedComponent","props":{"height":"600px","prompt":"Create an interactive 2D physics simulation of atmospheric pollutant dispersion using a Monte Carlo random walk model. Objective: Demonstrate how continuous particle emission forms a plume driven by deterministic wind and stochastic turbulence. UI labels must be strictly in Korean. Title: '대기 오염 물질 확산 몬테카를로 시뮬레이션'. Controls (sliders): '풍속 (Wind Speed)' (range 0 to 10), '난류 강도 (Turbulence)' (range 0 to 5). Display the controls neatly. Behavior: Use HTML5 Canvas. Continuously emit small particle dots from the middle-left edge of the canvas (representing a smokestack). In each animation frame, update particle positions: x += Wind_Speed + random(-Turbulence, Turbulence); y += random(-Turbulence, Turbulence). Make particles slowly fade in opacity as they get older, and remove them from the array when they fade out completely or leave the canvas bounds to optimize performance. Draw the particles clearly against a dark background for good contrast. Do not specify CSS color names for the UI, let the system handle standard component styling.","id":"im_fa02cc8ea62ae2b2"}}

대기 오염 물질 확산 몬테카를로 시뮬레이션

풍속 (Wind Speed) 4.0 m/s

난류 강도 (Turbulence) 1.5

 

 

반응형
반응형

 

  • 실선 = 원함수 (sin, cos, tan)
  • 긴 점선 = 역삼각·역쌍곡 (asin, acos, atan / asinh, acosh, atanh)
  • 짧은 점선 = 쌍곡함수 (sinh, cosh, tanh)

 

반응형

+ Recent posts