thin_film_reflectance — OPTICS appearance op

• 데이터 종류: signal → signal

• 호출: import fullseye as fs; fs.ledger.thin_film_reflectance(nm, thickness_nm=350.0, n_film=1.33, n_sub=1.0, cos_theta=1.0, n_out=1.0, polarization='unpolarized', under_layers=()) -> 'np.ndarray'(구현을 직접 호출하려면 import matappear; matappear.thin_film_reflectance(nm, thickness_nm=350.0, n_film=1.33, n_sub=1.0, cos_theta=1.0, n_out=1.0, polarization='unpolarized', under_layers=()) -> 'np.ndarray', 원장에서 가져오려면 opsoptics.get("thin_film_reflectance"))

사용법

박막(두께 d, 굴절률 n_film)의 분광 반사율. 특성 행렬법의 엄밀해(다중 반사를 모두 포함).

nm: 파장 [nm] (배열 가능).

thickness_nm: 막 두께 [nm]. 비눗방울은 200–800, 양극산화 피막은 50–300. nm과 브로드캐스트할 수 있는 배열도

가능(막 두께의 장. 예 (H, W, 1)의 막 두께와 (K,)의 파장 → (H, W, K)).

n_film/n_sub: 막 / 기판의 굴절률. 실수·복소수 n + ik(k ≥ 0, 금속 기판이나 흡수막)·

재료 이름(공통 재료표 materials, 예 "TI" / "AL" / "SI" —— 그 파장의 n,k를 참조)·

재료 레코드(dict)·nm과 브로드캐스트할 수 있는 파장별 배열(막의 분산) 중 무엇이든.

cos_theta: 입사측에서의 입사각의 cos(배열 가능, nm과 브로드캐스트할 수 있는 형태).

n_out: 입사측의 굴절률(실수 또는 재료 이름, 흡수 없음).

polarization: "unpolarized"(기본값, s와 p의 평균) / "s" / "p".

under_layers: 막과 기판 사이의 층(입사측부터 차례로 [(굴절률, 두께 nm), ...], 굴절률은 n_film과 같은 방식으로 쓴다).

비어 있으면(기본값) 1층의 막. 다층 AR 막·유전체 미러·산화막 아래의 질화막 등에.

반환값: 반사율 R(0–1). nm·thickness_nm·cos_theta의 브로드캐스트 형태.

★부호의 약속: 복소 굴절률은 N = n + ik, k ≥ 0. N = n − ik로 쓰는 문헌의 값은 같은 k를 양수 그대로 넘긴다(허수부가 음수인 입력은 ValueError —— 어느 약속인지 추측하지 않는다).

물리: 층마다의 특성 행렬 [[cos δ, −i sin δ / η], [−i η sin δ, cos δ]], δ = 2π N d cosθ̃ / λ(복소 Snell 법칙으로층 안의 cosθ̃를 구하고 감쇠하는 가지를 취한다), 기울어진 광학 어드미턴스 η = N cosθ̃(s) / N / cosθ̃(p). 1층이면 Airy 식 R = |r1 + r2 e^{2iβ}|² / |1 + r1 r2 e^{2iβ}|²와 같은 값이 된다(테스트에서 따로 쓴 식과 비교). λ/4의 홀수배에서 반사가 극대(n_film > n_sub일 때)가 되고, 두께를 바꾸면 색이 움직이는 것이 비눗방울의 색. 막 두께 0에서는 R이 기판 단독의 프레넬 반사와 일치한다. 계산은 filmoptics의 특성 행렬 한 곳에서 한다(filmoptics.multilayer_reflectance와 같은 함수).

★2026-10-14: 이전에는 세 굴절률을 실수로 한정했다(복소수는 TypeError). 금속 기판을 실수로 근사하면(열 착색 티타늄 90 nm를 n_sub = 2.6으로) 반사율이 0.15–0.19로 나오고, Ti의 n,k라면 0.35–0.61(380–780 nm) —— 색이 전혀 다른 것이 되는, 조용한 오류. 이제는 기판에 "TI"라고 쓰면 재료표의 n,k가 들어간다.

>>> r = thin_film_reflectance([450.0, 550.0, 650.0], 90.0, "TIO2_AMORPHOUS", "TI")

>>> bool(r.min() > 0.3)

True

패밀리 공통 입력 계약(fail-closed)

optics 의 모든 연산자는 입력을 검증한 뒤에 계산합니다(조용히 통과시키지 않습니다):

• 단위는 인자 이름에 넣습니다 — _mm / _um / _deg / _mrad. mm 와 µm 를 혼동하면 crash 가 아니라 「그럴듯하게 틀린 답」이 나오므로 이름으로 막습니다. 크기로 단위를 추측하는 처리는 일절 하지 않습니다.

• 문자열은 ValueError —— float('50') 은 성공하므로 파싱되지 않은 설정값이 길이로 통과해 버립니다(실측: thin_lens('50', '200') 이 그럴듯한 66.667 mm 를 돌려주고 있었습니다). bool 도 True == 1 의 암묵 승격으로 보고 거부합니다.

• complex / masked array 는 ValueError(실수 슬롯만. 허수부의 무언 절삭·마스크 벗기기를 거부).NaN/Inf 는 모든 입력에서 ValueError.

• 0 나눗셈과 그 친척들을 이름을 들어 거부: 초점거리 0, 곡률반경 0, 굴절률 <= 0, 불투명한 조리개(전부 0 이라 정규화가 0/0), 총합 <= 0 인 PSF, S0 = 0 인 스토크스 벡터, 물체가 앞쪽 초점에 있는 경우(상이 무한대).

• 비유한 값을 돌려주는 것은 2 개 연산자뿐이며, 둘 다 계약으로 명시: depth_of_field 의 과초점거리 너머 far_mm = inf(그것이 과초점거리의 정의)와 gaussian_beam 의 허리에서의 wavefront_radius_mm = inf(평면 파면의 곡률반경). 둘 다 유한한 짝(far_is_infinite / curvature_per_mm)을 함께 돌려줍니다. 그 밖의 무언 NaN/Inf 는 내부에서 검출해 ValueError —— 「float64 가 넘쳤다」와 「답이 무한대다」는 다른 주장이므로, 후자의 얼굴로 전자를 돌려주지 않습니다.

• 크기 상한: 생성 격자는 optics.MAX_GRID(4096), 넘겨받은 필드/PSF/조리개는 optics.MAX_FIELD_ELEMENTS(2^24), ABCD 소자열은 optics.MAX_SYSTEM_ELEMENTS(1024), Zernike 는 MAX_ZERNIKE_TERMS(512)/ MAX_ZERNIKE_ORDER(40)/ MAX_ZERNIKE_BASIS(2^25). 작은 인자에서 거대한 내부 할당이 일어나는 경로(실측: n_max=40 × 4096² 로 108 GB)를 fail-closed 로 막습니다.

• 물리적으로 불가능한 상태도 거부: 편광도 > 1 인 스토크스 벡터, 음의 투과율, 음의 강도, n-|m| 이 홀수인 잘못된 Zernike 첨자 등.

자세한 사용 가이드

• optics_imaging 패밀리 가이드

배경 지식 가이드(이 연산자 앞에 있는 물리·규약)

• colorimetry — 측색과 분광 지식 — 색은 ‘분광 × 광원 × 관찰자’로만 정해진다

• mv_illumination_practice — 조명 실무 지식 — 파장·편광·점등 방식·외광·안전

참고(샘플 데이터·문헌)

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.

• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.

• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.

실행 가능한 예제(이 연산자를 실제로 호출하는 검증된 샘플)

• appearance_structural_colour — py -3.11 examples/appearance_structural_colour.py

• simcal_tour — py -3.11 examples/simcal_tour.py

타입이 이어지는 다음 연산자(signal 를 입력으로 받는 것)

emva_photon_transfer · emva_quantum_efficiency · emva_linearity_error · emva_snr_curve · emva_dark_current · emva_total_snr · emva_exposure_for_snr · emva_photon_exposure

같은 카테고리(appearance)

cie_xyz_from_wavelength · spectrum_to_srgb · grating_wavelengths · grating_rgb · thin_film_rgb · ward_anisotropic


*Provenance: matappear.py — OPTICS 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.