์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐ŸŒŒ ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ๋ฌผ๋ฆฌ ๋ชจ๋ธ ์™„์ „ ํ•ด๋ถ€์ฝ”๋“œ๋กœ ์šฐ์ฃผ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์˜ ๋ธ”๋ž™ํ™€ ํƒํ—˜๊ธฐ
๐Ÿš€ ๋ฏธ๋ž˜๊ธฐ์ˆ  / ์‹คํ—˜๊ฐœ๋ฐœ

๐ŸŒŒ ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ๋ฌผ๋ฆฌ ๋ชจ๋ธ ์™„์ „ ํ•ด๋ถ€
์ฝ”๋“œ๋กœ ์šฐ์ฃผ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์˜ ๋ธ”๋ž™ํ™€ ํƒํ—˜๊ธฐ

์ผ๋ฐ˜์ƒ๋Œ€์„ฑ์ด๋ก ๋ถ€ํ„ฐ ๊ด‘์„  ์ถ”์ ๊นŒ์ง€ โ€” ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๋’ค์— ์ˆจ๊ฒจ์ง„ ์ง„์งœ ๋ฌผ๋ฆฌํ•™๊ณผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์•ผ, ์†”์งํžˆ ๋งํ•ด๋ด. ๐ŸŒ‘ ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์˜์ƒ ๋ณด๋ฉด์„œ "์ด๊ฑฐ ์–ด๋–ป๊ฒŒ ๋งŒ๋“  ๊ฑฐ์ง€?" ํ•œ ๋ฒˆ์ฏค ๊ถ๊ธˆํ•˜์ง€ ์•Š์•˜์–ด? ์˜ํ™” ์ธํ„ฐ์Šคํ…”๋ผ์—์„œ ๊ฐ€๋ฅด๊ฐ•ํŠ€์•„(Gargantua) ๋ธ”๋ž™ํ™€ ์žฅ๋ฉด ๋‚˜์™”์„ ๋•Œ ์ „ ์„ธ๊ณ„ ๋ฌผ๋ฆฌํ•™์ž๋“ค์ด๋ž‘ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋™์‹œ์— ์ž… ๋ฒŒ๋ ธ์ž–์•„. ๊ทธ ์žฅ๋ฉด ํ•˜๋‚˜ ๋งŒ๋“œ๋Š” ๋ฐ ์‹ค์ œ๋กœ ๋…ธ๋ฒจ์ƒ๊ธ‰ ๋ฌผ๋ฆฌ ๋ฐฉ์ •์‹์ด ๋“ค์–ด๊ฐ”๊ฑฐ๋“ .

์˜ค๋Š˜์€ ๊ทธ ๋น„๋ฐ€์„ ์™„์ „ํžˆ ๊นŒ๋ฐœ๋ ค๋ณผ ๊ฑฐ์•ผ. ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ๋ฌผ๋ฆฌ ๋ชจ๋ธ์„ ์“ฐ๋Š”์ง€, ์ˆ˜์‹์€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€, ์‹ค์ œ ์ฝ”๋“œ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”์ง€ โ€” ์นœ๊ตฌํ•œํ…Œ ์„ค๋ช…ํ•˜๋“ฏ์ด ์ญ‰ ํ’€์–ด๋ณผ๊ฒŒ. ๋ฌผ๋ฆฌ ์ „๊ณต์ž๊ฐ€ ์•„๋‹ˆ์–ด๋„ ๊ดœ์ฐฎ์•„. ๊ฐœ๋ฐœ์ž ๋งˆ์ธ๋“œ๋กœ ์ ‘๊ทผํ•˜๋ฉด ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์–ด! ๐Ÿ’ช

๐ŸŽฏ ์ด ๊ธ€์—์„œ ๋‹ค๋ฃฐ ๊ฒƒ๋“ค โ‘  ๋ธ”๋ž™ํ™€์˜ ๊ธฐ๋ณธ ๋ฌผ๋ฆฌ โ€” ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๋ฐ˜์ง€๋ฆ„๋ถ€ํ„ฐ ์‹œ์ž‘
โ‘ก ์ผ๋ฐ˜์ƒ๋Œ€์„ฑ์ด๋ก ์˜ ์ธก์ง€์„  ๋ฐฉ์ •์‹ (๊ฒ๋จน์ง€ ๋งˆ!)
โ‘ข ๊ด‘์„  ์ถ”์ (Ray Tracing) ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ต์‹ฌ
โ‘ฃ ์ค‘๋ ฅ ๋ Œ์ฆˆ ํšจ๊ณผ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•
โ‘ค ๊ฐ•์ฐฉ์›๋ฐ˜(Accretion Disk) ์‹œ๊ฐํ™” ๋ฌผ๋ฆฌ ๋ชจ๋ธ
โ‘ฅ ์‹ค์ œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์ฝ”๋“œ ๊ตฌ์กฐ์™€ ์ตœ์ ํ™” ํŒ

๋ธ”๋ž™ํ™€ ์ด๋ฒคํŠธ ํ˜ธ๋ผ์ด์ฆŒ (์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๋ฐ˜์ง€๋ฆ„) ๊ด‘์ž๊ตฌ (Photon Sphere) r = 1.5 ร— Rs ๊ฐ•์ฐฉ์›๋ฐ˜ (Accretion Disk) ์ค‘๋ ฅ ๋ Œ์ฆˆ ๊ด‘์„  ๊ตด์ ˆ ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ํ•ต์‹ฌ ๊ตฌ์กฐ โ€” ๋ฌผ๋ฆฌ ๋ชจ๋ธ ๊ฐœ์š”

๐Ÿ”ญ 1. ๋ธ”๋ž™ํ™€์˜ ๊ธฐ๋ณธ ๋ฌผ๋ฆฌ โ€” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์ถœ๋ฐœ์ 

๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์ œ์ผ ๋จผ์ € "๋ธ”๋ž™ํ™€์ด ์ˆ˜ํ•™์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋ƒ"๋ฅผ ์•Œ์•„์•ผ ํ•ด. ์—ฌ๊ธฐ์„œ ๋“ฑ์žฅํ•˜๋Š” ๊ฒŒ ๋ฐ”๋กœ ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ํ•ด(Schwarzschild Solution)์•ผ.

๐Ÿ“ ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๋ฐ˜์ง€๋ฆ„ (Rs)

1916๋…„ ์นด๋ฅผ ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ๊ฐ€ ์•„์ธ์Šˆํƒ€์ธ์˜ ์žฅ ๋ฐฉ์ •์‹์„ ํ’€์–ด์„œ ๊ตฌํ•œ ํ•ด์•ผ. ์งˆ๋Ÿ‰ M์ธ ์ฒœ์ฒด๊ฐ€ ๋ธ”๋ž™ํ™€์ด ๋˜๋ ค๋ฉด ๋ฐ˜์ง€๋ฆ„์ด ์–ผ๋งˆ ์ดํ•˜๋กœ ์••์ถ•๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์•Œ๋ ค์ค˜.

Rs = 2GM / cยฒ
G = 6.674 ร— 10โปยนยน mยณ/(kgยทsยฒ) [์ค‘๋ ฅ ์ƒ์ˆ˜] c = 3 ร— 10โธ m/s [๋น›์˜ ์†๋„] M = ๋ธ”๋ž™ํ™€์˜ ์งˆ๋Ÿ‰ (kg)

ํƒœ์–‘ ์งˆ๋Ÿ‰(์•ฝ 2ร—10ยณโฐ kg)์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉด Rs โ‰ˆ 3km์•ผ. ํƒœ์–‘์„ ๋ฐ˜์ง€๋ฆ„ 3km์งœ๋ฆฌ ๊ณต์œผ๋กœ ์••์ถ•ํ•˜๋ฉด ๋ธ”๋ž™ํ™€์ด ๋œ๋‹ค๋Š” ๋œป! ๐Ÿคฏ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋Š” ์ด Rs ๊ฐ’์ด ๋ชจ๋“  ๋ฌผ๋ฆฌ ๊ณ„์‚ฐ์˜ ๊ธฐ์ค€ ๋‹จ์œ„๊ฐ€ ๋ผ.

๐Ÿ’ก ๊ฐœ๋ฐœ์ž ํŒ: ์‹ค์ œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์ฝ”๋“œ์—์„œ๋Š” ์ž์—ฐ ๋‹จ์œ„๊ณ„(Natural Units)๋ฅผ ์จ์„œ G=c=1๋กœ ๋†“๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„. ๊ทธ๋Ÿฌ๋ฉด Rs = 2M์œผ๋กœ ๋‹จ์ˆœํ•ด์ง€๊ณ  ์ˆ˜์น˜ ๊ณ„์‚ฐ์ด ํ›จ์”ฌ ์•ˆ์ •์ ์ด์•ผ.

๐ŸŒ€ ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๊ณ„๋Ÿ‰ ํ…์„œ (Metric Tensor)

๋ธ”๋ž™ํ™€ ์ฃผ๋ณ€์˜ ์‹œ๊ณต๊ฐ„์ด ์–ด๋–ป๊ฒŒ ํœ˜์–ด์žˆ๋Š”์ง€๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒŒ ๊ณ„๋Ÿ‰ ํ…์„œ(metric tensor)์•ผ. ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๋ธ”๋ž™ํ™€(ํšŒ์ „ ์—†๋Š” ๋ธ”๋ž™ํ™€)์˜ ์‹œ๊ณต๊ฐ„ ๊ฐ„๊ฒฉ์€ ์ด๋ ‡๊ฒŒ ์จ:

dsยฒ = -(1 - Rs/r)cยฒdtยฒ + (1 - Rs/r)โปยนdrยฒ + rยฒdฮฉยฒ
dฮฉยฒ = dฮธยฒ + sinยฒฮธ dฯ†ยฒ [๊ตฌ๋ฉด ๊ฐ๋„ ์„ฑ๋ถ„]

์ด๊ฒŒ ๋ญ” ์†Œ๋ฆฌ๋ƒ๊ณ ? ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด "๋ธ”๋ž™ํ™€ ๊ทผ์ฒ˜์—์„œ๋Š” ์‹œ๊ฐ„์ด ๋А๋ ค์ง€๊ณ , ๊ณต๊ฐ„์ด ๋Š˜์–ด๋‚œ๋‹ค"๋Š” ๊ฑธ ์ˆ˜์‹์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฑฐ์•ผ. r์ด Rs์— ๊ฐ€๊นŒ์›Œ์งˆ์ˆ˜๋ก (1-Rs/r) ํ•ญ์ด 0์— ๊ฐ€๊นŒ์›Œ์ง€๋ฉด์„œ ์‹œ๊ฐ„์ด ๋ฌดํ•œํžˆ ๋А๋ ค์ง€๋Š” ๊ฑฐ ๋ณด์ด์ง€? ์ด๊ฒŒ ๋ฐ”๋กœ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์ค‘๋ ฅ ์ ์ƒ‰ํŽธ์ด(Gravitational Redshift)๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์“ฐ๋Š” ํ•ต์‹ฌ ๊ณต์‹์ด์•ผ.

๐ŸŒช๏ธ ์ปค ๊ณ„๋Ÿ‰ (Kerr Metric) โ€” ํšŒ์ „ํ•˜๋Š” ๋ธ”๋ž™ํ™€

์‹ค์ œ ๋ธ”๋ž™ํ™€์€ ๊ฑฐ์˜ ๋‹ค ํšŒ์ „ํ•ด. ์ธํ„ฐ์Šคํ…”๋ผ์˜ ๊ฐ€๋ฅด๊ฐ•ํŠ€์•„๋„ ์—„์ฒญ๋‚˜๊ฒŒ ๋น ๋ฅด๊ฒŒ ํšŒ์ „ํ•˜๋Š” ์ปค ๋ธ”๋ž™ํ™€(Kerr Black Hole)์ด์•ผ. ์ปค ๊ณ„๋Ÿ‰์€ ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ๋ณด๋‹ค ํ›จ์”ฌ ๋ณต์žกํ•ด:

dsยฒ = -(1 - rRs/ฯยฒ)cยฒdtยฒ - (2arRs sinยฒฮธ/ฯยฒ)c dt dฯ† + (ฯยฒ/ฮ”)drยฒ + ฯยฒdฮธยฒ + (rยฒ+aยฒ+aยฒrRs sinยฒฮธ/ฯยฒ)sinยฒฮธ dฯ†ยฒ
ฯยฒ = rยฒ + aยฒcosยฒฮธ ฮ” = rยฒ - rRs + aยฒ a = J/(Mc) [๋น„๊ฐ์šด๋™๋Ÿ‰, ์Šคํ•€ ํŒŒ๋ผ๋ฏธํ„ฐ]

์—ฌ๊ธฐ์„œ a๊ฐ€ ๋ธ”๋ž™ํ™€์˜ ์Šคํ•€์„ ๋‚˜ํƒ€๋‚ด. a=0์ด๋ฉด ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ, a=M์ด๋ฉด ์ตœ๋Œ€ ์Šคํ•€ ์ปค ๋ธ”๋ž™ํ™€์ด์•ผ. ์ € dtdฯ† ๊ต์ฐจํ•ญ์ด ๋ฐ”๋กœ ์ขŒํ‘œ๊ณ„ ๋Œ๋ฆผ(Frame Dragging) ํšจ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฑฐ์•ผ โ€” ๋ธ”๋ž™ํ™€์ด ์ฃผ๋ณ€ ์‹œ๊ณต๊ฐ„์„ ๊ฐ™์ด ๋Œ๊ณ  ๋Œ์•„๊ฐ€๋Š” ํ˜„์ƒ!

โš ๏ธ ์ฃผ์˜: ์ปค ๊ณ„๋Ÿ‰์„ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์— ๊ตฌํ˜„ํ•  ๋•Œ ์ˆ˜์น˜ ์•ˆ์ •์„ฑ์ด ์ค‘์š”ํ•ด. ฮ”=0์ด ๋˜๋Š” ์ง€์ (์ด๋ฒคํŠธ ํ˜ธ๋ผ์ด์ฆŒ)์—์„œ ํŠน์ด์ ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ขŒํ‘œ๊ณ„๋ฅผ Boyer-Lindquist ์ขŒํ‘œ์—์„œ Kerr-Schild ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„.

๐Ÿ“ก 2. ์ธก์ง€์„  ๋ฐฉ์ •์‹ โ€” ๋น›์ด ๊ฐ€๋Š” ๊ธธ์„ ๊ณ„์‚ฐํ•˜๋‹ค

๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ํ•ต์‹ฌ์€ "๋น›์ด ๋ธ”๋ž™ํ™€ ์ฃผ๋ณ€์—์„œ ์–ด๋–ป๊ฒŒ ํœ˜์–ด๊ฐ€๋Š”๊ฐ€"๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฑฐ์•ผ. ์ผ๋ฐ˜์ƒ๋Œ€์„ฑ์ด๋ก ์—์„œ ๋น›์€ ์ธก์ง€์„ (Geodesic)์„ ๋”ฐ๋ผ ์ด๋™ํ•ด โ€” ํœ˜์–ด์ง„ ์‹œ๊ณต๊ฐ„์—์„œ์˜ "์ตœ๋‹จ ๊ฒฝ๋กœ"์•ผ.

โšก ์ธก์ง€์„  ๋ฐฉ์ •์‹ (Geodesic Equation)

dยฒxแต˜/dฮปยฒ + ฮ“แต˜_ฮฑฮฒ (dxแต…/dฮป)(dx^ฮฒ/dฮป) = 0
ฮ“แต˜_ฮฑฮฒ : ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ (Christoffel Symbol) ฮป : ์•„ํ•€ ๋งค๊ฐœ๋ณ€์ˆ˜ (๋น›์˜ ๊ฒฝ์šฐ ๊ณ ์œ ์‹œ๊ฐ„ ๋Œ€์‹  ์‚ฌ์šฉ) xแต˜ : ์‹œ๊ณต๊ฐ„ ์ขŒํ‘œ (t, r, ฮธ, ฯ†)

๋ฌด์„œ์›Œ ๋ณด์ด์ง€๋งŒ ์‚ฌ์‹ค ์ด๊ฑด "๊ฐ€์†๋„ = ์‹œ๊ณต๊ฐ„ ๊ณก๋ฅ  ร— ์†๋„ยฒ" ํ˜•ํƒœ์•ผ. ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ ฮ“๊ฐ€ ์‹œ๊ณต๊ฐ„์ด ์–ผ๋งˆ๋‚˜ ํœ˜์–ด์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , ๊ทธ๊ฒŒ ๋น›์˜ ๊ฒฝ๋กœ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฑฐ์•ผ.

๐Ÿ”ข ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ์‹œ๊ณต๊ฐ„์—์„œ์˜ ๋น› ๊ฒฝ๋กœ ๋ฐฉ์ •์‹

์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๋ธ”๋ž™ํ™€์—์„œ ๋น›์˜ ๊ฒฝ๋กœ๋Š” ๋Œ€์นญ์„ฑ ๋•๋ถ„์— ํ›จ์”ฌ ๋‹จ์ˆœํ•ด์ ธ. ์ ๋„๋ฉด(ฮธ=ฯ€/2)์—์„œ์˜ ๋น› ๊ฒฝ๋กœ๋Š” ์ด๋ ‡๊ฒŒ ํ‘œํ˜„๋ผ:

(dr/dฮป)ยฒ = Eยฒ - (1 - Rs/r)(Lยฒ/rยฒ)
dฯ†/dฮป = L/rยฒ dt/dฮป = E/(1 - Rs/r)
E : ์—๋„ˆ์ง€ ๋ณด์กด๋Ÿ‰ (๋‹จ์œ„ ์งˆ๋Ÿ‰๋‹น) L : ๊ฐ์šด๋™๋Ÿ‰ ๋ณด์กด๋Ÿ‰ (๋‹จ์œ„ ์งˆ๋Ÿ‰๋‹น) b = L/E : ์ถฉ๊ฒฉ ๋งค๊ฐœ๋ณ€์ˆ˜ (Impact Parameter)

์—ฌ๊ธฐ์„œ ์ถฉ๊ฒฉ ๋งค๊ฐœ๋ณ€์ˆ˜ b๊ฐ€ ์—„์ฒญ ์ค‘์š”ํ•ด. b๊ฐ€ ์ž„๊ณ„๊ฐ’ b_c = 3โˆš3/2 ร— Rs ๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋น›์ด ๋ธ”๋ž™ํ™€๋กœ ๋นจ๋ ค๋“ค์–ด๊ฐ€๊ณ , ํฌ๋ฉด ํœ˜์–ด์„œ ํƒˆ์ถœํ•ด. ์ด ์ž„๊ณ„๊ฐ’์ด ๋ฐ”๋กœ ๊ด‘์ž๊ตฌ(Photon Sphere)๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฑฐ์•ผ!

๐Ÿ“Š ์ถฉ๊ฒฉ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ฅธ ๋น›์˜ ์šด๋ช… b < b_c (โ‰ˆ 2.6 Rs) โ†’ ๋ธ”๋ž™ํ™€์— ํฌํš๋จ ๐ŸŒ‘
b = b_c โ†’ ๊ด‘์ž๊ตฌ์—์„œ ์˜์›ํžˆ ๊ณต์ „ (๋ถˆ์•ˆ์ • ๊ถค๋„) ๐Ÿ”„
b > b_c โ†’ ํœ˜์–ด์„œ ํƒˆ์ถœ (์ค‘๋ ฅ ๋ Œ์ฆˆ ํšจ๊ณผ) ๐ŸŒŸ

๐Ÿงฎ ์ˆ˜์น˜ ์ ๋ถ„ โ€” ์‹ค์ œ ์ฝ”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ๊ณ„์‚ฐํ•˜๋‚˜?

์ธก์ง€์„  ๋ฐฉ์ •์‹์„ ํ•ด์„์ ์œผ๋กœ ํ’€๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ(ํŠนํžˆ ์ปค ๋ธ”๋ž™ํ™€)์—๋Š” ์ˆ˜์น˜ ์ ๋ถ„(Numerical Integration)์„ ์จ. ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” ๋ฐฉ๋ฒ•์ด ๋ฃฝ๊ฒŒ-์ฟ ํƒ€ 4์ฐจ ๋ฐฉ๋ฒ•(RK4)์ด์•ผ:


# Python ์Šคํƒ€์ผ ์˜์‚ฌ์ฝ”๋“œ โ€” RK4๋กœ ์ธก์ง€์„  ๊ณ„์‚ฐ
def geodesic_rk4(state, dlambda, metric_params):
    """
    state = [t, r, theta, phi, dt/dl, dr/dl, dtheta/dl, dphi/dl]
    """
    k1 = geodesic_derivatives(state, metric_params)
    k2 = geodesic_derivatives(state + 0.5*dlambda*k1, metric_params)
    k3 = geodesic_derivatives(state + 0.5*dlambda*k2, metric_params)
    k4 = geodesic_derivatives(state + dlambda*k3, metric_params)
    
    return state + (dlambda/6.0) * (k1 + 2*k2 + 2*k3 + k4)

def geodesic_derivatives(state, params):
    r, theta = state[1], state[2]
    Rs = params['schwarzschild_radius']
    
    # ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ ๊ณ„์‚ฐ
    Gamma = compute_christoffel(r, theta, Rs)
    
    # dยฒxแต˜/dฮปยฒ = -ฮ“แต˜_ฮฑฮฒ (dxแต…/dฮป)(dx^ฮฒ/dฮป)
    acceleration = -sum_christoffel_terms(Gamma, state[4:])
    return concatenate(state[4:], acceleration)
๐Ÿ’ก ์„ฑ๋Šฅ ํŒ: ์ ๋ถ„ ์Šคํ… ํฌ๊ธฐ(dlambda)๋ฅผ ๊ณ ์ •ํ•˜๋ฉด ๋ธ”๋ž™ํ™€ ๊ทผ์ฒ˜์—์„œ ์ •ํ™•๋„๊ฐ€ ๋–จ์–ด์ ธ. ์ ์‘ํ˜• ์Šคํ… ํฌ๊ธฐ(Adaptive Step Size)๋ฅผ ์“ฐ๋ฉด r์ด Rs์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ์Šคํ…์„ ์ค„์—ฌ์„œ ์ •ํ™•๋„๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์–ด. Dormand-Prince ๋ฐฉ๋ฒ•(RK45)์ด ์ด๊ฑธ ์ž๋™์œผ๋กœ ํ•ด์ค˜.

์—ญ๋ฐฉํ–ฅ ๊ด‘์„  ์ถ”์  (Backward Ray Tracing) ์›๋ฆฌ ์นด๋ฉ”๋ผ (๊ด€์ธก์ž) ํ”ฝ์…€ โ†’ ๊ด‘์„  ๋ธ”๋ž™ํ™€ ํฌํš ๊ด‘์„  (b < bc) ๊ฐ•ํ•˜๊ฒŒ ํœ˜์–ด ํƒˆ์ถœ ๋ฐฐ๊ฒฝ ๋ณ„ ๋ฐฐ๊ฒฝ ๋ณ„ โ† ์—ญ๋ฐฉํ–ฅ: ์นด๋ฉ”๋ผ์—์„œ ๊ด‘์„ ์„ ์ด์„œ ๊ด‘์›์„ ์—ญ์ถ”์ 

๐ŸŽจ 3. ๊ด‘์„  ์ถ”์  (Ray Tracing) โ€” ํ”ฝ์…€ ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ๋ฌผ๋ฆฌ ๊ณ„์‚ฐ

๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ๋ Œ๋”๋ง ํ•ต์‹ฌ์€ ์—ญ๋ฐฉํ–ฅ ๊ด‘์„  ์ถ”์ (Backward Ray Tracing)์ด์•ผ. ์™œ "์—ญ๋ฐฉํ–ฅ"์ด๋ƒ๊ณ ? ๊ด‘์›์—์„œ ์นด๋ฉ”๋ผ๋กœ ์˜ค๋Š” ๋น›์„ ์ถ”์ ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๊ด‘์„ ์ด ์นด๋ฉ”๋ผ์— ์•ˆ ๋‹ฟ์•„์„œ ๋น„ํšจ์œจ์ ์ด๊ฑฐ๋“ . ๊ทธ๋ž˜์„œ ์นด๋ฉ”๋ผ ํ”ฝ์…€์—์„œ ๊ด‘์„ ์„ ์ด์„œ ์–ด๋””์„œ ์™”๋Š”์ง€ ์—ญ์ถ”์ ํ•˜๋Š” ๊ฑฐ์•ผ!

๐Ÿ–ฅ๏ธ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ

1
ํ”ฝ์…€ โ†’ ๊ด‘์„  ๋ฐฉํ–ฅ ๋ณ€ํ™˜
ํ™”๋ฉด์˜ ๊ฐ ํ”ฝ์…€ ์ขŒํ‘œ๋ฅผ ์นด๋ฉ”๋ผ ์‹œ์•ผ๊ฐ(FOV)์— ๋งž์ถฐ 3D ๋ฐฉํ–ฅ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜. ์ด๋•Œ ์นด๋ฉ”๋ผ์˜ ์œ„์น˜์™€ ๋ธ”๋ž™ํ™€๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ ๋ คํ•ด์„œ ์ดˆ๊ธฐ ์กฐ๊ฑด ์„ค์ •.
2
์ธก์ง€์„  ์ˆ˜์น˜ ์ ๋ถ„
๊ฐ ๊ด‘์„ ์— ๋Œ€ํ•ด RK4 ๋“ฑ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์ธก์ง€์„  ๋ฐฉ์ •์‹์„ ์ ๋ถ„. ๊ด‘์„ ์ด ๋ธ”๋ž™ํ™€์— ํฌํš๋˜๊ฑฐ๋‚˜, ์ถฉ๋ถ„ํžˆ ๋ฉ€๋ฆฌ ํƒˆ์ถœํ•˜๊ฑฐ๋‚˜, ๊ฐ•์ฐฉ์›๋ฐ˜์— ๋‹ฟ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต.
3
์ข…๋ฃŒ ์กฐ๊ฑด ํŒ๋ณ„
r < Rs โ†’ ๋ธ”๋ž™ํ™€ ํฌํš (๊ฒ€์ • ํ”ฝ์…€)
r > r_max โ†’ ๋ฐฐ๊ฒฝ ํ•˜๋Š˜ ์ƒ˜ํ”Œ๋ง
๊ฐ•์ฐฉ์›๋ฐ˜ ๊ต์ฐจ โ†’ ์›๋ฐ˜ ์ƒ‰์ƒ ๊ณ„์‚ฐ
4
์ƒ‰์ƒ ๊ฒฐ์ • ๋ฐ ๋ฌผ๋ฆฌ ํšจ๊ณผ ์ ์šฉ
๋„ํ”Œ๋Ÿฌ ํŽธ์ด, ์ค‘๋ ฅ ์ ์ƒ‰ํŽธ์ด, ๋น” ์ง‘์ค‘(Beaming) ํšจ๊ณผ๋ฅผ ์ ์šฉํ•ด์„œ ์ตœ์ข… ํ”ฝ์…€ ์ƒ‰์ƒ ๊ฒฐ์ •.
5
ํ›„์ฒ˜๋ฆฌ (Post-processing)
HDR ํ†ค ๋งคํ•‘, ๊ธ€๋กœ์šฐ ํšจ๊ณผ, ์ƒ‰์ˆ˜์ฐจ ๋“ฑ์„ ์ ์šฉํ•ด์„œ ์ตœ์ข… ์ด๋ฏธ์ง€ ์™„์„ฑ.

โš™๏ธ ์‹ค์ œ ๊ตฌํ˜„ ์ฝ”๋“œ ๊ตฌ์กฐ


# ๋ธ”๋ž™ํ™€ ๊ด‘์„  ์ถ”์ ๊ธฐ ํ•ต์‹ฌ ๊ตฌ์กฐ (Python/NumPy ์Šคํƒ€์ผ)

class BlackHoleRayTracer:
    def __init__(self, mass, spin=0.0, camera_distance=50.0):
        self.Rs = 2 * mass          # ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๋ฐ˜์ง€๋ฆ„ (์ž์—ฐ๋‹จ์œ„)
        self.a = spin               # ์Šคํ•€ ํŒŒ๋ผ๋ฏธํ„ฐ (0 ~ mass)
        self.cam_r = camera_distance
        
    def render_pixel(self, pixel_x, pixel_y, image_width, image_height):
        # 1. ํ”ฝ์…€ โ†’ ๊ด‘์„  ์ดˆ๊ธฐ ์กฐ๊ฑด
        ray = self.pixel_to_ray(pixel_x, pixel_y, image_width, image_height)
        
        # 2. ์ธก์ง€์„  ์ถ”์ 
        result = self.trace_geodesic(ray)
        
        # 3. ์ƒ‰์ƒ ๊ฒฐ์ •
        color = self.compute_color(result)
        return color
    
    def trace_geodesic(self, ray_state, max_steps=10000):
        state = ray_state.copy()
        dlambda = -0.1  # ์—ญ๋ฐฉํ–ฅ ์ถ”์  (์Œ์ˆ˜)
        
        for step in range(max_steps):
            r = state[1]
            
            # ์ข…๋ฃŒ ์กฐ๊ฑด ์ฒดํฌ
            if r < 1.05 * self.Rs:
                return {'type': 'captured', 'state': state}
            if r > 500 * self.Rs:
                return {'type': 'escaped', 'state': state}
            if self.hits_accretion_disk(state):
                return {'type': 'disk', 'state': state}
            
            # ์ ์‘ํ˜• ์Šคํ… ํฌ๊ธฐ (๋ธ”๋ž™ํ™€ ๊ทผ์ฒ˜์—์„œ ๋” ์ž‘๊ฒŒ)
            dlambda = self.adaptive_step(r, dlambda)
            
            # RK4 ์ ๋ถ„
            state = self.rk4_step(state, dlambda)
        
        return {'type': 'max_steps', 'state': state}
    
    def adaptive_step(self, r, dlambda_base):
        # ๋ธ”๋ž™ํ™€์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ์Šคํ… ํฌ๊ธฐ ์ค„์ž„
        proximity = r / self.Rs
        return dlambda_base * min(1.0, (proximity - 1.0) / 5.0)
๐Ÿš€ GPU ๋ณ‘๋ ฌํ™”์˜ ์œ„๋ ฅ: 1920ร—1080 ํ•ด์ƒ๋„๋ฉด ์•ฝ 200๋งŒ ํ”ฝ์…€์ด์•ผ. ๊ฐ ํ”ฝ์…€๋งˆ๋‹ค ์ˆ˜์ฒœ ๋ฒˆ์˜ ์ˆ˜์น˜ ์ ๋ถ„์ด ํ•„์š”ํ•˜๋‹ˆ๊นŒ CPU๋กœ๋Š” ํ•œ ํ”„๋ ˆ์ž„์— ๋ช‡ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์–ด. ๊ทธ๋ž˜์„œ ์‹ค์ œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” CUDA๋‚˜ OpenCL๋กœ GPU์—์„œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•ด. ๊ฐ ํ”ฝ์…€์ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ณ„์‚ฐ๋˜๋‹ˆ๊นŒ GPU ๋ณ‘๋ ฌํ™”์— ์™„๋ฒฝํ•˜๊ฒŒ ๋งž์•„!

๐Ÿ”ฎ 4. ์ค‘๋ ฅ ๋ Œ์ฆˆ ํšจ๊ณผ โ€” ๋น›์ด ํœ˜์–ด์ง€๋Š” ๋งˆ๋ฒ•

๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๊ฐ€์žฅ ์‹œ๊ฐ์ ์œผ๋กœ ์ž„ํŒฉํŠธ ์žˆ๋Š” ๋ถ€๋ถ„์ด ๋ฐ”๋กœ ์ค‘๋ ฅ ๋ Œ์ฆˆ(Gravitational Lensing)์•ผ. ๋ธ”๋ž™ํ™€ ๋’ค์— ์žˆ๋Š” ๋ณ„์ด ๋ธ”๋ž™ํ™€ ์ฃผ๋ณ€์— ๋ง ํ˜•ํƒœ๋กœ ๋ณด์ด๋Š” ํ˜„์ƒ โ€” ์ด๊ฒŒ ์•„์ธ์Šˆํƒ€์ธ ๋ง(Einstein Ring)์ด์•ผ!

๐Ÿ’ซ ์•„์ธ์Šˆํƒ€์ธ ๋ง ๋ฐ˜์ง€๋ฆ„

ฮธ_E = โˆš(4GM ร— D_LS / (cยฒ ร— D_L ร— D_S))
D_L : ๊ด€์ธก์ž โ†’ ๋ Œ์ฆˆ(๋ธ”๋ž™ํ™€) ๊ฑฐ๋ฆฌ D_S : ๊ด€์ธก์ž โ†’ ๊ด‘์›(๋ณ„) ๊ฑฐ๋ฆฌ D_LS : ๋ Œ์ฆˆ(๋ธ”๋ž™ํ™€) โ†’ ๊ด‘์›(๋ณ„) ๊ฑฐ๋ฆฌ

์ด ๊ณต์‹์€ ์•ฝํ•œ ์ค‘๋ ฅ ๋ Œ์ฆˆ ๊ทผ์‚ฌ์•ผ. ๋ธ”๋ž™ํ™€์ฒ˜๋Ÿผ ๊ฐ•ํ•œ ์ค‘๋ ฅ์žฅ์—์„œ๋Š” ๊ฐ•ํ•œ ์ค‘๋ ฅ ๋ Œ์ฆˆ(Strong Gravitational Lensing) ํšจ๊ณผ๋ฅผ ์จ์•ผ ํ•ด. ์ด๋•Œ๋Š” ๋น›์ด ๋ธ”๋ž™ํ™€์„ ์—ฌ๋Ÿฌ ๋ฐ”ํ€ด ๋Œ๊ณ  ๋‚˜์˜ค๋Š” ๊ณ ์ฐจ ์ด๋ฏธ์ง€(Higher-order Images)๋„ ์ƒ๊ฒจ!

๐ŸŒˆ ๋„ํ”Œ๋Ÿฌ ํšจ๊ณผ์™€ ๋น” ์ง‘์ค‘ (Relativistic Beaming)

๊ฐ•์ฐฉ์›๋ฐ˜์ด ํšŒ์ „ํ•˜๋ฉด์„œ ๊ด€์ธก์ž ์ชฝ์œผ๋กœ ๋‹ค๊ฐ€์˜ค๋Š” ๋ถ€๋ถ„์€ ๋ฐ์•„์ง€๊ณ (์ฒญ์ƒ‰ํŽธ์ด), ๋ฉ€์–ด์ง€๋Š” ๋ถ€๋ถ„์€ ์–ด๋‘์›Œ์ ธ(์ ์ƒ‰ํŽธ์ด). ์ด๊ฒŒ ์ƒ๋Œ€๋ก ์  ๋„ํ”Œ๋Ÿฌ ํšจ๊ณผ์•ผ. ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์ด๊ฑธ ๊ตฌํ˜„ํ•˜๋Š” ๊ณต์‹:

๊ด€์ธก ์ฃผํŒŒ์ˆ˜: ฮฝ_obs = ฮฝ_emit ร— (1 + z)โปยน
์ ์ƒ‰ํŽธ์ด ์ธ์ž: 1 + z = (g_tt + 2g_tฯ† ฮฉ + g_ฯ†ฯ† ฮฉยฒ)^(1/2) / (1 + bยทฮฉ)
ฮฉ : ์›๋ฐ˜์˜ ๊ฐ์†๋„ b : ์ถฉ๊ฒฉ ๋งค๊ฐœ๋ณ€์ˆ˜

๊ทธ๋ฆฌ๊ณ  ๋น” ์ง‘์ค‘(Beaming) ํšจ๊ณผ๋กœ ์ธํ•ด ๊ด€์ธก๋˜๋Š” ๋ฐ๊ธฐ๋Š”:

I_obs = I_emit ร— (ฮฝ_obs/ฮฝ_emit)โด

์ด 4์ œ๊ณฑ ์ธ์ž๊ฐ€ ์—„์ฒญ ์ค‘์š”ํ•ด! ๊ฐ•์ฐฉ์›๋ฐ˜์—์„œ ๊ด€์ธก์ž ์ชฝ์œผ๋กœ ์˜ค๋Š” ๋ถ€๋ถ„์ด ๋ฐ˜๋Œ€์ชฝ๋ณด๋‹ค ํ›จ์”ฌ ๋ฐ๊ฒŒ ๋ณด์ด๋Š” ์ด์œ ๊ฐ€ ๋ฐ”๋กœ ์ด๊ฑฐ์•ผ. ์ธํ„ฐ์Šคํ…”๋ผ์—์„œ ๊ฐ•์ฐฉ์›๋ฐ˜์ด ๋น„๋Œ€์นญ์ ์œผ๋กœ ๋ฐ๊ฒŒ ๋ณด์ด๋Š” ๊ฒƒ๋„ ์ด ํšจ๊ณผ ๋•Œ๋ฌธ์ด์•ผ! ๐ŸŒŸ

๐ŸŽฌ ์ธํ„ฐ์Šคํ…”๋ผ ๊ฐ€๋ฅด๊ฐ•ํŠ€์•„์˜ ๋น„๋ฐ€ ํ‚ต ์†(Kip Thorne) ๊ต์ˆ˜๊ฐ€ ์‹ค์ œ ๋ฌผ๋ฆฌ ๋ฐฉ์ •์‹์„ ์จ์„œ ๋งŒ๋“  ๊ฐ€๋ฅด๊ฐ•ํŠ€์•„ ๋ Œ๋”๋ง์€ ์ฒ˜์Œ์— ๋ฌผ๋ฆฌํ•™์ ์œผ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ๊ณ„์‚ฐํ–ˆ๋”๋‹ˆ ๊ฐ•์ฐฉ์›๋ฐ˜์ด ์œ„์•„๋ž˜๋กœ ๋ณด์—ฌ์•ผ ํ–ˆ์–ด. ๋ธ”๋ž™ํ™€ ๋’ค์ชฝ์˜ ์›๋ฐ˜ ๋น›์ด ์ค‘๋ ฅ ๋ Œ์ฆˆ๋กœ ํœ˜์–ด์„œ ์œ„์•„๋ž˜์— ๋‚˜ํƒ€๋‚˜๋Š” ๊ฑฐ์•ผ. ๊ทธ๋Ÿฐ๋ฐ ๊ฐ๋… ํฌ๋ฆฌ์Šคํ† ํผ ๋†€๋ž€์ด "๊ด€๊ฐ์ด ์ดํ•ด ๋ชป ํ•œ๋‹ค"๊ณ  ํ•ด์„œ ์‹œ๊ฐ์ ์œผ๋กœ ์กฐ๊ธˆ ์ˆ˜์ •ํ–ˆ๋‹ค๋Š” ํ›„์ผ๋‹ด์ด ์žˆ์–ด. ๐Ÿ˜„

๐Ÿ”ฅ 5. ๊ฐ•์ฐฉ์›๋ฐ˜ ๋ฌผ๋ฆฌ ๋ชจ๋ธ โ€” ๋ธ”๋ž™ํ™€์˜ ๋น›๋‚˜๋Š” ๊ณ ๋ฆฌ

๋ธ”๋ž™ํ™€ ์ž์ฒด๋Š” ๊ฒ€์ •์ด์ง€๋งŒ, ์ฃผ๋ณ€์˜ ๊ฐ•์ฐฉ์›๋ฐ˜(Accretion Disk)์ด ์—„์ฒญ๋‚œ ๋น›์„ ๋‚ด. ๋ฌผ์งˆ์ด ๋ธ”๋ž™ํ™€๋กœ ๋–จ์–ด์ง€๋ฉด์„œ ๋งˆ์ฐฐ๋กœ ๊ฐ€์—ด๋˜์–ด ์ˆ˜๋ฐฑ๋งŒ ๋„๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๊ฑฐ๋“ . ์ด๊ฑธ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•˜๋ƒ๊ณ ?

๐ŸŒก๏ธ ์›๋ฐ˜ ์˜จ๋„ ๋ถ„ํฌ ๋ชจ๋ธ

๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” ๋ชจ๋ธ์ด ๋…ธ๋น„์ฝ”ํ”„-์† ๋ชจ๋ธ(Novikov-Thorne Model)์ด์•ผ. ์›๋ฐ˜์˜ ๊ฐ ๋ฐ˜์ง€๋ฆ„์—์„œ์˜ ์˜จ๋„๋ฅผ ์ด๋ ‡๊ฒŒ ๊ณ„์‚ฐํ•ด:

T(r) = T_max ร— (r/r_ISCO)^(-3/4) ร— f(r)^(1/4)
f(r) = 1 - โˆš(r_ISCO/r) [๊ฒฝ๊ณ„ ์กฐ๊ฑด ํ•จ์ˆ˜] r_ISCO : ์ตœ๋‚ด๊ฐ ์•ˆ์ • ์›ํ˜• ๊ถค๋„ ๋ฐ˜์ง€๋ฆ„ = 6GM/cยฒ (์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๋ธ”๋ž™ํ™€) = 1.24GM/cยฒ (์ตœ๋Œ€ ์Šคํ•€ ์ปค ๋ธ”๋ž™ํ™€)

ISCO(Innermost Stable Circular Orbit)๋Š” ์›๋ฐ˜์˜ ๋‚ด๋ถ€ ๊ฒฝ๊ณ„์•ผ. ์ด ์•ˆ์ชฝ์œผ๋กœ๋Š” ์•ˆ์ •์ ์ธ ์›ํ˜• ๊ถค๋„๊ฐ€ ์—†์–ด์„œ ๋ฌผ์งˆ์ด ๋ธ”๋ž™ํ™€๋กœ ๋น ๋ฅด๊ฒŒ ๋–จ์–ด์ ธ. ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๋ธ”๋ž™ํ™€์—์„œ๋Š” Rs์˜ 3๋ฐฐ, ์ตœ๋Œ€ ์Šคํ•€ ์ปค ๋ธ”๋ž™ํ™€์—์„œ๋Š” Rs์˜ ์•ฝ 0.62๋ฐฐ์•ผ.

๐ŸŽจ ํ‘์ฒด ๋ณต์‚ฌ โ†’ ํ”ฝ์…€ ์ƒ‰์ƒ ๋ณ€ํ™˜

์˜จ๋„๋ฅผ ์•Œ๋ฉด ํ”Œ๋ž‘ํฌ ํ‘์ฒด ๋ณต์‚ฌ ๋ฒ•์น™์œผ๋กœ ์ŠคํŽ™ํŠธ๋Ÿผ์„ ๊ณ„์‚ฐํ•˜๊ณ , ์ด๊ฑธ RGB ์ƒ‰์ƒ์œผ๋กœ ๋ณ€ํ™˜ํ•ด:


def temperature_to_rgb(T_kelvin):
    """
    ํ‘์ฒด ๋ณต์‚ฌ ์˜จ๋„๋ฅผ RGB ์ƒ‰์ƒ์œผ๋กœ ๋ณ€ํ™˜
    (CIE ์ƒ‰ ์ผ์น˜ ํ•จ์ˆ˜ ์‚ฌ์šฉ)
    """
    # ํ”Œ๋ž‘ํฌ ํ•จ์ˆ˜๋กœ ์ŠคํŽ™ํŠธ๋Ÿผ ๊ณ„์‚ฐ
    wavelengths = np.linspace(380e-9, 780e-9, 400)  # ๊ฐ€์‹œ๊ด‘์„  ๋ฒ”์œ„
    h = 6.626e-34  # ํ”Œ๋ž‘ํฌ ์ƒ์ˆ˜
    c = 3e8        # ๋น›์˜ ์†๋„
    k = 1.38e-23   # ๋ณผ์ธ ๋งŒ ์ƒ์ˆ˜
    
    # B(ฮป, T) = 2hcยฒ/ฮปโต ร— 1/(exp(hc/ฮปkT) - 1)
    spectrum = (2 * h * c**2 / wavelengths**5) / \
               (np.exp(h*c / (wavelengths * k * T_kelvin)) - 1)
    
    # CIE XYZ ์ƒ‰ ์ผ์น˜ ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜
    XYZ = spectrum_to_XYZ(spectrum, wavelengths)
    
    # XYZ โ†’ sRGB ๋ณ€ํ™˜ (๊ฐ๋งˆ ๋ณด์ • ํฌํ•จ)
    RGB = XYZ_to_sRGB(XYZ)
    return np.clip(RGB, 0, 1)

# ๊ฐ•์ฐฉ์›๋ฐ˜ ์ƒ‰์ƒ ์˜ˆ์‹œ:
# T = 10,000K  โ†’ ํŒŒ๋ž€๋น› ํฐ์ƒ‰
# T = 5,000K   โ†’ ๋…ธ๋ž€๋น› ํฐ์ƒ‰  
# T = 3,000K   โ†’ ์ฃผํ™ฉ๋น›
# T = 1,000K   โ†’ ๋ถ‰์€๋น› (์›๋ฐ˜ ์™ธ๊ณฝ)

๐Ÿ’จ ์›๋ฐ˜ ๋ฐ€๋„ ๋ฐ ๋ถˆํˆฌ๋ช…๋„ ๋ชจ๋ธ

๋” ์ •๊ตํ•œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ์›๋ฐ˜์˜ ๋ฐ€๋„ ๋ถ„ํฌ์™€ ๊ด‘ํ•™์  ๋‘๊ป˜(Optical Depth)๋„ ๊ณ ๋ คํ•ด. ์›๋ฐ˜์ด ์™„์ „ํžˆ ๋ถˆํˆฌ๋ช…ํ•˜๋ฉด ํ‘œ๋ฉด๋งŒ ๋ณด์ด๊ณ , ๋ฐ˜ํˆฌ๋ช…ํ•˜๋ฉด ๋‚ด๋ถ€ ๊ตฌ์กฐ๋„ ๋ณด์—ฌ. ์ด๊ฑธ ๋ฐฉ์‚ฌ ์ „๋‹ฌ ๋ฐฉ์ •์‹(Radiative Transfer Equation)์œผ๋กœ ๊ณ„์‚ฐํ•ด:

dI_ฮฝ/ds = -ฮบ_ฮฝ ฯ I_ฮฝ + j_ฮฝ ฯ
I_ฮฝ : ํŠน์ • ์ฃผํŒŒ์ˆ˜์—์„œ์˜ ๋ณต์‚ฌ ๊ฐ•๋„ ฮบ_ฮฝ : ํก์ˆ˜ ๊ณ„์ˆ˜ j_ฮฝ : ๋ฐฉ์ถœ ๊ณ„์ˆ˜ ฯ : ๋ฐ€๋„ s : ๊ด‘์„  ๊ฒฝ๋กœ ๊ธธ์ด
๐Ÿ’ก ์‹ค์šฉ์  ํŒ: ์‹ค์‹œ๊ฐ„ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋Š” ๋ฐฉ์‚ฌ ์ „๋‹ฌ ๋ฐฉ์ •์‹์„ ์™„์ „ํžˆ ํ’€๊ธฐ ์–ด๋ ค์›Œ. ๋Œ€์‹  ์›๋ฐ˜์„ ์–‡์€ ๋””์Šคํฌ(Thin Disk) ๊ทผ์‚ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ด‘์„ ์ด ์›๋ฐ˜ ํ‰๋ฉด์„ ๊ต์ฐจํ•  ๋•Œ๋งŒ ์ƒ‰์ƒ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์„ ๋งŽ์ด ์จ. ์ •ํ™•๋„๋Š” ์•ฝ๊ฐ„ ๋–จ์–ด์ง€์ง€๋งŒ ์†๋„๊ฐ€ ํ›จ์”ฌ ๋นจ๋ผ!

๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๋ฌผ๋ฆฌ ๋ชจ๋ธ ๊ณ„์ธต ๊ตฌ์กฐ ๐ŸŒŒ ์ผ๋ฐ˜์ƒ๋Œ€์„ฑ์ด๋ก  (General Relativity) ์•„์ธ์Šˆํƒ€์ธ ์žฅ ๋ฐฉ์ •์‹ | ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ/์ปค ๊ณ„๋Ÿ‰ | ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ ๐Ÿ“ก ์ธก์ง€์„  ๋ฐฉ์ •์‹ (Geodesic Equations) ๋น›์˜ ๊ฒฝ๋กœ ๊ณ„์‚ฐ | ์ถฉ๊ฒฉ ๋งค๊ฐœ๋ณ€์ˆ˜ | RK4/RK45 ์ˆ˜์น˜ ์ ๋ถ„ ๐ŸŽจ ๊ด‘์„  ์ถ”์  & ๋ Œ๋”๋ง (Ray Tracing) ์—ญ๋ฐฉํ–ฅ ๊ด‘์„  ์ถ”์  | ์ค‘๋ ฅ ๋ Œ์ฆˆ | ๋„ํ”Œ๋Ÿฌ/๋น” ์ง‘์ค‘ ํšจ๊ณผ ๐Ÿ”ฅ ๊ฐ•์ฐฉ์›๋ฐ˜ & ์‹œ๊ฐํ™” (Accretion Disk Model) ๋…ธ๋น„์ฝ”ํ”„-์† ๋ชจ๋ธ | ํ‘์ฒด ๋ณต์‚ฌ | ๋ฐฉ์‚ฌ ์ „๋‹ฌ | GPU ๋ณ‘๋ ฌํ™” ์ด๋ก  ๊ตฌํ˜„ ๊ฐ ๋ ˆ์ด์–ด๋Š” ์ƒ์œ„ ๋ ˆ์ด์–ด์˜ ๊ฒฐ๊ณผ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ ์ฒ˜๋ฆฌ

โšก 6. ์‹ค์ œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๊ตฌํ˜„ โ€” ์ตœ์ ํ™”์™€ ์‹ค์šฉ์  ํŒ

์ด๋ก ์€ ์•Œ๊ฒ ๋Š”๋ฐ, ์‹ค์ œ๋กœ ๋งŒ๋“ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? ๐Ÿค” ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” ์ง„์งœ ๊ฐœ๋ฐœ์ž ๊ด€์ ์—์„œ ์–˜๊ธฐํ•ด๋ณผ๊ฒŒ.

๐ŸŽ๏ธ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋žต

์ตœ์ ํ™” ๊ธฐ๋ฒ• ํšจ๊ณผ ๊ตฌํ˜„ ๋‚œ์ด๋„
GPU ๋ณ‘๋ ฌํ™” (CUDA/OpenCL) 100~1000๋ฐฐ ์†๋„ ํ–ฅ์ƒ โญโญโญโญ
์ ์‘ํ˜• ์Šคํ… ํฌ๊ธฐ (RK45) ์ •ํ™•๋„ ์œ ์ง€ํ•˜๋ฉฐ ์Šคํ… ์ˆ˜ ๊ฐ์†Œ โญโญโญ
๋ฃฉ์—… ํ…Œ์ด๋ธ” (LUT) ๋ฐ˜๋ณต ๊ณ„์‚ฐ ์บ์‹ฑ์œผ๋กœ 2~5๋ฐฐ ํ–ฅ์ƒ โญโญ
๋Œ€์นญ์„ฑ ํ™œ์šฉ ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ์˜ ๊ตฌ๋ฉด ๋Œ€์นญ์œผ๋กœ ๊ณ„์‚ฐ๋Ÿ‰ ์ ˆ๋ฐ˜ โญโญ
ํ•ด๋ฐ€ํ† ๋‹ˆ์•ˆ ๋ฐฉ๋ฒ• ์—๋„ˆ์ง€ ๋ณด์กด ์ž๋™ ๋ณด์žฅ, ์žฅ๊ธฐ ์•ˆ์ •์„ฑ โญโญโญโญ
๋ฉ€ํ‹ฐ ํ•ด์ƒ๋„ ๋ Œ๋”๋ง ๋น ๋ฅธ ํ”„๋ฆฌ๋ทฐ ํ›„ ๊ณ ํ•ด์ƒ๋„ ๋ Œ๋”๋ง โญโญ

๐Ÿ”ง ํ•ด๋ฐ€ํ† ๋‹ˆ์•ˆ ๋ฐฉ๋ฒ• โ€” ๋” ์•ˆ์ •์ ์ธ ์ ๋ถ„

RK4 ๋Œ€์‹  ํ•ด๋ฐ€ํ† ๋‹ˆ์•ˆ ๋ฐฉ๋ฒ•(Hamiltonian Formulation)์„ ์“ฐ๋ฉด ์—๋„ˆ์ง€ ๋ณด์กด์ด ์ž๋™์œผ๋กœ ๋ณด์žฅ๋ผ. ์ธก์ง€์„  ๋ฐฉ์ •์‹์„ ํ•ด๋ฐ€ํ† ๋‹ˆ์•ˆ ํ˜•ํƒœ๋กœ ์“ฐ๋ฉด:

H = (1/2) g^ฮผฮฝ p_ฮผ p_ฮฝ = 0 (๋น›์˜ ๊ฒฝ์šฐ)
dxแต˜/dฮป = โˆ‚H/โˆ‚p_ฮผ dp_ฮผ/dฮป = -โˆ‚H/โˆ‚xแต˜
p_ฮผ : ๊ณต๋ณ€ 4-์šด๋™๋Ÿ‰ g^ฮผฮฝ : ์—ญ ๊ณ„๋Ÿ‰ ํ…์„œ

์ด ํ˜•ํƒœ๋กœ ์“ฐ๋ฉด ์‹ฌํ”Œ๋ ‰ํ‹ฑ ์ ๋ถ„๊ธฐ(Symplectic Integrator)๋ฅผ ์“ธ ์ˆ˜ ์žˆ์–ด. ์‹ฌํ”Œ๋ ‰ํ‹ฑ ์ ๋ถ„๊ธฐ๋Š” ์—๋„ˆ์ง€๋ฅผ ์žฅ๊ธฐ๊ฐ„ ๋ณด์กดํ•˜๋Š” ํŠน์„ฑ์ด ์žˆ์–ด์„œ ๊ธด ๊ถค๋„ ๊ณ„์‚ฐ์— ํ›จ์”ฌ ์œ ๋ฆฌํ•ด.

๐ŸŒ ์˜คํ”ˆ์†Œ์Šค ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋“ค

๐Ÿ“ฆ ์ฐธ๊ณ ํ•  ๋งŒํ•œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋“ค ๐Ÿ”ญ GYOTO โ€” ์ผ๋ฐ˜์ƒ๋Œ€๋ก ์  ๊ด‘์„  ์ถ”์  C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
๐ŸŒŒ BlackHoleViz โ€” Python ๊ธฐ๋ฐ˜ ๊ต์œก์šฉ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ
โšก GRay2 โ€” GPU ๊ฐ€์† ์ผ๋ฐ˜์ƒ๋Œ€๋ก ์  ๊ด‘์„  ์ถ”์ ๊ธฐ
๐ŸŽฌ BHOSS โ€” ๋ธ”๋ž™ํ™€ ๊ทธ๋ฆผ์ž ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ฝ”๋“œ
๐Ÿ”ฌ ipole โ€” EHT(์‚ฌ๊ฑด ์ง€ํ‰์„  ๋ง์›๊ฒฝ) ํŒ€์ด ์‚ฌ์šฉํ•œ ์ฝ”๋“œ

๐Ÿ“ธ EHT์˜ M87* ๋ธ”๋ž™ํ™€ ์ด๋ฏธ์ง€์™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ

2019๋…„ ์ธ๋ฅ˜ ์ตœ์ดˆ๋กœ ๋ธ”๋ž™ํ™€ ์‚ฌ์ง„์„ ์ฐ์€ ์‚ฌ๊ฑด ์ง€ํ‰์„  ๋ง์›๊ฒฝ(Event Horizon Telescope, EHT) ํŒ€๋„ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์—„์ฒญ ๋งŽ์ด ํ™œ์šฉํ–ˆ์–ด. ๊ด€์ธก ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์„ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜์ฒœ ๊ฐ€์ง€ ๋ธ”๋ž™ํ™€ ๋ชจ๋ธ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ณ  ๋น„๊ตํ–ˆ๊ฑฐ๋“ .

M87* ๋ธ”๋ž™ํ™€(์งˆ๋Ÿ‰ โ‰ˆ 65์–ต ํƒœ์–‘ ์งˆ๋Ÿ‰, ๊ฑฐ๋ฆฌ โ‰ˆ 5500๋งŒ ๊ด‘๋…„)์˜ ์ด๋ฏธ์ง€์—์„œ ๋ณด์ด๋Š” ๋ฐ์€ ๋ง๊ณผ ์–ด๋‘์šด ๊ทธ๋ฆผ์ž๊ฐ€ ๋ฐ”๋กœ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ ์˜ˆ์ธกํ•œ ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ–ˆ์–ด. ์ด๊ฒŒ ์ผ๋ฐ˜์ƒ๋Œ€์„ฑ์ด๋ก ์˜ ๊ฐ•๋ ฅํ•œ ๊ฒ€์ฆ์ด๊ธฐ๋„ ํ•ด! ๐ŸŽ‰

๐Ÿ”ฌ EHT ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํŒŒ์ดํ”„๋ผ์ธ: GRMHD ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (์ž๊ธฐ์œ ์ฒด์—ญํ•™) โ†’ ์ผ๋ฐ˜์ƒ๋Œ€๋ก ์  ๊ด‘์„  ์ถ”์  โ†’ ์ „ํŒŒ ๊ฐ„์„ญ๊ณ„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ โ†’ ์ด๋ฏธ์ง€ ์žฌ๊ตฌ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ โ†’ ๊ด€์ธก ๋ฐ์ดํ„ฐ์™€ ๋น„๊ต

๐Ÿงฌ 7. ๊ณ ๊ธ‰ ๋ฌผ๋ฆฌ ํšจ๊ณผ โ€” ๋” ํ˜„์‹ค์ ์ธ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์œ„ํ•ด

๐ŸŒŠ GRMHD โ€” ์ž๊ธฐ์œ ์ฒด์—ญํ•™๊นŒ์ง€ ํฌํ•จํ•œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

์ง„์งœ ์—ฐ๊ตฌ์šฉ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ๋‹จ์ˆœํ•œ ๊ด‘์„  ์ถ”์ ์„ ๋„˜์–ด์„œ ์ผ๋ฐ˜์ƒ๋Œ€๋ก ์  ์ž๊ธฐ์œ ์ฒด์—ญํ•™(GRMHD: General Relativistic Magnetohydrodynamics)๊นŒ์ง€ ํฌํ•จํ•ด. ๊ฐ•์ฐฉ์›๋ฐ˜์˜ ๋ฌผ์งˆ์ด ์ž๊ธฐ์žฅ๊ณผ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€, ์ œํŠธ(Jet)๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜•์„ฑ๋˜๋Š”์ง€๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฑฐ์•ผ.

โˆ‡_ฮผ (ฯ u^ฮผ) = 0 [์งˆ๋Ÿ‰ ๋ณด์กด] โˆ‡_ฮผ T^ฮผฮฝ = 0 [์—๋„ˆ์ง€-์šด๋™๋Ÿ‰ ๋ณด์กด] โˆ‡_ฮผ *F^ฮผฮฝ = 0 [๋งฅ์Šค์›ฐ ๋ฐฉ์ •์‹]
T^ฮผฮฝ = (ฯ + u + p + bยฒ)u^ฮผu^ฮฝ + (p + bยฒ/2)g^ฮผฮฝ - b^ฮผb^ฮฝ [์—๋„ˆ์ง€-์šด๋™๋Ÿ‰ ํ…์„œ (์œ ์ฒด + ์ž๊ธฐ์žฅ)]

์ด๋Ÿฐ GRMHD ์‹œ๋ฎฌ๋ ˆ์ด์…˜์€ HARM, KORAL, BHAC ๊ฐ™์€ ์ „๋ฌธ ์ฝ”๋“œ๋กœ ์ˆ˜ํผ์ปดํ“จํ„ฐ์—์„œ ๋Œ๋ ค. ํ•œ ๋ฒˆ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ์ˆ˜๋ฐฑ๋งŒ CPU ์‹œ๊ฐ„์ด ๋“ค๊ธฐ๋„ ํ•ด!

๐ŸŒก๏ธ ํ˜ธํ‚น ๋ณต์‚ฌ (Hawking Radiation)

์Šคํ‹ฐ๋ธ ํ˜ธํ‚น์ด 1974๋…„์— ์˜ˆ์ธกํ•œ ํ˜ธํ‚น ๋ณต์‚ฌ๋Š” ๋ธ”๋ž™ํ™€์ด ์–‘์ž ํšจ๊ณผ๋กœ ์ธํ•ด ์—ด๋ณต์‚ฌ๋ฅผ ๋ฐฉ์ถœํ•œ๋‹ค๋Š” ์ด๋ก ์ด์•ผ. ํ˜ธํ‚น ์˜จ๋„๋Š”:

T_H = โ„cยณ / (8ฯ€GMk_B)
โ„ = 1.055 ร— 10โปยณโด Jยทs [ํ™˜์‚ฐ ํ”Œ๋ž‘ํฌ ์ƒ์ˆ˜] k_B = 1.38 ร— 10โปยฒยณ J/K [๋ณผ์ธ ๋งŒ ์ƒ์ˆ˜]

ํƒœ์–‘ ์งˆ๋Ÿ‰ ๋ธ”๋ž™ํ™€์˜ ํ˜ธํ‚น ์˜จ๋„๋Š” ์•ฝ 6ร—10โปโธ K์•ผ. ์šฐ์ฃผ ๋ฐฐ๊ฒฝ ๋ณต์‚ฌ(2.7K)๋ณด๋‹ค ํ›จ์”ฌ ๋‚ฎ์•„์„œ ์‹ค์ œ๋กœ๋Š” ๊ด€์ธก์ด ๋ถˆ๊ฐ€๋Šฅํ•ด. ํ•˜์ง€๋งŒ ์†Œํ˜• ๋ธ”๋ž™ํ™€์ด๋‚˜ ์›์‹œ ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋Š” ์ด ํšจ๊ณผ๋ฅผ ํฌํ•จํ•˜๊ธฐ๋„ ํ•ด.

โฐ ์‹œ๊ฐ„ ์ง€์—ฐ ํšจ๊ณผ (Time Dilation)

๋ธ”๋ž™ํ™€ ๊ทผ์ฒ˜์—์„œ๋Š” ์‹œ๊ฐ„์ด ๋А๋ ค์ ธ. ์ด๊ฑธ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์‹œ๊ฐํ™”ํ•˜๋ฉด ์ •๋ง ์ธ์ƒ์ ์ธ ํšจ๊ณผ๊ฐ€ ๋‚˜์™€:

t_observer / t_local = 1 / โˆš(1 - Rs/r)
r = 1.5 Rs ์—์„œ: ์‹œ๊ฐ„์ด ์•ฝ 1.73๋ฐฐ ๋А๋ ค์ง r = 1.1 Rs ์—์„œ: ์‹œ๊ฐ„์ด ์•ฝ 3.32๋ฐฐ ๋А๋ ค์ง r โ†’ Rs ์—์„œ: ์‹œ๊ฐ„์ด ๋ฌดํ•œํžˆ ๋А๋ ค์ง (์™ธ๋ถ€ ๊ด€์ธก์ž ๊ธฐ์ค€)
โš ๏ธ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๊ตฌํ˜„ ์ฃผ์˜์‚ฌํ•ญ: ์‹œ๊ฐ„ ์ง€์—ฐ ํšจ๊ณผ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ "์™ธ๋ถ€ ๊ด€์ธก์ž ๊ธฐ์ค€"๊ณผ "์ž์œ  ๋‚™ํ•˜ ๊ด€์ธก์ž ๊ธฐ์ค€"์„ ํ˜ผ๋™ํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ด. ์ž์œ  ๋‚™ํ•˜ํ•˜๋Š” ๋ฌผ์ฒด๋Š” ์ด๋ฒคํŠธ ํ˜ธ๋ผ์ด์ฆŒ์„ ์œ ํ•œํ•œ ๊ณ ์œ ์‹œ๊ฐ„ ์•ˆ์— ํ†ต๊ณผํ•˜์ง€๋งŒ, ์™ธ๋ถ€ ๊ด€์ธก์ž์—๊ฒŒ๋Š” ์˜์›ํžˆ ํ˜ธ๋ผ์ด์ฆŒ์— ๊ฐ€๊นŒ์›Œ์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ.

๐Ÿ› ๏ธ 8. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ๋„๊ตฌ โ€” ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด

๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณด๊ณ  ์‹ถ์–ด? ๐Ÿ™Œ ์ง„์ž… ์žฅ๋ฒฝ์ด ๋†’์•„ ๋ณด์ด์ง€๋งŒ, ๋‹จ๊ณ„๋ณ„๋กœ ์ ‘๊ทผํ•˜๋ฉด ์ถฉ๋ถ„ํžˆ ๊ฐ€๋Šฅํ•ด!

๐Ÿ Python์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ


# ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

# ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๋ธ”๋ž™ํ™€ ๊ด‘์„  ์ถ”์  (2D ๋‹จ์ˆœํ™” ๋ฒ„์ „)

def schwarzschild_geodesic(lambda_param, state, Rs=1.0):
    """
    state = [r, phi, dr/dl, dphi/dl]
    ์ž์—ฐ๋‹จ์œ„: G=c=M=1, Rs=2
    """
    r, phi, dr, dphi = state
    
    # ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ์—์„œ ์œ ๋„๋œ ๊ฐ€์†๋„
    d2r = r * dphi**2 * (1 - Rs/r) - (Rs/(2*r**2)) * (dr**2/(1-Rs/r) - r**2*dphi**2)
    d2phi = -2 * dr * dphi / r
    
    return [dr, dphi, d2r, d2phi]

def trace_ray(b_impact, Rs=2.0, r_start=50.0):
    """
    ์ถฉ๊ฒฉ ๋งค๊ฐœ๋ณ€์ˆ˜ b๋กœ ๊ด‘์„  ์ถ”์ 
    """
    # ์ดˆ๊ธฐ ์กฐ๊ฑด (๋ฌดํ•œ๋Œ€์—์„œ ์˜ค๋Š” ๊ด‘์„ )
    r0 = r_start
    phi0 = 0.0
    dphi0 = 1.0 / r0**2  # L/rยฒ (L=1๋กœ ์ •๊ทœํ™”)
    dr0 = -np.sqrt(1 - (1 - Rs/r0) / b_impact**2 * r0**2)
    
    state0 = [r0, phi0, dr0, dphi0]
    
    # ์ ๋ถ„ (์ด๋ฒคํŠธ: ๋ธ”๋ž™ํ™€ ํฌํš ๋˜๋Š” ํƒˆ์ถœ)
    def captured(l, s, Rs): return s[0] - 1.05*Rs
    captured.terminal = True
    captured.direction = -1
    
    sol = solve_ivp(
        schwarzschild_geodesic, 
        [0, 1000], 
        state0,
        args=(Rs,),
        events=captured,
        max_step=0.5,
        rtol=1e-8
    )
    return sol

# ์—ฌ๋Ÿฌ ์ถฉ๊ฒฉ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ด‘์„  ์ถ”์ 
Rs = 2.0
b_critical = 3*np.sqrt(3)/2 * Rs  # โ‰ˆ 5.196

fig, ax = plt.subplots(1, 1, figsize=(10, 10), facecolor='black')
ax.set_facecolor('black')

# ๋ธ”๋ž™ํ™€ ๊ทธ๋ฆฌ๊ธฐ
circle = plt.Circle((0, 0), Rs/2, color='black', 
                     linewidth=2, edgecolor='#4a90d9')
ax.add_patch(circle)

# ๋‹ค์–‘ํ•œ b๊ฐ’์œผ๋กœ ๊ด‘์„  ์ถ”์ 
for b in np.linspace(b_critical*0.8, b_critical*3, 20):
    sol = trace_ray(b, Rs)
    x = sol.y[0] * np.cos(sol.y[1])
    y = sol.y[0] * np.sin(sol.y[1])
    
    color = '#ef4444' if sol.t_events[0].size > 0 else '#a78bfa'
    ax.plot(x, y, color=color, alpha=0.6, linewidth=0.8)

plt.show()

๐Ÿš€ ๋‹ค์Œ ๋‹จ๊ณ„ โ€” ๋” ๋ฐœ์ „์‹œํ‚ค๋ ค๋ฉด

1
3D ๋ Œ๋”๋ง์œผ๋กœ ํ™•์žฅ
2D์—์„œ 3D๋กœ ํ™•์žฅํ•˜๊ณ , ์‹ค์ œ ํ”ฝ์…€ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌํ˜„. OpenGL์ด๋‚˜ Vulkan ์‚ฌ์šฉ ์ถ”์ฒœ.
2
GPU ๊ฐ€์† ์ถ”๊ฐ€
CUDA (NVIDIA) ๋˜๋Š” Metal (Apple)๋กœ ํ”ฝ์…€๋ณ„ ๋ณ‘๋ ฌ ๊ณ„์‚ฐ. PyTorch๋‚˜ JAX๋กœ GPU ๊ณ„์‚ฐ์„ ์‰ฝ๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด.
3
์ปค ๋ธ”๋ž™ํ™€ ๊ตฌํ˜„
์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ์—์„œ ์ปค ๊ณ„๋Ÿ‰์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ. ์Šคํ•€ ํŒŒ๋ผ๋ฏธํ„ฐ a๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ๋ฅผ ์žฌ๊ณ„์‚ฐ.
4
๊ฐ•์ฐฉ์›๋ฐ˜ ํ…์Šค์ฒ˜ ์ถ”๊ฐ€
๋…ธ๋น„์ฝ”ํ”„-์† ์˜จ๋„ ๋ชจ๋ธ๋กœ ์›๋ฐ˜ ์ƒ‰์ƒ ๊ณ„์‚ฐ, ๋„ํ”Œ๋Ÿฌ/๋น” ์ง‘์ค‘ ํšจ๊ณผ ์ ์šฉ.
5
์‹ค์‹œ๊ฐ„ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ
WebGL/Three.js๋กœ ์›น ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๊ตฌํ˜„. ์‚ฌ์šฉ์ž๊ฐ€ ๋ธ”๋ž™ํ™€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์กฐ์ ˆ ๊ฐ€๋Šฅ!
๐Ÿ’ก ์žฌ๋Šฅ๋„ท ํ™œ์šฉ ํŒ: ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋ฌผ๋ฆฌํ•™ ์ž๋ฌธ์ด๋‚˜ CUDA ์ตœ์ ํ™” ๋„์›€์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, ์žฌ๋Šฅ๋„ท์—์„œ ๋ฌผ๋ฆฌํ•™ ์ „๊ณต์ž๋‚˜ GPU ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ „๋ฌธ๊ฐ€๋ฅผ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์–ด. ์ด๋Ÿฐ ํŠน์ˆ˜ํ•œ ๋ถ„์•ผ์˜ ํ˜‘์—…์ด ์ƒ๊ฐ๋ณด๋‹ค ํ™œ๋ฐœํ•˜๊ฒŒ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๊ฑฐ๋“ !

๐Ÿ”ฌ 9. ์ตœ์‹  ์—ฐ๊ตฌ ํŠธ๋ Œ๋“œ โ€” ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์˜ ๋ฏธ๋ž˜

๐Ÿค– ๋จธ์‹ ๋Ÿฌ๋‹ + ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

์ตœ๊ทผ์—๋Š” ์‹ ๊ฒฝ๋ง(Neural Network)์„ ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ํ™œ์šฉํ•˜๋Š” ์—ฐ๊ตฌ๊ฐ€ ํ™œ๋ฐœํ•ด. ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋ฐฉํ–ฅ์ด์•ผ:

โ‘  ์—๋ฎฌ๋ ˆ์ดํ„ฐ(Emulator) ๋ฐฉ์‹ ์ˆ˜์ฒœ ๊ฐœ์˜ GRMHD ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ฒฐ๊ณผ๋กœ ์‹ ๊ฒฝ๋ง์„ ํ›ˆ๋ จ์‹œ์ผœ์„œ, ์ƒˆ๋กœ์šด ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋น ๋ฅด๊ฒŒ ์˜ˆ์ธก. ๊ธฐ์กด ์‹œ๋ฎฌ๋ ˆ์ด์…˜๋ณด๋‹ค ์ˆ˜๋ฐฑ ๋ฐฐ ๋น ๋ฅด๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์–ด.
โ‘ก ๋ฌผ๋ฆฌ ์ •๋ณด ์‹ ๊ฒฝ๋ง (Physics-Informed Neural Networks, PINN) ์ธก์ง€์„  ๋ฐฉ์ •์‹ ์ž์ฒด๋ฅผ ์‹ ๊ฒฝ๋ง์œผ๋กœ ํ’€์–ด. ์†์‹ค ํ•จ์ˆ˜์— ๋ฌผ๋ฆฌ ๋ฐฉ์ •์‹์„ ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ ๋„ฃ์–ด์„œ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ํ•ด๋ฅผ ํ•™์Šต. ๋ณต์žกํ•œ ๊ฒฝ๊ณ„ ์กฐ๊ฑด์—์„œ ํŠนํžˆ ์œ ์šฉํ•ด.

๐ŸŒ ์‹ค์‹œ๊ฐ„ ์›น ๊ธฐ๋ฐ˜ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ

WebGL๊ณผ WebGPU์˜ ๋ฐœ์ „์œผ๋กœ ์ด์ œ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์‹ค์‹œ๊ฐ„ ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ์–ด! Three.js + GLSL ์…ฐ์ด๋”๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋ชจ๋ฐ”์ผ์—์„œ๋„ ๋Œ์•„๊ฐ€๋Š” ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.


// GLSL ์…ฐ์ด๋” โ€” ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๋ธ”๋ž™ํ™€ ๊ด‘์„  ์ถ”์  (๋‹จ์ˆœํ™”)
// fragment shader

uniform float Rs;           // ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๋ฐ˜์ง€๋ฆ„
uniform vec3 cameraPos;     // ์นด๋ฉ”๋ผ ์œ„์น˜
uniform samplerCube skybox; // ๋ฐฐ๊ฒฝ ํ•˜๋Š˜ ํ…์Šค์ฒ˜

void main() {
    vec3 rayDir = normalize(vRayDir);
    vec3 pos = cameraPos;
    
    // ์ธก์ง€์„  ์ˆ˜์น˜ ์ ๋ถ„ (๋‹จ์ˆœํ™”๋œ ๋ฒ„์ „)
    for(int i = 0; i < 256; i++) {
        float r = length(pos);
        
        // ๋ธ”๋ž™ํ™€ ํฌํš ์ฒดํฌ
        if(r < Rs * 1.05) {
            gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
            return;
        }
        
        // ์ค‘๋ ฅ ๊ฐ€์†๋„ (๋‰ดํ„ด ๊ทผ์‚ฌ + ์ƒ๋Œ€๋ก ์  ๋ณด์ •)
        vec3 gravity = -normalize(pos) * Rs / (2.0 * r * r);
        
        // ๊ด‘์„  ์—…๋ฐ์ดํŠธ
        rayDir += gravity * stepSize;
        rayDir = normalize(rayDir);
        pos += rayDir * stepSize;
    }
    
    // ๋ฐฐ๊ฒฝ ํ•˜๋Š˜ ์ƒ˜ํ”Œ๋ง
    gl_FragColor = texture(skybox, rayDir);
}

๐Ÿ”ญ ์ฐจ์„ธ๋Œ€ EHT์™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ

2030๋…„๋Œ€๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ์ฐจ์„ธ๋Œ€ EHT(ngEHT)๋Š” ๋” ๋งŽ์€ ๋ง์›๊ฒฝ์„ ์ถ”๊ฐ€ํ•ด์„œ ๋ธ”๋ž™ํ™€ ์ด๋ฏธ์ง€์˜ ํ•ด์ƒ๋„๋ฅผ ํฌ๊ฒŒ ๋†’์ผ ๊ณ„ํš์ด์•ผ. ์ด๋ฅผ ์œ„ํ•ด ๋” ์ •๊ตํ•œ GRMHD ์‹œ๋ฎฌ๋ ˆ์ด์…˜๊ณผ ๊ด‘์„  ์ถ”์  ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ด. ํŠนํžˆ ๋ธ”๋ž™ํ™€ ๊ทธ๋ฆผ์ž์˜ ์‹œ๊ฐ„ ๋ณ€ํ™”๋ฅผ ๊ด€์ธกํ•˜๊ธฐ ์œ„ํ•œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๊ฐœ๋ฐœ์ด ํ™œ๋ฐœํžˆ ์ง„ํ–‰ ์ค‘์ด์•ผ.

๋˜ํ•œ ์ค‘๋ ฅํŒŒ ๊ด€์ธก์†Œ(LIGO, Virgo, KAGRA)์™€ ์ „ํŒŒ ๋ง์›๊ฒฝ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฐํ•ฉํ•œ ๋ฉ€ํ‹ฐ๋ฉ”์‹ ์ € ์ฒœ๋ฌธํ•™์—์„œ๋„ ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ํ•ต์‹ฌ ์—ญํ• ์„ ํ•ด. ๋ธ”๋ž™ํ™€ ํ•ฉ๋ณ‘ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์€ ์ˆ˜์น˜์ƒ๋Œ€์„ฑ์ด๋ก (Numerical Relativity)์˜ ์˜์—ญ์œผ๋กœ, ์•„์ธ์Šˆํƒ€์ธ ๋ฐฉ์ •์‹ ์ž์ฒด๋ฅผ ์ˆ˜์น˜์ ์œผ๋กœ ํ’€์–ด์•ผ ํ•ด์„œ ์—„์ฒญ๋‚œ ๊ณ„์‚ฐ ์ž์›์ด ํ•„์š”ํ•ด.

๐ŸŒŸ ๋ฏธ๋ž˜ ์ „๋ง: ์–‘์ž ์ปดํ“จํŒ…์ด ๋ฐœ์ „ํ•˜๋ฉด ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์—๋„ ํ˜๋ช…์ด ์˜ฌ ์ˆ˜ ์žˆ์–ด. ํŠนํžˆ ํ˜ธํ‚น ๋ณต์‚ฌ ๊ฐ™์€ ์–‘์ž ์ค‘๋ ฅ ํšจ๊ณผ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐ ์–‘์ž ์ปดํ“จํ„ฐ๊ฐ€ ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ . ์•„์ง์€ ์ด๋ก ์  ๋‹จ๊ณ„์ง€๋งŒ, 10~20๋…„ ํ›„์—๋Š” ํ˜„์‹ค์ด ๋  ์ˆ˜๋„ ์žˆ์–ด!

๐Ÿ“‹ 10. ํ•ต์‹ฌ ์ •๋ฆฌ โ€” ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๋ฌผ๋ฆฌ ๋ชจ๋ธ ์š”์•ฝ

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ์™”์œผ๋ฉด ์ด์ œ ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€ ๊ฝค ์ž˜ ์•Œ๊ฒŒ ๋์„ ๊ฑฐ์•ผ! ํ•ต์‹ฌ๋งŒ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ:

๊ตฌ์„ฑ ์š”์†Œ ํ•ต์‹ฌ ๋ฌผ๋ฆฌ/์ˆ˜ํ•™ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•
์‹œ๊ณต๊ฐ„ ๊ธฐํ•˜ํ•™ ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ/์ปค ๊ณ„๋Ÿ‰ ํ…์„œ ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ ๊ณ„์‚ฐ
๋น›์˜ ๊ฒฝ๋กœ ์ธก์ง€์„  ๋ฐฉ์ •์‹ RK4/RK45 ์ˆ˜์น˜ ์ ๋ถ„
๋ Œ๋”๋ง ์—ญ๋ฐฉํ–ฅ ๊ด‘์„  ์ถ”์  GPU ๋ณ‘๋ ฌํ™” (CUDA)
์ค‘๋ ฅ ๋ Œ์ฆˆ ์ถฉ๊ฒฉ ๋งค๊ฐœ๋ณ€์ˆ˜, ์•„์ธ์Šˆํƒ€์ธ ๋ง ๊ด‘์„  ์ข…๋ฃŒ ์กฐ๊ฑด ํŒ๋ณ„
๊ฐ•์ฐฉ์›๋ฐ˜ ๋…ธ๋น„์ฝ”ํ”„-์† ์˜จ๋„ ๋ชจ๋ธ ํ‘์ฒด ๋ณต์‚ฌ โ†’ RGB ๋ณ€ํ™˜
๋„ํ”Œ๋Ÿฌ ํšจ๊ณผ ์ƒ๋Œ€๋ก ์  ์ฃผํŒŒ์ˆ˜ ํŽธ์ด 4์ œ๊ณฑ ๋ฐ๊ธฐ ๋ณด์ •
์‹œ๊ฐ„ ์ง€์—ฐ ์ค‘๋ ฅ ์ ์ƒ‰ํŽธ์ด ์ธ์ž ๊ณ„๋Ÿ‰ ํ…์„œ g_tt ์„ฑ๋ถ„
๐ŸŽฏ ๋งˆ์ง€๋ง‰ ํŒ: ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ๋Š” ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๋ธ”๋ž™ํ™€ + 2D ๊ด‘์„  ์ถ”์  + ๊ฐ„๋‹จํ•œ ๋ฐฐ๊ฒฝ ํ…์Šค์ฒ˜๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด. ์ด๊ฒƒ๋งŒ ํ•ด๋„ ์—„์ฒญ ๋ฉ‹์ง„ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€! ๊ทธ ๋‹ค์Œ์— ์ปค ๋ธ”๋ž™ํ™€, ๊ฐ•์ฐฉ์›๋ฐ˜, GPU ๊ฐ€์†์„ ์ˆœ์„œ๋Œ€๋กœ ์ถ”๊ฐ€ํ•ด๋‚˜๊ฐ€๋ฉด ๋ผ. ์™„์„ฑ๋„ ๋†’์€ ๋ธ”๋ž™ํ™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ๋ฌผ๋ฆฌํ•™์ž๋‚˜ ๊ทธ๋ž˜ํ”ฝ์Šค ์ „๋ฌธ๊ฐ€์™€ ํ˜‘์—…ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ! ๐Ÿš€
๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.