Ein Wintersturm tobt über dem Südpazifik und wühlt das Meer auf. Drei Tage später, viertausend Kilometer entfernt, läuft an einem kalifornischen Strand eine lange, gleichmäßige Dünung ein — und die Surfer dort wissen etwas Bemerkenswertes: Die ersten Wellen, die ankommen, sind immer die langen; die kurzen, kabbeligen folgen Stunden bis Tage später. Der Ozean hat das Wellengewirr des Sturms unterwegs nach Wellenlänge sortiert, ganz von selbst. Das geht nur, wenn lange Wasserwellen schneller laufen als kurze — wenn also die Geschwindigkeit einer Welle von ihrer Wellenlänge abhängt. Genau das heißt Dispersion.
Dasselbe Sortieren, millionenfach schneller, passiert in jedem Glasprisma: Weißes Licht geht hinein, ein Regenbogen kommt heraus, weil Glas verschiedene Frequenzen verschieden schnell laufen lässt. Kapitel 14 ist auf diesem Punkt etwas schuldig geblieben — das Beugungsgitter sortierte Farben, aber andersherum als ein Prisma, und die Auflösung wurde auf dieses Kapitel vertagt. Vorher müssen wir allerdings eine unbequeme Entdeckung machen: Sobald ein Medium dispersiv ist, hat eine Welle nicht mehr eine Geschwindigkeit, sondern zwei — die Wellenberge laufen mit dem einen Tempo, das Wellenpaket (und mit ihm Energie und Botschaft) mit einem anderen. Am Ende des Kapitels wird eines dieser beiden Tempi in einem unserer Experimente schneller als das Licht im Vakuum sein, mit Messprotokoll — und Einstein wird sich trotzdem nicht im Grab umdrehen müssen.
Lernziele
Nach diesem Kapitel kannst du …
… Phasengeschwindigkeit \(v_p = \omega/k\) und Gruppengeschwindigkeit \(v_g = d\omega/dk\) unterscheiden, aus einer Dispersionsrelation berechnen und beide in einer Simulation messen,
… erklären, warum Glas dispersiv ist (der Lorentz-Oszillator: gebundene Elektronen sind Resonatoren aus Kapitel 15 — und ihre Antwort hängt von der Treibfrequenz ab),
… die Prismen-Ablenkung mit der Snellius-Kette ausrechnen und begründen, warum das Prisma Blau stärker ablenkt, das Gitter aber Rot,
… das Drude-Modell freier Elektronen anwenden: warum Metalle spiegeln, warum die Ionosphäre Kurzwelle um den Globus trägt — und warum \(v_p > c\) kein Widerspruch zur Relativität ist,
… die Plasmonen-Resonanz einer Gold-Nanostruktur messen und erklären, warum Goldrubinglas rot ist.
16.1 Zwei Wellen genügen: die Schwebung
Was ist überhaupt „die Geschwindigkeit” einer Welle? Für eine einzelne, unendlich lange Sinuswelle ist die Antwort eindeutig: Ein Wellenberg sitzt dort, wo die Phase \(kx - \omega t\) einen festen Wert hat; wandert die Zeit um \(\Delta t\) weiter, muss \(x\) um \((\omega/k)\,\Delta t\) nachrücken. Das Tempo der Berge ist also
Aber eine unendliche Sinuswelle trägt keine Botschaft — sie sieht heute aus wie gestern. Wer ein Signal schicken will, muss der Welle eine Form aufprägen: einen Anfang, ein Ende, ein Paket. Und die billigste Form entsteht, wenn man nur zwei Sinuswellen mit leicht verschiedenem \(k\) überlagert. Das Additionstheorem — es trug schon den Doppelspalt in Kapitel 14 — verwandelt die Summe in ein Produkt:
\[\cos(k_1 x - \omega_1 t) + \cos(k_2 x - \omega_2 t)
\;=\; 2\,
\underbrace{\cos\!\bigl(\bar k x - \bar\omega t\bigr)}_{\text{Träger}}
\cdot
\underbrace{\cos\!\Bigl(\tfrac{\Delta k}{2} x
- \tfrac{\Delta\omega}{2} t\Bigr)}_{\text{Einhüllende}}\]
mit den Mittelwerten \(\bar k = (k_1+k_2)/2\), \(\bar\omega = (\omega_1+\omega_2)/2\) und den Differenzen \(\Delta k = k_2 - k_1\), \(\Delta\omega = \omega_2 - \omega_1\). Ein schneller Träger, moduliert von einer langsamen, breiten Einhüllenden — eine Schwebung, in Wellengruppen zerschnitten. Und jetzt das Entscheidende: Träger und Einhüllende sind selbst wieder von der Form \(\cos(Kx - \Omega t)\), jede mit ihrem eigenen Tempo. Der Träger läuft mit \(\bar\omega/\bar k \approx
v_p\). Die Einhüllende aber läuft mit
— der Steigung der Dispersionsrelation \(\omega(k)\), nicht ihrem Verhältnis \(\omega/k\). Solange \(\omega(k)\) eine Ursprungsgerade ist (Vakuum: \(\omega = ck\)), sind Steigung und Verhältnis dasselbe und beide Tempi gleich \(c\). Sobald die Kurve krümmt, gehen sie auseinander.
Die Handrechnung dazu, mit der Dispersionsrelation der Tiefwasserwellen vom Kapitelanfang, \(\omega = \sqrt{gk}\) (wir setzen \(g = 1\), Spielzeug-Einheiten): \(k_1 = 1\) gibt \(\omega_1 = 1\); \(k_2 = 1{,}2\) gibt \(\omega_2 = \sqrt{1{,}2} =
1{,}0954\). Träger: \(\bar k = 1{,}1\), \(\bar\omega = 1{,}0477\), also \(v_p = 1{,}0477/1{,}1 = 0{,}9525\). Einhüllende: \(\Delta\omega/\Delta k = 0{,}0954/0{,}2 = 0{,}4772\) — fast genau die Hälfte. Das ist kein Zufall dieser Zahlen: Die Ableitung von \(\omega = \sqrt{gk}\) ist \(d\omega/dk = \tfrac{1}{2}\sqrt{g/k}
= \omega/2k\), exakt die halbe Phasengeschwindigkeit. Beide Tempi sind hier Skalare (Zahlen, keine Vektoren — wir messen entlang einer Richtung).
Das Experiment dazu braucht kein Gitter und keinen Löser — die Summe zweier Kosinus können wir direkt auswerten. Frage: Laufen Berge und Gruppen wirklich mit \(0{,}9525\) bzw. \(0{,}4772\)? Bühne: die \(x\)-Achse von \(-100\) bis \(200\), fein abgetastet; die Zeit ist ein Parameter der Formel, es gibt keine Update-Schleife. Gemessen wird zweierlei: ein Wellenberg, der bei \(t = 0\) im Zentrum der Gruppe um \(x = 0\) sitzt, wird in kleinen Zeitschritten verfolgt (in jedem Schritt suchen wir das lokale Maximum nahe der alten Position); und der Energie-Schwerpunkt der Gruppe, \(\sum x\,u^2 / \sum u^2\) in einem mitwandernden Fenster — denn die Energie sitzt im Quadrat des Feldes (Kapitel 4), und „wo das Paket ist” heißt „wo seine Energie ist”. Erfolgskriterium: beide Messwerte auf etwa ein Prozent an den Sollwerten.
import numpy as npimport matplotlib.pyplot as pltdef omega_von_k(k):"""Tiefwasserwellen: ω = √(gk) mit g = 1."""return np.sqrt(k)K1, K2 =1.0, 1.2W1, W2 = omega_von_k(K1), omega_von_k(K2)VP_SOLL = (W1 + W2) /2/ ((K1 + K2) /2) # Träger: 0,9525VG_SOLL = (W2 - W1) / (K2 - K1) # Einhüllende: 0,4772x = np.linspace(-100, 200, 6000)def schwebung(t):return np.cos(K1 * x - W1 * t) + np.cos(K2 * x - W2 * t)def gruppen_schwerpunkt(t, mitte, halbbreite=14):"""Energie-Schwerpunkt der Gruppe im Fenster um `mitte`.""" u = schwebung(t) m = (x > mitte - halbbreite) & (x < mitte + halbbreite)return np.sum(x[m] * u[m]**2) / np.sum(u[m]**2)# Gruppe verfolgen: Schwerpunkt bei t = 0 und t = 20s0 = gruppen_schwerpunkt(0.0, 0.0)s1 = gruppen_schwerpunkt(20.0, VG_SOLL *20)vg_mess = (s1 - s0) /20# einen Berg verfolgen: kleine Schritte, Maximum nahe der alten Positionberg, dt =0.0, 0.05for n inrange(200): # bis t = 10 u = schwebung((n +1) * dt) m = (x > berg -2) & (x < berg +2) berg = x[m][np.argmax(u[m])]vp_mess = berg /10print(f"Berge: v_p = {vp_mess:.4f} (Theorie {VP_SOLL:.4f})")print(f"Gruppe: v_g = {vg_mess:.4f} (Theorie {VG_SOLL:.4f})")print(f"Verhältnis v_g/v_p = {vg_mess/vp_mess:.3f} (Theorie 0,5)")
Beide Tempi getroffen (der Berg liegt ein halbes Prozent daneben — er verformt sich leicht, während er durch die Gruppe wandert; gleich sehen wir, warum er das tut). Dasselbe als Bild:
# von oben: schwebung(), gruppen_schwerpunkt(), K1, K2, W1, W2,# VP_SOLL, VG_SOLL, x, berg (Bergposition bei t = 10)fig, achsen = plt.subplots(2, 1, figsize=(8, 4.6), sharex=True)for achse, t inzip(achsen, (0.0, 20.0)): u = schwebung(t) huelle =2* np.abs(np.cos(0.5* (K2 - K1) * x-0.5* (W2 - W1) * t)) achse.plot(x, u, "C0", lw=0.8) achse.plot(x, huelle, "k--", lw=1.0, label="Einhüllende") achse.plot(x, -huelle, "k--", lw=1.0) sp = gruppen_schwerpunkt(t, VG_SOLL * t) achse.plot(sp, 2.25, "o", color="C3", clip_on=False) achse.axvline(VG_SOLL * t, color="C3", ls=":", lw=1) achse.set(ylabel="u", ylim=(-2.4, 2.4), xlim=(-40, 60)) achse.annotate(f"t = {t:.0f}", (0.02, 0.82), xycoords="axes fraction")# der verfolgte Berg: bei t = 0 in der Gruppenmitte, bei t = 20 vornachsen[0].plot(0, 2.0, "v", color="C2", ms=8, clip_on=False)achsen[1].plot(VP_SOLL *20, 2.0, "v", color="C2", ms=8, clip_on=False, label="verfolgter Berg (Soll)")achsen[1].set_xlabel("x")achsen[1].legend(loc="lower right", fontsize=8)fig.tight_layout()plt.show()
Abbildung 16.1: Schwebung zweier Tiefwasserwellen (ω = √k) bei t = 0 (oben) und t = 20 (unten). Die gestrichelte Einhüllende wandert mit v_g = 0,477 (runder Marker und gepunktete Soll-Linie), der verfolgte Wellenberg mit v_p = 0,952 (Dreieck) — doppelt so schnell. Der Berg, der anfangs in der Gruppenmitte saß, ist bei t = 20 fast an deren Vorderkante angekommen: Berge wandern durch die Gruppe nach vorn und verebben dort.
Im unteren Panel steckt eine Beobachtung, die gleich noch wichtig wird: Der markierte Berg ist gegenüber der Gruppenmitte nach vorn gerückt. Weil hier \(v_p > v_g\) gilt, werden Berge am hinteren Rand der Gruppe „geboren”, wandern durch sie hindurch und verebben an der Vorderkante — am Strand kann man genau das beobachten, wenn ein Wellen-Set einläuft: Die vorderste Welle des Sets verschwindet scheinbar, während hinten eine neue auftaucht. Kein Berg überlebt den Weg; nur das Paket kommt an. Und mit ihm die Energie: Unser Schwerpunkt-Detektor hat gemessen, dass das Energiequadrat \(u^2\) mit \(v_g\) reist, nicht mit \(v_p\). Wer eine Botschaft schickt — einen Puls, ein Morsezeichen, ein Bit — schickt eine Einhüllende. Information und Energie reisen mit der Gruppengeschwindigkeit.
TippMerkkasten: zwei Geschwindigkeiten
\(v_p = \omega/k\) — das Tempo der Wellenberge (der Phase).
\(v_g = d\omega/dk\) — das Tempo des Pakets: Steigung der Dispersionsrelation, nicht ihr Verhältnis.
Energie und Information reisen mit \(v_g\).
Ohne Dispersion (\(\omega = ck\)) fallen beide zusammen; jede Krümmung von \(\omega(k)\) treibt sie auseinander.
16.2 Ein alter Bekannter: das Gitter ist dispersiv
Wir besitzen seit Kapitel 8 ein Medium mit exakt bekannter, krummer Dispersionsrelation — das FDTD-Gitter selbst. Dort stand:
\[\sin\!\Bigl(\frac{\omega\,\Delta t}{2}\Bigr)
\;=\; S \cdot \sin\!\Bigl(\frac{k\,\Delta x}{2}\Bigr),\]
und die Folge war, dass grob aufgelöste Wellen zu langsam laufen („numerische Dispersion”). Damals haben wir die Phasengeschwindigkeit über Nulldurchgänge gemessen. Jetzt, mit dem Begriffspaar aus dem letzten Abschnitt, können wir mehr: Die Ableitung der Dispersionsrelation nach \(k\) liefert (Kettenregel links und rechts, dann nach \(d\omega/dk\) auflösen)
eine Vorhersage für das Tempo eines ganzen Pakets auf dem Gitter. Die Handrechnung für \(S = 0{,}5\) und eine Trägerwelle mit 5 Punkten pro Wellenlänge (\(k\Delta x = 2\pi/5\), also \(k\Delta x/2 = 0{,}6283\)): Aus der Dispersionsrelation folgt \(\sin(\omega\Delta t/2) = 0{,}5 \cdot \sin(0{,}6283) = 0{,}2939\), also \(\omega\Delta t/2 = 0{,}2985\). Damit \(v_p = \omega/k = 0{,}9495\,c\) (die Berge sind 5 % zu langsam, wie in Kapitel 8) — aber \(v_g = c \cdot \cos(0{,}6283)/\cos(0{,}2985) =
c \cdot 0{,}8090/0{,}9558 = 0{,}8464\,c\): Das Paket ist sogar 15 % zu langsam. Die Gruppengeschwindigkeit reagiert empfindlicher auf die Gitterkrümmung als die Phase — sie ist ja die Ableitung, und Ableitungen verstärken Dellen.
Das Experiment: das 1D-Wellenlabor aus Kapitel 6, absichtlich grob betrieben. Frage: Laufen Berge mit \(0{,}9495\,c\) und Paket mit \(0{,}8464\,c\)? Bühne: 2600 Gitterpunkte, \(\Delta x = 1\), \(S = 0{,}5\) (also \(\Delta t = 0{,}5\), \(c = 1\)); an beiden Enden Mur-Ränder aus Kapitel 6, damit nichts reflektiert. Anregung: eine weiche Quelle bei Punkt 200 sendet einen Sinus der Gitterfrequenz \(\omega = 1{,}1938\) (genau die Frequenz, die zum 5-Punkte-Träger gehört), moduliert mit einer Gauß-Einhüllenden (Breite 40 Zeiteinheiten um \(t = 150\)) — ein Wellenpaket, schmalbandig genug, dass „die” Gruppengeschwindigkeit wohldefiniert ist (Kapitel 10: kurz = breitbandig, wir wählen bewusst lang). Die weiche Quelle strahlt nach beiden Seiten; das linkslaufende Zwillingspaket verschwindet im linken Mur-Rand. Gemessen wird dreierlei: \(\omega\) aus den Nulldurchgängen einer Sonden-Zeitreihe und \(k\) aus den Nulldurchgängen eines Schnappschusses (beides Werkzeuge aus Kapitel 8/12) für \(v_p = \omega/k\); die Bahn des Energie-Schwerpunkts \(\sum x\,u^2/\sum u^2\) über die Zeit; und als Gegenprobe die Ankunftszeiten des Pakets an zwei Sonden (Punkte 900 und 1500). Erfolgskriterium: alle drei Messwerte auf ein Prozent an der Gittertheorie.
WichtigVorhersage-Punkt
Im x-t-Diagramm des Laufs (Ort waagerecht, Zeit senkrecht aufwärts) erscheint das Paket als schräger Streifen. Die einzelnen Wellenberge darin sind feine Streifen mit eigener Steigung. Welche der beiden Spuren verläuft steiler — die der Berge oder die des Pakets? (Steiler heißt hier: mehr Zeit pro Strecke, also langsamer.)
Die Antwort steht in der Rechnung oben: Das Paket ist mit \(0{,}85\,c\) das langsamere, seine Spur verläuft steiler; die Berge (flachere Streifen, \(0{,}95\,c\)) durchqueren das Paket von hinten nach vorn — wie am Strand. Der Lauf dazu:
# von oben: np, pltC, DX, S =1.0, 1.0, 0.5DT = S * DX / CN_GITTER, N_SCHRITTE =2600, 4400K_TRAEGER =2* np.pi /5# 5 Punkte pro WellenlängeW_TRAEGER = (2/ DT) * np.arcsin(S * np.sin(K_TRAEGER * DX /2))VP_GITTER = W_TRAEGER / K_TRAEGER # 0,9495 cVG_GITTER = C * np.cos(K_TRAEGER * DX /2) / np.cos(W_TRAEGER * DT /2)QUELLE, T0, SIG =200, 150.0, 40.0SONDE1, SONDE2 =900, 1500MUR = (S -1) / (S +1) # Mur-Rand (Kapitel 6)u = np.zeros(N_GITTER)B = np.zeros(N_GITTER -1)reihe1, reihe2, bahn, xt_fein = [], [], [], []for n inrange(N_SCHRITTE): t = n * DT B += (DT / DX) * np.diff(u) u_l, u_r, u0, uN = u[1], u[-2], u[0], u[-1] u[1:-1] += (C**2* DT / DX) * np.diff(B) u[0] = u_l + MUR * (u[1] - u0) # Mur links u[-1] = u_r + MUR * (u[-2] - uN) # Mur rechts u[QUELLE] +=0.1* np.sin(W_TRAEGER * t) * np.exp(-((t - T0) / SIG)**2) reihe1.append(u[SONDE1]) reihe2.append(u[SONDE2])if t > T0 +4* SIG and n %40==0: # Schwerpunktbahn e = u**2 e[:QUELLE +80] =0.0# Quellgegend ausblenden bahn.append((t, np.sum(np.arange(N_GITTER) * e) / np.sum(e)))if1200<= n <1900and n %2==0: # feines x-t-Fenster xt_fein.append(u[600:1000].copy())reihe1, reihe2 = np.array(reihe1), np.array(reihe2)zeiten = np.arange(N_SCHRITTE) * DTbahn = np.array(bahn)m = bahn[:, 0] >600vg_bahn = np.polyfit(bahn[m, 0], bahn[m, 1], 1)[0]fig, (links, rechts) = plt.subplots(1, 2, figsize=(9, 4.2), gridspec_kw={"width_ratios": [1.15, 1]})xt = np.array(xt_fein)links.imshow(xt, origin="lower", aspect="auto", cmap="RdBu_r", extent=[600, 1000, 600, 950], vmin=-np.abs(xt).max(), vmax=np.abs(xt).max())x0, t0 =200+ VG_GITTER * (775-150), 775# Paketmitte bei t = 775for v, stil, name in ((VP_GITTER, "k--", "Berge: $v_p$ = 0,950 c"), (VG_GITTER, "k-", "Paket: $v_g$ = 0,846 c")): links.plot([x0 - v *175, x0 + v *175], [t0 -175, t0 +175], stil, lw=1.4, label=name)# eng zoomen, damit die einzelnen Bergspuren im Druck auflösbar sindlinks.set(xlim=(680, 830), ylim=(700, 860), xlabel="Gitterpunkt", ylabel="Zeit", title="Paketstreifen mit Bergspuren")links.legend(loc="upper left", fontsize=8)rechts.plot(bahn[m, 0], bahn[m, 1], "o", ms=3, label="Schwerpunkt")rechts.plot(bahn[m, 0], 200+ VG_GITTER * (bahn[m, 0] -150), "k-", lw=1, label="Theorie: $x = x_0 + v_g t$")rechts.set(xlabel="Zeit", ylabel="Gitterpunkt", title="Bahn des Energie-Schwerpunkts")rechts.legend(fontsize=8)fig.tight_layout()plt.show()
Abbildung 16.2: Links: x-t-Diagramm eines Ausschnitts (Farbe = u). Das Paket läuft als breiter Streifen entlang der durchgezogenen v_g-Theorielinie (0,846 c); die feinen Bergspuren darin sind flacher und folgen der gestrichelten v_p-Linie (0,950 c) — jeder Berg wandert im Paket nach vorn. Rechts: die Bahn des Energie-Schwerpunkts (Punkte) auf der v_g-Theoriegeraden.
Im linken Bild ist die Vorhersage mit bloßem Auge zu prüfen: Die feinen Bergspuren sind tatsächlich flacher als der Paketstreifen — jeder Berg überholt das Paket. Nun die Zahlen:
# von oben: reihe1, zeiten, u, bahn, vg_bahn, QUELLE, SIG,# SONDE1, SONDE2, VP_GITTER, VG_GITTER, N_GITTERdef ankunftszeit(reihe, zeiten, sigma):"""Zeitlicher Energie-Schwerpunkt, im 2. Durchgang gefenstert.""" e = reihe**2 t_roh = np.sum(zeiten * e) / np.sum(e) m = np.abs(zeiten - t_roh) <3.5* sigmareturn np.sum(zeiten[m] * e[m]) / np.sum(e[m])def omega_aus_zeitreihe(reihe, zeiten, sigma):"""Mittlere Periode aus den Nulldurchgängen ums Paketzentrum.""" e = reihe**2 tm = np.sum(zeiten * e) / np.sum(e) m = np.abs(zeiten - tm) <2.0* sigma r, z = reihe[m], zeiten[m] w = np.where(np.diff(np.sign(r)) >0)[0] tn = [z[i] - r[i] * (z[i +1] - z[i]) / (r[i +1] - r[i]) for i in w]return2* np.pi / np.mean(np.diff(tn))def k_aus_schnappschuss(u, mitte, halbbreite=40):"""Mittlere Wellenlänge aus den Nulldurchgängen ums Paket.""" f = u[mitte - halbbreite:mitte + halbbreite] xs = np.arange(mitte - halbbreite, mitte + halbbreite, dtype=float) w = np.where(np.diff(np.sign(f)) >0)[0] xn = [xs[i] - f[i] / (f[i +1] - f[i]) for i in w]return2* np.pi / np.mean(np.diff(xn))w_mess = omega_aus_zeitreihe(reihe1, zeiten, SIG)e = u**2e[:QUELLE +80] =0.0mitte =int(np.sum(np.arange(N_GITTER) * e) / np.sum(e))k_mess = k_aus_schnappschuss(u, mitte)t1 = ankunftszeit(reihe1, zeiten, SIG)t2 = ankunftszeit(reihe2, zeiten, SIG)print(f"Berge: v_p = ω/k = {w_mess:.4f}/{k_mess:.4f} "f"= {w_mess/k_mess:.4f} c (Theorie {VP_GITTER:.4f})")print(f"Paket: v_g (Schwerpunktbahn) = {vg_bahn:.4f} c "f"(Theorie {VG_GITTER:.4f})")print(f"Paket: v_g (Ankunftszeiten) = "f"{(SONDE2 - SONDE1)/(t2 - t1):.4f} c")
Berge: v_p = ω/k = 1.1958/1.2611 = 0.9482 c (Theorie 0.9495)
Paket: v_g (Schwerpunktbahn) = 0.8455 c (Theorie 0.8464)
Paket: v_g (Ankunftszeiten) = 0.8460 c
Drei Messungen, drei Treffer auf etwa ein Promille. Das Gitter ist ein dispersives Medium — nur eben ein künstliches, dessen \(\omega(k)\) wir aus dem Algorithmus hergeleitet haben statt aus der Natur. Merke dir die beiden Formeln dieses Abschnitts gut: Die Gegenprobe „messen, was die Gittertheorie vorhersagt” wird uns gleich noch einmal retten, wenn künstliche und echte Dispersion im selben Experiment auftreten.
16.3 Warum Glas sortiert: der Lorentz-Oszillator
Woher kommt echte Dispersion? Kapitel 8 hat es angedeutet: Das Vakuum kann Wellen nicht nach Länge behandeln, weil es keinen eigenen Maßstab besitzt — Glas aber hat einen. Seine Elektronen sind an die Atome gebunden wie Massen an Federn, und ein Masse-Feder-System ist ein Resonator mit einer Eigenfrequenz \(f_0\) (Kapitel 15 hat gerade ausführlich vermessen, was Resonatoren tun). Fährt eine Lichtwelle der Frequenz \(f\) hindurch, dann treibt ihr E-Feld diese Elektronen — eine erzwungene Schwingung. Und die Antwort eines getriebenen Resonators hängt von der Treibfrequenz ab: weit unterhalb von \(f_0\) schwingen die Elektronen brav im Takt mit; je näher \(f\) an die Resonanz rückt, desto heftiger fällt die Antwort aus. Die mitschwingenden Elektronen sind ihrerseits winzige Antennen, deren Strahlung sich der Welle überlagert und sie verlangsamt — stärkere Antwort heißt größeres\(n\). Das Ergebnis dieser Überlegung (die Rechnung ist die einer getriebenen Feder und steht im Kleingedruckten) heißt Lorentz-Modell:
wobei \(\sigma\) die Stärke der Materialantwort misst (wie viele Elektronen mitschwingen) und \(f_0\) die Resonanzfrequenz der Federn ist. Genau in dieser Form — als LorentzianSusceptibility — nimmt Meep dispersive Materialien entgegen; die Dämpfung \(\gamma\), die Kapitel 15 zur Lorentz-Linie gehörte, lassen wir hier null (unser Glas soll nicht schlucken, nur sortieren).
Wir bauen uns ein Buchglas: \(f_0 = 2\) und \(\sigma = 1{,}25\). Die Handrechnung zeigt, dass das vernünftige Werte sind: Bei \(f \to 0\) ist \(\varepsilon = 1 + 1{,}25 = 2{,}25\), also \(n = 1{,}5\) — exakt das Glas, das uns seit Kapitel 6 begleitet. Bei \(f = 0{,}8\) (nennen wir es Rot) ist \(\varepsilon = 1 +
1{,}25 \cdot 4/(4 - 0{,}64) = 2{,}4881\), \(n = 1{,}5774\). Bei \(f = 1{,}2\) (Blau) ist \(\varepsilon = 1 + 5/2{,}56 =
2{,}9531\), \(n = 1{,}7185\). Der Brechungsindex wächst mit der Frequenz, solange wir unterhalb der Resonanz bleiben — das heißt normale Dispersion, und es ist der Normalfall durchsichtiger Stoffe: Ihre Elektronen-Resonanzen liegen im Ultravioletten, das sichtbare Licht treibt sie alle von unten.
Für die Gruppengeschwindigkeit brauchen wir die Steigung. Mit \(k = 2\pi f\,n(f)/c\) liefert die Produktregel \(dk/df = (2\pi/c)\,(n + f\,dn/df)\), also
\[v_g \;=\; \frac{c}{n_g}, \qquad
n_g \;=\; n + f\,\frac{dn}{df}\]
— der Gruppenindex\(n_g\): das gewohnte \(n\) plus einen Zuschlag für die Steigung. Handrechnung für unser Glas: Bei \(f = 0{,}8\) ist \(dn/df = 0{,}2246\) (man kann numerisch ableiten), also \(n_g = 1{,}5774 + 0{,}8 \cdot 0{,}2246 = 1{,}757\) und \(v_g = 0{,}5691\,c\) gegenüber \(v_p = c/n = 0{,}6340\,c\). Bei \(f = 1{,}2\): \(n_g = 2{,}358\), \(v_g = 0{,}4241\,c\) gegenüber \(v_p = 0{,}5819\,c\). Zwei Vorhersagen fürs Protokoll: Blau ist in beiden Tempi das langsamere Licht — und der Abstand zwischen \(v_p\) und \(v_g\) ist bei Blau größer, weil die \(n(f)\)-Kurve dort steiler ist. So sehen Modell und Kurven aus:
# von oben: np, pltimport osos.environ["HWLOC_HIDE_ERRORS"] ="2"# vor dem Meep-Import (Kapitel 11)import meep as mpmp.verbosity(0) # Fortschrittsmeldungen stummF0_GLAS, ST_GLAS =2.0, 1.25# ein dispersives Meep-Material: epsilon=1 plus Lorentz-Term# (frequency = f0, sigma = Stärke, gamma = Dämpfung — hier 0)GLAS = mp.Medium(epsilon=1, E_susceptibilities=[ mp.LorentzianSusceptibility(frequency=F0_GLAS, gamma=0.0, sigma=ST_GLAS)])def eps_glas(f):return1+ ST_GLAS * F0_GLAS**2/ (F0_GLAS**2- f**2)def n_glas(f):return np.sqrt(eps_glas(f))def n_gruppe(f, df=1e-6):return n_glas(f) + f * (n_glas(f + df) - n_glas(f - df)) / (2* df)fig, (links, rechts) = plt.subplots(1, 2, figsize=(9, 3.6))f1 = np.linspace(0.01, 1.93, 400)f2 = np.linspace(2.07, 4.5, 400)links.plot(f1, eps_glas(f1), "C0")links.plot(f2, eps_glas(f2), "C0")links.axvspan(2.0, 3.0, color="0.85") # ε < 0: verbotenes Fensterlinks.axhline(0, color="k", lw=0.6)links.axvline(2.0, color="k", ls=":", lw=1)links.annotate("$f_0$", (2.02, 18))links.annotate("$\\varepsilon < 0$", (2.35, 8))links.set(xlabel="Frequenz f", ylabel="$\\varepsilon(f)$", ylim=(-12, 24), title="Materialantwort mit Resonanz")fz = np.linspace(0.01, 1.55, 300)rechts.plot(fz, n_glas(fz), "C0", label="n(f)")rechts.plot(fz, [n_gruppe(f) for f in fz], "C0--", label="$n_g = n + f\\,dn/df$")for f, farbe, name in ((0.8, "tab:red", "Rot"), (1.2, "tab:blue", "Blau")): rechts.plot(f, n_glas(f), "o", color=farbe) rechts.annotate(name, (f, n_glas(f)), textcoords="offset points", xytext=(8, -4), color=farbe)# Meeps eigene Auskunft über das Material als Gegenprobef_probe = np.array([0.4, 0.8, 1.2, 1.5])eps_meep = [GLAS.epsilon(f)[0][0].real for f in f_probe]rechts.plot(f_probe, np.sqrt(eps_meep), "x", color="k", ms=7, label="Meep: Medium.epsilon(f)")rechts.set(xlabel="Frequenz f", ylabel="Brechungsindex", ylim=(1.3, 4.2), title="n und $n_g$ im Transparenzbereich")rechts.legend(fontsize=8)fig.tight_layout()plt.show()
Using MPI version 4.1, 1 processes
Abbildung 16.3: Das Lorentz-Glas (f₀ = 2, σ = 1,25). Links: ε(f) schießt an der Resonanz in die Höhe, dahinter folgt ein Fenster mit ε < 0 (grau), in dem keine Welle laufen kann. Rechts: Zoom in den transparenten Bereich — Brechungsindex n (durchgezogen) und Gruppenindex n_g (gestrichelt) wachsen mit f; die Punkte markieren unser Rot (f = 0,8) und Blau (f = 1,2). Die Kreuze sind Meeps eigene Auskunft über das Material — sie liegen exakt auf unserer Formel.
Zwei Dinge am linken Panel verdienen einen zweiten Blick. Erstens: Genau an der Resonanz explodiert die Antwort — unsere ungedämpfte Formel hat dort einen Pol (echte Materialien glätten ihn mit \(\gamma > 0\) zur Lorentz-Linie aus Kapitel 15 und absorbieren dort: Resonanz heißt schlucken, nicht durchlassen). Zweitens: Direkt oberhalb von \(f_0\) ist \(\varepsilon\)negativ — dort gibt es kein reelles \(n\), keine laufende Welle, nur evaneszentes Abklingen wie hinter der Totalreflexionsgrenze in Kapitel 12. Dieses graue Fenster ist eine Miniaturausgabe dessen, was uns im Drude-Abschnitt und in Kapitel 26 (Bandlücken) wieder begegnet: Frequenzbereiche, in denen ein Medium schlicht „nein” sagt.
16.3.1 Das Wettrennen
Jetzt wird gemessen. Frage: Treffen die gemessenen \(v_g\) und \(v_p\) unsere vier Vorhersagen — und gewinnt Rot das Rennen? Bühne: ein Streifen von \(52 \times 2\) Meep-Einheiten, ganz mit Lorentz-Glas gefüllt (default_material); PML nur links und rechts. Neu ist die Zutat k_point = (0,0,0): Sie erklärt den oberen und unteren Zellrand für periodisch — die Zelle wird zum Schlauch zusammengeklebt, und eine Quelllinie über die volle Höhe erzeugt eine saubere ebene Welle, als wäre der Streifen unendlich breit. Anregung: ein Gauß-Puls (GaussianSource, Bandbreite \(f/12\) — wieder bewusst schmalbandig) auf einer Linie bei \(x = -22\). Gemessen wird an zwei Sonden bei \(x = -15\) und \(x = +10\) (Abstand 25): die Ankunftszeit des Pakets je Sonde als zeitlicher Energie-Schwerpunkt (dasselbe Werkzeug wie eben) — daraus \(v_g\); und an einem engen Sondenpaar (Abstand \(0{,}15\), weniger als eine halbe Glas-Wellenlänge) die Phase des Trägers per Hand-Detektor aus Kapitel 10 (Zeitreihe mal \(\cos\)/\(\sin\), arctan2): Die Phasendifferenz ist \(k \cdot 0{,}15\), daraus \(v_p = \omega/k\). Erfolgskriterium: ein erster Lauf mit Auflösung 20 — und wir prüfen ehrlich, wie nah wir der Materialtheorie kommen.
# von oben: mp, np, GLAS, ankunftszeit() (Abschnitt 16.2)DT_SONDE =0.05ABSTAND_WEIT =25.0# Sonde 1 -> Sonde 2ABSTAND_ENG =0.15# Phasen-Paardef streifenlauf(medium, f, dauer, aufloesung):"""Puls durch den periodischen Streifen; vier Sonden-Zeitreihen.""" quelle = [mp.Source(mp.GaussianSource(f, fwidth=f /12), component=mp.Ez, center=mp.Vector3(-22, 0), size=mp.Vector3(0, 2))] sim = mp.Simulation(cell_size=mp.Vector3(52, 2), resolution=aufloesung, sources=quelle, default_material=medium, # füllt die ganze Zelle boundary_layers=[mp.PML(2.0, direction=mp.X)], k_point=mp.Vector3()) # oben/unten periodisch sonden = [mp.Vector3(-15, 0), mp.Vector3(10, 0), mp.Vector3(10, 0), mp.Vector3(10+ ABSTAND_ENG, 0)] reihen = [[] for _ in sonden]def messen(sim):for r, p inzip(reihen, sonden): r.append(sim.get_field_point(mp.Ez, p).real) sim.run(mp.at_every(DT_SONDE, messen), until=dauer)return [np.array(r) for r in reihen]def detektor_phase(reihe, zeiten, f):"""Kapitel-10-Detektor: Phase der Frequenz f in der Zeitreihe.""" co = np.sum(reihe * np.cos(2* np.pi * f * zeiten)) si = np.sum(reihe * np.sin(2* np.pi * f * zeiten))# np.arctan2(y, x): Vier-Quadranten-Arcustangens — liefert den# Winkel des Punkts (x, y) im vollen Kreis (-pi bis pi), weil er# beide Vorzeichen kennt (arctan(y/x) allein kann das nicht)return np.arctan2(si, co)def tempi_messen(medium, f, dauer, aufloesung):"""v_g aus Ankunftszeiten, v_p aus der Phasendifferenz.""" reihen = streifenlauf(medium, f, dauer, aufloesung) zeiten = np.arange(len(reihen[0])) * DT_SONDE sigma = (12/ f) /2# grobe Paketbreite t1 = ankunftszeit(reihen[0], zeiten, sigma) t2 = ankunftszeit(reihen[1], zeiten, sigma) dphi = (detektor_phase(reihen[3], zeiten, f)- detektor_phase(reihen[2], zeiten, f)) % (2* np.pi) vp =2* np.pi * f * ABSTAND_ENG / dphireturn ABSTAND_WEIT / (t2 - t1), vp, (reihen, zeiten, t1, t2)lauf_rot = tempi_messen(GLAS, 0.8, 180, 20)lauf_blau = tempi_messen(GLAS, 1.2, 200, 20)for name, f, lauf in (("Rot ", 0.8, lauf_rot), ("Blau", 1.2, lauf_blau)): vg, vp = lauf[0], lauf[1] vg_soll, vp_soll =1/ n_gruppe(f), 1/ n_glas(f)print(f"{name} f = {f}: v_g = {vg:.4f} c (Material {vg_soll:.4f}, "f"{(vg/vg_soll -1)*100:+.1f} %) v_p = {vp:.4f} c "f"(Material {vp_soll:.4f}, {(vp/vp_soll -1)*100:+.1f} %)")
Rot f = 0.8: v_g = 0.5591 c (Material 0.5691, -1.8 %) v_p = 0.6302 c (Material 0.6340, -0.6 %)
Blau f = 1.2: v_g = 0.4038 c (Material 0.4241, -4.8 %) v_p = 0.5726 c (Material 0.5819, -1.6 %)
Rot gewinnt das Rennen, qualitativ stimmt alles — aber quantitativ sollte uns das Ergebnis stören: Blau verfehlt die \(v_g\)-Theorie um fast fünf Prozent, weit mehr, als unsere Messwerkzeuge an Streuung hergeben. Bevor man in so einem Moment am Lorentz-Modell zweifelt, lohnt der Blick auf die Bühne: Wer ist hier eigentlich noch dispersiv? Das Gitter. Auflösung 20 bedeutet für Blau im Glas eine Wellenlänge von \(\lambda = 1/(1{,}2 \cdot 1{,}7185) = 0{,}485\), also nur 9,7 Gitterpunkte pro Wellenlänge — grob genug, dass die Gitterformel aus dem letzten Abschnitt mitspielt. Rechnen wir ihre Vorhersage aus: Beide Dispersionen wirken in guter Näherung nacheinander (das Material verlangsamt auf \(c/n_g\), das Gitter multipliziert seinen \(\cos/\cos\)-Faktor obendrauf):
# von oben: np, n_glas(), n_gruppe()def gitterfaktor(f, aufloesung, courant=0.5):"""Kapitel-8-Korrektur für v_g im Medium mit Index n(f).""" dx =1/ aufloesung dt = courant * dx k_med =2* np.pi * f * n_glas(f) # Wellenzahl im Glasreturn (np.cos(k_med * dx /2)/ np.cos(2* np.pi * f * dt /2))for name, f, lauf in (("Rot ", 0.8, lauf_rot), ("Blau", 1.2, lauf_blau)): kombiniert = gitterfaktor(f, 20) / n_gruppe(f)print(f"{name}: Material x Gitter = {kombiniert:.4f} c "f"gemessen: {lauf[0]:.4f} c")
Rot : Material x Gitter = 0.5591 c gemessen: 0.5591 c
Blau: Material x Gitter = 0.4039 c gemessen: 0.4038 c
Die kombinierte Vorhersage trifft die Messung auf vier Stellen — die fehlenden fünf Prozent waren bis auf den letzten Krümel numerische Dispersion. Das ist die wichtigste Methodenlektion dieses Kapitels: Physikalische und numerische Dispersion addieren sich im selben Experiment, und wer die zweite nicht kennt (oder nicht beziffern kann), misst die erste falsch und merkt es nicht. Wir können sie beziffern — und wir können sie kleiner machen: Auflösung verdoppeln, Gegenprobe (die Konvergenzleiter aus Kapitel 10):
Rot : v_g = 0.5666 c (Material 0.5691, kombiniert 0.5666) v_p = 0.6330 c (Material 0.6340)
Blau: v_g = 0.4190 c (Material 0.4241, kombiniert 0.4190) v_p = 0.5796 c (Material 0.5819)
Bei Auflösung 40 schrumpft der Gitteranteil auf rund ein Prozent (der Faktor steckt im Quadrat der Punktdichte, Kapitel 8), und wieder liegt die Messung auf der kombinierten Theorie. Das Wettrennen im Bild — Rot braucht für die 25 Einheiten zwischen den Sonden 44 Zeiteinheiten, Blau 60:
Abbildung 16.4: Das Wettrennen durchs Lorentz-Glas (Auflösung 40): die Zeitreihen beider Sonden (links x = −15, rechts x = +10) für Rot (oben) und Blau (unten), Amplituden normiert. Die senkrechten Linien markieren die gemessenen Ankunftszeiten (Energie-Schwerpunkte); die Pfeile zeigen die daraus folgende Laufzeit für 25 Einheiten Strecke. Rot braucht 44,1 Zeiteinheiten, Blau 59,7 — Blau ist das langsame Licht im Glas. Zusätzlich sieht man Blau stärker zerfließen: seine Bandbreite erwischt ein steileres Stück der n(f)-Kurve.
Damit ist das Versprechen aus Kapitel 15 eingelöst: Die Lorentz-Kurve, die dort die Linienform eines Resonators war, ist hier als Materialantwort wieder aufgetaucht — Glas ist ein Chor aus Elektronen-Resonatoren, und \(n(f)\) ist seine Resonanzkurve, von weit unten angespielt.
16.4 Das Prisma sortiert andersherum
Jetzt zum Kapitel-14-Versprechen. Ein Prisma lenkt Licht zweimal über Snellius ab — einmal beim Eintritt, einmal beim Austritt — und weil \(n\) von der Frequenz abhängt, hängt der gesamte Ablenkwinkel \(\delta\) von der Farbe ab. Die Kette für ein Prisma mit Apexwinkel \(A\) (Einfallswinkel \(\theta_1\) auf die erste Fläche, alle Winkel zu den Flächennormalen):
Die Handrechnung für unser Buchglas, \(A = 40°\) und \(\theta_1 = 32{,}65°\) (gleich wird klar, warum gerade dieser Wert): Rot (\(n = 1{,}5774\)): \(\theta_2 = \arcsin(0{,}5395/
1{,}5774) = 20{,}0°\), \(\theta_3 = 20{,}0°\), \(\theta_4 =
\arcsin(1{,}5774 \cdot 0{,}342) = 32{,}65°\), also \(\delta_\text{rot}
= 32{,}65 + 32{,}65 - 40 = \mathbf{25{,}30°}\) — der Strahlengang ist spiegelsymmetrisch (\(\theta_2 = \theta_3\)), das Prisma steht in Minimalablenkung, so justiert man es auch im Labor. Blau (\(n = 1{,}7185\)): \(\theta_2 = 18{,}30°\), \(\theta_3 =
21{,}70°\), \(\theta_4 = 39{,}45°\), \(\delta_\text{blau} =
\mathbf{32{,}11°}\). Blau wird um fast sieben Grad stärker abgelenkt — größeres \(n\), stärkerer Knick. Beim Gitter war es umgekehrt: \(\sin\theta = \lambda/d\) wächst mit der Wellenlänge, dort gewann Rot. Gitter sortieren nach Geometrie, Prismen nach Materialantwort — und die läuft in die Gegenrichtung.
Das Experiment übernimmt das Spektrometer-Rezept aus Kapitel 14: ein breitbandiger Puls, zwei DFT-Fernfelder. Frage: Landen die beiden Farben bei \(25{,}30°\) und \(32{,}11°\) unter dem Horizont? Bühne: eine \(30 \times 28\)-Zelle, darin das Prisma als mp.Prism (drei Eckpunkte, Material: unser Lorentz-Glas). Wir drehen das Prisma um \(-12{,}65°\), so dass der horizontale Strahl die linke Fläche unter \(\theta_1 = 32{,}65°\) trifft — wie auf einem Prismentisch. (Der Strahl bleibt aus gutem Grund horizontal: Eine gekippte Breitband-Strahlquelle hat in Meep eine frequenzabhängige Richtung — Details im Kleingedruckten; den Treffpunkt legen wir etwas unter die Flächenmitte, damit das Strahlbündel nicht am Apex anstößt.) Anregung:GaussianBeamSource mit Pulszeitverlauf um \(f = 1{,}0\), Bandbreite \(0{,}7\) — deckt Rot und Blau zugleich ab; Strahltaille 3. Gemessen wird mit add_near2far auf einer Linie hinter dem Prisma, ausgewertet bei exakt \(f = 0{,}8\) und \(1{,}2\) (Rasterregel aus Kapitel 14: zwei Frequenzen liegen bei \(f_\text{cen} \pm df/2\), also \(f_\text{cen} = 1{,}0\), \(df = 0{,}4\)); das Fernfeld wird auf einem Bogen mit Radius 1000 abgetastet, der Gipfel mit Parabel-Feinschliff (Kapitel 10) geortet. Erfolgskriterium: beide Gipfel auf ein halbes Grad.
# von oben: mp, np, plt, GLAS, n_glas()A_GRAD, L_FLAECHE =40.0, 14.0def ablenkung_theorie(f, theta1_grad):"""Snellius-Kette durchs Prisma (Winkel in Grad).""" n = n_glas(f)# np.deg2rad/np.rad2deg: Grad <-> Bogenmaß (wie np.radians/# np.degrees aus Kapitel 1/4, nur als sprechendes Paar) t1 = np.deg2rad(theta1_grad) t2 = np.arcsin(np.sin(t1) / n) t3 = np.deg2rad(A_GRAD) - t2 t4 = np.arcsin(n * np.sin(t3))return theta1_grad + np.rad2deg(t4) - A_GRADTHETA1 = np.rad2deg(np.arcsin(n_glas(0.8)* np.sin(np.deg2rad(A_GRAD /2))))DELTA_ROT = ablenkung_theorie(0.8, THETA1) # 25,30°DELTA_BLAU = ablenkung_theorie(1.2, THETA1) # 32,11°# Prisma-Ecken: Apex oben, dann um -(theta1 - A/2) gedrehthalber_apex = np.deg2rad(A_GRAD /2)ecken0 = [np.array([0.0, 0.0]), L_FLAECHE * np.array([-np.sin(halber_apex),-np.cos(halber_apex)]), L_FLAECHE * np.array([+np.sin(halber_apex),-np.cos(halber_apex)])]beta =-np.deg2rad(THETA1 - A_GRAD /2)drehung = np.array([[np.cos(beta), -np.sin(beta)], [np.sin(beta), np.cos(beta)]])schwerpunkt0 =sum(ecken0) /3# @ zwischen Matrix und Vektor: Matrixprodukt (dreht den Vektor) —# dieselbe Operation wie das Skalarprodukt aus Kapitel 1, eine Stufe größerECKEN = [drehung @ (e - schwerpunkt0) + np.array([1.0, 2.5])for e in ecken0]TREFFPUNKT = ECKEN[0] +0.60* (ECKEN[1] - ECKEN[0])# mp.Prism: beliebiges Vieleck aus Eckpunkten (height=inf: 2D-Profil)prisma = mp.Prism(vertices=[mp.Vector3(*e) for e in ECKEN], height=mp.inf, material=GLAS)quelle = [mp.GaussianBeamSource( mp.GaussianSource(1.0, fwidth=0.7, is_integrated=True), center=mp.Vector3(TREFFPUNKT[0] -8.0, TREFFPUNKT[1]), size=mp.Vector3(0, 8), beam_x0=mp.Vector3(0, 0), beam_kdir=mp.Vector3(1, 0), beam_w0=3.0, beam_E0=mp.Vector3(0, 0, 1), component=mp.ALL_COMPONENTS)]sim = mp.Simulation(cell_size=mp.Vector3(30, 28), resolution=20, sources=quelle, geometry=[prisma], boundary_layers=[mp.PML(1.5)])n2f = sim.add_near2far(1.0, 0.4, 2, mp.Near2FarRegion( center=mp.Vector3(9.0, -0.5), size=mp.Vector3(0, 24), weight=+1))spur = {}def aufsummieren(sim): ez2 = sim.get_array(component=mp.Ez).T **2 spur["I"] = spur.get("I", 0) + ez2sim.run(mp.at_every(0.5, aufsummieren), until_after_sources=80)R_FERN =1000.0winkel = np.linspace(-50, 10, 400)I_fern = np.zeros((2, len(winkel)))for j, w inenumerate(winkel): wr = np.deg2rad(w) ff = sim.get_farfield(n2f, mp.Vector3(R_FERN * np.cos(wr), R_FERN * np.sin(wr)))for kf inrange(2): I_fern[kf, j] =abs(ff[6* kf +2])**2# E_z der Frequenz kfdef peakwinkel(I): j = np.argmax(I) p = np.polyfit(winkel[j -4:j +5], I[j -4:j +5], 2)return p[1] / (2* p[0]) # Grad unter dem HorizontW_ROT, W_BLAU = peakwinkel(I_fern[0]), peakwinkel(I_fern[1])fig, (links, rechts) = plt.subplots(1, 2, figsize=(9.5, 4.0), gridspec_kw={"width_ratios": [1.2, 1]})helligkeit = np.sqrt(spur["I"]) # Wurzel: Spur sichtbarerlinks.imshow(helligkeit, origin="lower", cmap="inferno", extent=[-15, 15, -14, 14], vmax=0.5* helligkeit.max())umriss = ECKEN + [ECKEN[0]]links.plot([e[0] for e in umriss], [e[1] for e in umriss], "w-", lw=1)austritt = np.array([4.3, 0.6]) # ungefährer Austrittspunktfor delta, farbe in ((DELTA_ROT, "tab:red"), (DELTA_BLAU, "tab:blue")): d = np.deg2rad(delta) links.plot([austritt[0], austritt[0] +12* np.cos(d)], [austritt[1], austritt[1] -12* np.sin(d)], ls="--", color=farbe, lw=1.4)links.set(xlim=(-15, 15), ylim=(-14, 14), xlabel="x", ylabel="y", title="Lichtspur mit Theoriestrahlen")for kf, (farbe, name, soll, mess) inenumerate( (("tab:red", "Rot (f = 0,8)", DELTA_ROT, W_ROT), ("tab:blue", "Blau (f = 1,2)", DELTA_BLAU, W_BLAU))): rechts.plot(-winkel, I_fern[kf] / I_fern[kf].max(), color=farbe, label=f"{name}: {mess:.2f}°") rechts.axvline(soll, color=farbe, ls=":", lw=1.2)rechts.set(xlabel="Winkel unter dem Horizont (Grad)", ylabel="Fernfeld-Intensität (norm.)", xlim=(10, 45), title="Ein Puls, zwei Farben (Soll gepunktet)")rechts.legend(fontsize=8)fig.tight_layout()plt.show()print(f"Gemessen: Rot {W_ROT:.2f}° (Soll {DELTA_ROT:.2f}°), "f"Blau {W_BLAU:.2f}° (Soll {DELTA_BLAU:.2f}°)")
Abbildung 16.5: Links: die „Lichtspur“ des Pulses (über den ganzen Lauf aufsummiertes E_z²); das gedrehte Prisma (Umriss) knickt den horizontalen Strahl nach unten, die gestrichelten Theoriestrahlen zeigen die Sollrichtungen für Rot (25,3°) und Blau (32,1°) — der helle Fächer hinter dem Prisma liegt genau zwischen ihnen. Rechts: die beiden DFT-Fernfelder aus demselben Lauf, normiert; die gepunkteten Senkrechten sind die Snellius-Vorhersagen. Gemessen: Rot 25,24°, Blau 32,20° — das Prisma lenkt Blau stärker ab, genau andersherum als das Gitter aus Kapitel 14.
Beide Gipfel sitzen auf einem Zehntelgrad. Damit ist auch das Diamant-Versprechen aus Kapitel 12 fällig: Der zweite Trumpf des Brillanten — sein „Feuer”, das farbige Aufblitzen — ist genau diese Sortierung. Diamant hat nicht nur ein großes \(n\) (\(\approx 2{,}42\)), sondern auch eine steile \(n(f)\)-Kurve; jede Facette wirkt als Mini-Prisma und zieht Weiß zu Spektren auseinander. Und der Regenbogen ist dasselbe Experiment mit Wassertropfen als Prismenersatz: Brechung hinein, Spiegelung an der Rückwand, Brechung heraus — Blau stets stärker geknickt.
Eine Gegenüberstellung als Gedankenstütze: Das Gitter sortiert über \(d\sin\theta = m\lambda\) — reine Geometrie, Wellenlänge gegen Spaltabstand, Rot (großes \(\lambda\)) wird stärker abgelenkt. Das Prisma sortiert über \(n(f)\) — Materialantwort, Resonatoren von unten angespielt, Blau (näher an \(f_0\)) wird stärker abgelenkt. Wer beide Muster kennt, liest an einem Spektrum sofort ab, welches Instrument es erzeugt hat.
16.5 Freie Elektronen: Drude, Metalle, Ionosphäre
Was passiert mit dem Lorentz-Modell, wenn man die Feder durchschneidet? In einem Metall sind die Leitungselektronen nicht an Atome gebunden — sie sind frei, ihre Rückstellkraft ist null, ihre „Resonanzfrequenz” ist \(f_0 = 0\). Setzt man das in die Lorentz-Formel ein (mit \(\sigma f_0^2 \to f_p^2\) als endlichem Grenzwert), bleibt das Drude-Modell:
\[\varepsilon(f) \;=\; 1 - \frac{f_p^2}{f^2},\]
wobei \(f_p\) — die Plasmafrequenz — die Eigenfrequenz ist, mit der die freie Elektronenwolke als Ganzes gegen die Ionen schwappt; sie wächst mit der Elektronendichte. Diese eine Zeile erklärt erstaunlich viel. Unterhalb von \(f_p\) ist \(\varepsilon < 0\): kein reelles \(n\), keine laufende Welle — die Welle dringt nur evaneszent ein (der Saum aus Kapitel 12) und wird vollständig reflektiert. Darum spiegeln Metalle: Für sichtbares Licht liegt \(f_p\) typischer Metalle im Ultravioletten, alles Sichtbare ist „unterhalb” und prallt ab. Und darum trägt die Ionosphäre Kurzwellenfunk um den Globus: Sie ist ein dünnes Plasma mit \(f_p\) von einigen Megahertz — Kurzwelle darunter wird himmelwärts gespiegelt wie von einem Metallblech, UKW und Satellitenfunk darüber fliegen ungehindert hindurch (Ü 16.4 misst diese Klippe nach). Oberhalb von \(f_p\) wird das Medium durchsichtig, aber mit einer Kuriosität: \(\varepsilon\) liegt zwischen 0 und 1, also ist \(n < 1\) — und damit \(v_p = c/n > c\). Die Handrechnung bei \(f = 1{,}25\,f_p\): \(\varepsilon = 1 - 1/1{,}5625 = 0{,}36\), \(n = 0{,}6\), \(v_p = 1{,}667\,c\). Zeit für das Kästchen.
WarnungNaheliegende Vermutung
„Nichts bewegt sich schneller als das Licht im Vakuum — also können auch Wellenberge in einem Medium höchstens mit \(c\) laufen; ein Medium mit \(n < 1\) wäre ein Widerspruch zur Relativitätstheorie.”
Warum sie naheliegt: „Nichts ist schneller als \(c\)” ist eines der bestbestätigten Prinzipien der Physik, und ein Wellenberg ist doch sichtbar ein „Etwas”, das sich bewegt.
Was stattdessen stimmt: Die Relativität deckelt den Transport von Energie und Information — und beides reist, wie dieses Kapitel gemessen hat, mit der Gruppengeschwindigkeit. Ein Wellenberg dagegen trägt keine Botschaft: Er ist ein Wiederholungsmuster in einem Zug, der schon da ist — wie der Lichtfleck eines schwenkenden Leuchtturms, der über eine ferne Wolkenwand huschen kann, so schnell er will, ohne dass irgendetwas diese Strecke durchquert. Im Drude-Medium gilt sogar exakt \(v_p \cdot v_g = c^2\) (nachzurechnen aus \(n_g = 1/n\)): Je schneller die Berge, desto langsamer das Paket. Die Messung folgt sofort — und die Vorderkante des Pulses, die Front, bleibt dabei immer unter \(c\) (das vertiefen Kapitel 20 und 29).
Gemessen wird mit exakt dem Werkzeug des Wettrennens — derselbe Streifen, dasselbe Sondenquartett, nur das Medium ist jetzt ein Drude-Material (Meep: DrudeSusceptibility mit \(f_p = 1\)) und der Träger liegt bei \(f = 1{,}25\), sicher oberhalb der Plasmafrequenz. Erfolgskriterium: \(v_p\) deutlich über \(c\) und das Produkt \(v_p \cdot v_g\) auf zwei Prozent an \(c^2\). Zusätzlich zeichnen wir diesmal das ganze x-t-Diagramm des Streifens auf, denn dieses Bild muss man gesehen haben:
Abbildung 16.6: Ein Puls (f = 1,25 f_p) im Drude-Medium als x-t-Diagramm (Farbe = E_z entlang der Streifenachse); alle drei Theorielinien sind zum Vergleich durch denselben Punkt der gemessenen Paketbahn gelegt. Das Paket folgt der durchgezogenen v_g-Linie (0,60 c) und bleibt brav hinter der gepunkteten c-Linie zurück. Die feinen Bergspuren darin sind dagegen flacher als die c-Linie: Sie folgen der gestrichelten v_p-Linie mit 1,67 c — schneller als Vakuumlicht. Kein Widerspruch: Jeder einzelne Berg entsteht hinten im Paket, rast nach vorn und stirbt an der Front; keiner überholt sie je.
v_p = 1.6676 c (Theorie 1.6667 c)
v_g = 0.5986 c (Theorie 0.6000 c)
Produkt v_p·v_g = 0.9983 c²
Da steht es im Messprotokoll: Wellenberge mit \(1{,}67\,c\), auf ein Promille an der Theorie — und gleichzeitig ein Paket, das mit \(0{,}60\,c\) gemächlich unter der \(c\)-Linie bleibt, Produkt \(c^2\) auf zwei Promille. Die Berge im x-t-Diagramm zeigen das Leuchtturm-Argument grafisch: Jede Bergspur beginnt an der Hinterkante des Paketstreifens und endet an dessen Vorderkante. Schneller als \(c\) ist hier nur ein Muster, nie ein Bote.
16.6 Plasmonik: eine Goldscheibe unter Licht
Zum Finale tauschen wir das Modellmaterial gegen echtes Gold. Meep bringt eine Materialbibliothek mit (meep.materials), in der gemessene Metalle als Drude-Lorentz-Summen hinterlegt sind — Drude für die freien Elektronen, plus Lorentz-Terme für gebundene („Interband”-)Übergänge, gefittet an Messdaten. Die Bibliothek rechnet in Mikrometern: Wir setzen also \(a = 1\,\)µm (Kapitel 11: eine Längenskala wählen, alles andere folgt), dann ist \(f_\text{meep} = 1/\lambda[\text{µm}]\) und sichtbares Licht läuft von \(f = 1{,}1\) (900 nm) bis \(2{,}5\) (400 nm). Erst die Auskunft des Materials selbst:
Abbildung 16.7: Die Permittivität von Gold aus Meeps Materialbibliothek (Drude-Lorentz-Fit an Messdaten), über der Vakuum-Wellenlänge. Oben: Re ε ist im gesamten Sichtbaren negativ (gestrichelt: die Null) — Gold ist überall „unterhalb der Plasmafrequenz“, darum spiegelt es. Unten: Im ε > 0 beschreibt Absorption; der Anstieg im Blau-Grünen stammt von den gebundenen Interband-Elektronen — sie schlucken Blau, weshalb der Spiegel goldgelb statt silbrig glänzt.
Ein massiver Goldspiegel wirft das Licht also zurück. Etwas ganz anderes passiert, wenn das Gold kleiner als die Wellenlänge wird — eine Scheibe von 100 nm Durchmesser, ein Fünftel der Lichtwellenlänge. Dann kann die Elektronenwolke der Scheibe als Ganzes gegen die Ionen schwingen: Das Licht schiebt sie nach links, die Oberflächenladungen an den Rändern ziehen sie zurück — eine Rückstellkraft, eine Eigenfrequenz, ein Resonator (Kapitel 15, nur dass hier Elektronen schwappen statt Felder im Hohlraum). Diese Schwingung heißt lokalisiertes Oberflächenplasmon, und wo Resonanz ist, ist starke Antwort: Bei der Resonanzfrequenz streut und schluckt die Scheibe Licht weit über ihre Größe hinaus.
Zwei Dinge brauchen wir fürs Experiment. Erstens die richtige Polarisation: Das E-Feld muss die Elektronen quer über die Scheibe schieben, damit Randladungen entstehen — also E in der Ebene, das ist die \(H_z\)-Welt aus Kapitel 13 (Quellkomponente mp.Hz; was mit der \(E_z\)-Polarisation passiert, klärt Ü 16.5). Zweitens eine Theorielinie: Für den Kreiszylinder existiert die exakte Streulösung als Reihe aus Besselfunktionen — das zweidimensionale Gegenstück zur Mie-Theorie der Kugel von 1908. Wir tippen sie aus der Literatur ab (Bohren/Huffman, Kapitel 8; scipy.special liefert die Besselfunktionen jv und die Hankelfunktionen hankel1) und füttern sie mit demselben komplexen \(\varepsilon(\lambda)\) aus Meeps Bibliothek — Theorie und Simulation nutzen exakt dasselbe Material:
# von oben: np, Au# scipy.special: Sammlung „besonderer" Funktionen der mathematischen# Physik; jv = Besselfunktion J_n, hankel1 = Hankelfunktion H_n^(1)# (auslaufende Zylinderwelle — das 2D-Gegenstück zu e^{ikr}/r)from scipy.special import jv, hankel1def mie_zylinder(lam, radius, polarisation="Hz"):"""Exakter Streuquerschnitt (pro Länge) eines Kreiszylinders bei senkrechtem Einfall (Bohren/Huffman, Kap. 8). 'Hz': H parallel zur Achse (E in der Ebene) — Plasmonen-Fall; 'Ez': E parallel zur Achse.""" m = np.sqrt(Au.epsilon(1/ lam)[0][0]) # komplexer Index x =2* np.pi * radius / lam eta = m * xdef dj(n, z): # Ableitungen überreturn0.5* (jv(n -1, z) - jv(n +1, z)) # Rekursionsformeldef dh(n, z):return0.5* (hankel1(n -1, z) - hankel1(n +1, z)) summe =0.0for n inrange(0, 16):if polarisation =="Hz": za = dj(n, eta) * jv(n, x) - m * jv(n, eta) * dj(n, x) ne = dj(n, eta) * hankel1(n, x) - m * jv(n, eta) * dh(n, x)else: za = m * dj(n, eta) * jv(n, x) - jv(n, eta) * dj(n, x) ne = m * dj(n, eta) * hankel1(n, x) - jv(n, eta) * dh(n, x) summe += (1if n ==0else2) *abs(za / ne)**2return (2/ x) * summe *2* radius
Gemessen wird der Streuquerschnitt\(\sigma(\lambda)\): wie viel Leistung die Scheibe aus einer ebenen Welle herausstreut, geteilt durch die einfallende Intensität — eine Fläche (in 2D: eine Länge), die man direkt mit der Scheibengröße vergleichen kann. Das Rezept braucht zwei Läufe, eine neue Technik: Erst ein Normierungslauf ohne Scheibe — er misst die einfallende Intensität und merkt sich die Felder auf einem Kasten aus vier Flussmonitoren um den (künftigen) Ort der Scheibe (get_flux_data). Dann der Streulauf mit Scheibe: Von seinen Monitoren ziehen wir die gemerkten einfallenden Felder ab (load_minus_flux_data) — was übrig bleibt, ist das reine Streufeld, und der Netto-Fluss aus dem Kasten heraus ist die gestreute Leistung. Bühne:\(1{,}6 \times 1{,}6\,\)µm, Auflösung 200 (die Scheibe ist nur 20 Zellen breit — Nanophotonik zwingt zu feinen Gittern), ebene Welle als Linienquelle mit is_integrated=True (nötig, weil die Linie bis in die PML reicht). Eine Vorsichtsmaßnahme übernehmen wir aus der Meep-Praxis: Bei dispersiven Bibliotheks-Metallen kann der Standard-Zeitschritt instabil werden, weil deren Fit-Terme sehr hohe Resonanzfrequenzen enthalten (die Stabilitätsgrenze aus Kapitel 8 galt nur für frequenzunabhängige Materialien); üblich ist Courant = 0.2 — wir zahlen die 2,5-fachen Zeitschritte als Versicherungsprämie. Erfolgskriterium: Messpunkte auf der exakten Zylinder-Theorie.
Vor dem Lauf der Vorhersage-Moment:
WichtigVorhersage-Punkt
Gold glänzt goldgelb — bei welcher Farbe erwartest du den stärksten Streupeak der 100-nm-Scheibe: bei Gold-Gelb (~580 nm), bei Rot, oder woanders?
Die Antwort gibt der Lauf; sie hängt nicht am Glanz des Spiegels, sondern an der Eigenfrequenz der schwappenden Elektronenwolke:
# von oben: mp, np, plt, Au, mie_zylinder()R_SCHEIBE =0.05# Radius 50 nmF_GOLD =1/0.55# Zentrum ~550 nmDF_GOLD =1/0.4-1/0.9# 400 bis 900 nmNF_GOLD =40def goldaufbau(mit_scheibe, aufloesung, komponente=mp.Hz):# mp.Cylinder: Kreis(scheibe) — in 2D einfach ein runder Fleck geometrie = ([mp.Cylinder(radius=R_SCHEIBE, material=Au)]if mit_scheibe else []) quelle = [mp.Source( mp.GaussianSource(F_GOLD, fwidth=DF_GOLD, is_integrated=True), component=komponente, center=mp.Vector3(-0.6, 0), size=mp.Vector3(0, 1.6))]return mp.Simulation(cell_size=mp.Vector3(1.6, 1.6), resolution=aufloesung, sources=quelle, geometry=geometrie, boundary_layers=[mp.PML(0.4)], Courant=0.2)def messkasten(sim):"""Vier Flussmonitore als Kasten um die Scheibe (außen positiv).""" seiten = [sim.add_flux(F_GOLD, DF_GOLD, NF_GOLD, mp.FluxRegion( center=mp.Vector3(sx *0.1, 0), size=mp.Vector3(0, 0.2), direction=mp.X, weight=sx)) for sx in (-1, +1)] seiten += [sim.add_flux(F_GOLD, DF_GOLD, NF_GOLD, mp.FluxRegion( center=mp.Vector3(0, sy *0.1), size=mp.Vector3(0.2, 0), direction=mp.Y, weight=sy)) for sy in (-1, +1)]return seitendef streuquerschnitt(aufloesung, komponente=mp.Hz): sim = goldaufbau(False, aufloesung, komponente) # 1: Normierung kasten = messkasten(sim) einfall = sim.add_flux(F_GOLD, DF_GOLD, NF_GOLD, mp.FluxRegion( center=mp.Vector3(-0.1, 0), size=mp.Vector3(0, 0.2), direction=mp.X)) sim.run(until_after_sources=30) norm_daten = [sim.get_flux_data(k) for k in kasten] P_einfall = np.array(mp.get_fluxes(einfall)) freqs = np.array(mp.get_flux_freqs(einfall)) sim = goldaufbau(True, aufloesung, komponente) # 2: Streuung kasten = messkasten(sim)for k, daten inzip(kasten, norm_daten): sim.load_minus_flux_data(k, daten) # Einfallsfeld abziehen sim.run(until_after_sources=30) P_streu =sum(np.array(mp.get_fluxes(k)) for k in kasten)return1/ freqs, P_streu / (P_einfall /0.2) # λ, σlam200, sigma200 = streuquerschnitt(200)lam300, sigma300 = streuquerschnitt(300)lam_fein = np.linspace(0.40, 0.90, 200)sigma_mie = np.array([mie_zylinder(l, R_SCHEIBE) for l in lam_fein])fig, achse = plt.subplots(figsize=(7, 4.2))achse.axvspan(495, 570, color="green", alpha=0.10)achse.plot(lam_fein *1000, sigma_mie *1000, "k-", lw=1.2, label="Zylinder-Streutheorie (exakt)")achse.plot(lam200 *1000, sigma200 *1000, "o", ms=4, mfc="none", color="goldenrod", label="Meep, Auflösung 200")achse.plot(lam300 *1000, sigma300 *1000, "o", ms=4, color="darkgoldenrod", label="Meep, Auflösung 300")achse.set(xlabel="Wellenlänge (nm)", ylabel="Streuquerschnitt (nm pro nm Länge)", title="100-nm-Goldscheibe: Plasmonen-Resonanz im Grünen")achse.legend(fontsize=8)fig.tight_layout()plt.show()i_peak = np.argmax(sigma300)for name, lam, sig in (("Auflösung 200", lam200, sigma200), ("Auflösung 300", lam300, sigma300)): mie_dort = np.array([mie_zylinder(l, R_SCHEIBE) for l in lam]) abw = np.abs(sig / mie_dort -1)print(f"{name}: Abweichung von der Theorie im Mittel "f"{np.mean(abw)*100:.1f} %, maximal {np.max(abw)*100:.1f} %")print(f"Peak bei λ = {lam300[i_peak]*1000:.0f} nm — im Grünen")
Abbildung 16.8: Streuquerschnitt der 100-nm-Goldscheibe über der Wellenlänge: Meep-Messpunkte bei Auflösung 200 (offene Kreise) und 300 (gefüllte), dazu die exakte Zylinder-Streutheorie (Linie) mit demselben ε(λ). Der Peak liegt bei ~520 nm — im Grünen (Farbband), nicht beim Gold-Gelb des Spiegels. Die 200er-Punkte liegen systematisch ein paar Prozent über der Linie: Treppenstufen-Artefakte am runden Metallrand, dort wo die Plasmonen-Ladungen sitzen; mit Auflösung 300 rücken die Punkte auf die Linie (Konvergenz, Kapitel 10).
Auflösung 200: Abweichung von der Theorie im Mittel 8.1 %, maximal 13.7 %
Auflösung 300: Abweichung von der Theorie im Mittel 2.8 %, maximal 6.2 %
Peak bei λ = 524 nm — im Grünen
Der Peak liegt bei ~520 nm, im Grünen — nicht beim Gelb des Goldglanzes. Eine Scheibe, die Grün heraussiebt, lässt von weißem Licht vor allem Rot übrig: Genau das ist das Geheimnis von Goldrubinglas, dem tiefroten Kirchenfenster- und Pokalglas, das Glasmacher seit Jahrhunderten herstellen, indem sie winzigste Goldtröpfchen im Glas ausfällen — Nano-Optik aus der Werkstatt, Jahrhunderte vor dem Wort „Nano”. (Das spektakulärste Stück, der römische Lycurgus-Becher, wirkt im Auflicht grünlich und im Durchlicht rot.) Dass ein und dasselbe Metall als Spiegel gelb und als Nanoteilchen rot erscheint, liegt an der Resonanz: Der Spiegel reflektiert breitbandig (minus das von Interband-Übergängen geschluckte Blau), die Scheibe aber wählt ihre Farbe über die Eigenfrequenz der Elektronenwolke — ein Resonator, dessen Resonanz man über Größe, Form und Umgebung verstimmen kann. Auf diesem Regler beruht ein ganzes Forschungsfeld, die Plasmonik: Biosensoren, die anschlagen, wenn Moleküle die Resonanz verschieben, Nanoantennen, die Licht auf Molekülgröße konzentrieren — und die LSPR-Schnelltests der Medizin (der rötliche Streifen mancher Teststreifen ist kolloidales Gold).
16.7 Das Kapitel-Programm
Das Programm kap16_dispersion.py (im Buchpaket unter programme/kap16/) fasst alle sechs Experimente zusammen: Schwebung, Gitterpaket, Lorentz-Wettrennen samt Auflösungs-Gegenprobe, Prisma, Drude-Messung und Goldscheiben-Spektrum. Jede Behauptung dieses Kapitels steht dort als assert; der Lauf braucht etwa zwei Minuten und endet mit „Alle Tests bestanden.”
TippMerkkasten
Dispersion = Wellentempo hängt von der Frequenz ab. Dann trennen sich \(v_p = \omega/k\) (Berge) und \(v_g = d\omega/dk\) (Paket, Energie, Information).
Glas: gebundene Elektronen = getriebene Resonatoren (Lorentz). Unterhalb der Resonanz wächst \(n\) mit \(f\) — Blau ist das langsame Licht und wird im Prisma stärker geknickt (das Gitter knickt Rot stärker: Geometrie statt Material).
Metall/Plasma: freie Elektronen (Drude), \(\varepsilon = 1 - f_p^2/f^2\). Unter \(f_p\) wird gespiegelt (Metallglanz, Ionosphäre), über \(f_p\) ist \(n < 1\) und \(v_p > c\) — erlaubt, weil Berge keine Boten sind (\(v_p v_g = c^2\), die Front bleibt unter \(c\)).
Numerische und physikalische Dispersion addieren sich — die Kapitel-8-Formel beziffert den Gitteranteil, die Konvergenzleiter schrumpft ihn.
Plasmonen: In Nanometall schwappt die Elektronenwolke als Resonator; eine 100-nm-Goldscheibe streut deshalb Grün am stärksten — darum ist Goldrubinglas rot.
Roter Faden
Rückwärts: Die Schwebung kam mit dem Additionstheorem zustande, das schon Stehwellen (Kapitel 6) und Doppelspalt (Kapitel 14) baute; „Energie sitzt in \(u^2\)” stammt aus Kapitel 4. Die Gitterdispersion aus Kapitel 8 wurde hier zweimal eingelöst: als erstes messbares dispersives Medium — und als Störgröße, die man beziffern muss, bevor man Materialdispersion misst. Der Hand-Detektor aus Kapitel 10 hat die Phasenmessung übernommen, Kapitel 12 lieferte Snellius und den evaneszenten Saum (der im Drude-Medium unter \(f_p\) und im \(\varepsilon<0\)-Fenster des Lorentz-Glases wiederkehrte), Kapitel 13 die Einsicht, dass Polarisation entscheidet (die Plasmonen-Scheibe braucht E quer), und Kapitel 14 das Spektrometer-Rezept „ein Puls, zwei DFT-Fernfelder” fürs Prisma — dessen umgekehrte Sortierung damit erklärt ist. Die Resonatoren aus Kapitel 15 wurden zu Elektronen an Federn: Die Lorentz-Linie ist jetzt Materialantwort, das Plasmon ihr schwappendes Extrem. Vorwärts: Kapitel 17 schickt den evaneszenten Saum durch einen Spalt (Tunneln) und findet die Plasma-Klippe als Hohlleiter-Cutoff wieder; Kapitel 20 verfolgt das Front-Argument bis zur Kausalität; Kapitel 26 baut aus periodischen Strukturen Dispersion nach Maß (Bandlücken = verbotene Fenster wie unser graues \(\varepsilon<0\)-Band); und Kapitel 29 zeigt das Tiefste an alledem: Kausalität erzwingt Dispersion — ein Medium, das alle Farben gleich behandelt und trotzdem absorbiert, kann es nicht geben.
Übungen
Ü 16.1 (Verstehen). Tiefwasserwellen gehorchen \(\omega = \sqrt{gk}\). Zeige von Hand, dass \(v_g = v_p/2\) gilt. Dann zum Sturm vom Kapitelanfang: Am Strand kommt zuerst Dünung mit 16 s Periode an; 24 Stunden später ist die Periode auf 12 s gefallen. Wie weit war der Sturm entfernt? (Tipp: Eine Welle der Frequenz \(f\) braucht für die Strecke \(D\) die Zeit \(t = D/v_g(f)\) — leite daraus her, wie schnell die beobachtete Frequenz pro Tag wächst.)
HinweisMusterlösung zu Ü 16.1
\(v_p = \omega/k = \sqrt{g/k}\) und \(v_g = d\omega/dk =
\tfrac{1}{2}\sqrt{g/k} = v_p/2\) — die Wurzel halbiert die Steigung. Mit \(\omega = 2\pi f\) und \(k = \omega^2/g\) wird \(v_g = g/(4\pi f)\): niedrige Frequenzen reisen schneller, darum kommt die lange Dünung zuerst. Eine Welle der Frequenz \(f\) braucht \(t = D/v_g = 4\pi f D/g\); nach \(t\) Stunden kommt also gerade die Frequenz \(f(t) = g\,t/(4\pi D)\) an — sie wächst linear mit der Zeit, und die Steigung verrät die Distanz: \(D = g/(4\pi\,df/dt)\).
g =9.81df =1/12-1/16# Hz Zuwachs ...dt =24*3600# ... in einem TagD = g / (4* np.pi * df / dt)print(f"Sturmentfernung D = {D/1000:.0f} km")print(f"v_g bei T = 16 s: {g/(4*np.pi/16):.1f} m/s "f"-> Laufzeit {D/(g/(4*np.pi/16))/3600:.0f} h")
Sturmentfernung D = 3238 km
v_g bei T = 16 s: 12.5 m/s -> Laufzeit 72 h
Rund 3200 km — Ozeanografen nutzen genau dieses Verfahren seit den 1940ern, um Sturmgebiete ohne Satelliten zu orten. Die Dünung lief dafür etwa drei Tage.
Ü 16.2 (Verstehen). Berechne \(v_p\) und \(v_g\) auf dem FDTD-Gitter für 4 Punkte pro Wellenlänge bei \(S = 0{,}5\) — und begründe ohne Rechnung, was bei \(S = 1\) herauskäme.
HinweisMusterlösung zu Ü 16.2
\(k\Delta x/2 = \pi/4\): \(\sin(\omega\Delta t/2) = 0{,}5 \cdot
0{,}7071 = 0{,}3536\), also \(\omega\Delta t/2 = 0{,}3614\). Damit \(v_p = \omega/k = (2 \cdot 0{,}3614/0{,}5)/(\pi/2) =
0{,}9202\,c\) und \(v_g = c\cos(\pi/4)/\cos(0{,}3614) =
0{,}7071/0{,}9354 = 0{,}7560\,c\) — bei 4 Punkten pro Wellenlänge schleicht das Paket schon mit Dreiviertel-Tempo.
Bei \(S = 1\) (der magische Zeitschritt, Kapitel 8) wird die Dispersionsrelation zur Geraden \(\omega = ck\): keine Krümmung, \(v_p = v_g = c\) für alle Wellenlängen — auch für 4 Punkte pro Welle. Dispersion braucht eine krumme \(\omega(k)\)-Kurve; der magische Schritt bügelt sie glatt.
Ü 16.3 (Verändern). Rücke den Träger im Lorentz-Glas näher an die Resonanz: \(f = 1{,}5\) (statt 1,2). Berechne erst \(n\), \(n_g\) und die erwartete \(v_g\) (Materialtheorie und kombinierte Theorie mit Gitterfaktor bei Auflösung 40), dann miss nach. Was fällt am Paket auf?
n = 1.9640, n_g = 3.8344
v_g Material = 0.2608 c
v_g kombiniert = 0.2543 c
v_g gemessen = 0.2544 c (v_p = 0.5051 c)
Nahe der Resonanz wird die \(n(f)\)-Kurve steil: \(n_g = 3{,}83\) ist fast doppelt so groß wie \(n = 1{,}96\) — das Paket kriecht mit gut einem Viertel von \(c\), während die Berge noch halbes \(c\) laufen, und die Messung liegt wieder auf der kombinierten Theorie. Außerdem zerfließt das Paket sichtbar stärker als bei \(f = 1{,}2\): Seine Bandbreite erwischt einen Bereich, in dem \(v_g\) selbst stark variiert (Gruppengeschwindigkeits-Dispersion, siehe Kleingedrucktes). Treibt man das Spiel weiter — sehr nah an die Resonanz, mit schwacher Dämpfung — entsteht „slow light”: Im Labor wurden Lichtpulse so auf Fahrradtempo abgebremst.
Ü 16.4 (Verändern). Die Ionosphäre als Streifenexperiment: Lege eine Drude-Schicht der Dicke 2 (\(f_p = 1\)) quer in einen Vakuum-Streifen und schicke je einen schmalbandigen Puls bei \(f = 0{,}7\) und \(f = 1{,}25\) hindurch. Miss die Transmission (Fluss hinter der Schicht, normiert per Referenzlauf ohne Schicht — das Rezept aus Kapitel 12). Erkläre das Ergebnis mit Kurzwellenfunk und Satellitenfunk.
HinweisMusterlösung zu Ü 16.4
# von oben: mp, np, DRUDEdef schichtlauf(f, mit_schicht): quelle = [mp.Source(mp.GaussianSource(f, fwidth=f /8), component=mp.Ez, center=mp.Vector3(-18, 0), size=mp.Vector3(0, 2))] geometrie = ([mp.Block(size=mp.Vector3(2, mp.inf, mp.inf), material=DRUDE)] if mit_schicht else []) sim = mp.Simulation(cell_size=mp.Vector3(44, 2), resolution=40, sources=quelle, geometry=geometrie, boundary_layers=[mp.PML(2.0, direction=mp.X)], k_point=mp.Vector3()) dahinter = sim.add_flux(f, f /8, 1, mp.FluxRegion( center=mp.Vector3(10, 0), size=mp.Vector3(0, 2), direction=mp.X)) sim.run(until_after_sources=120)return mp.get_fluxes(dahinter)[0]for f in (0.7, 1.25): T = schichtlauf(f, True) / schichtlauf(f, False)print(f"f = {f}: Transmission = {T:.2e}")
f = 0.7: Transmission = 5.16e-08
f = 1.25: Transmission = 9.96e-01
Unter der Plasmafrequenz kommt praktisch nichts durch (Transmission \(\sim 10^{-7}\) — die Welle dringt nur evaneszent ein, zwei Einheiten Schichtdicke sind viele Abklinglängen, Kapitel 12), darüber fast alles (\(\approx 0{,}996\); der kleine Rest sind Fresnel-Reflexe an den beiden Schichtgrenzen). Genau diese Klippe nutzt der Funk: Kurzwelle (unter dem \(f_p\) der Ionosphäre, einige MHz) wird am „Plasmaspiegel” zur Erde zurückgeworfen und springt so um den Globus; Satellitenfunk im GHz-Bereich liegt weit über \(f_p\) und durchquert die Schicht, als wäre sie nicht da. Nachts sinkt die Elektronendichte und mit ihr \(f_p\) — darum tragen Mittelwellensender nachts weiter.
Ü 16.5 (Übertragen). Miss das Streuspektrum der Goldscheibe noch einmal, aber mit \(E_z\)-Polarisation (E-Feld parallel zur Scheibenachse). Vergleiche mit der passenden Theorielinie (mie_zylinder(..., polarisation="Ez")). Warum verschwindet der grüne Peak — und warum wächst die Streuung jetzt zu langen Wellenlängen hin?
HinweisMusterlösung zu Ü 16.5
# von oben: streuquerschnitt(), mie_zylinder(), mp, np, pltlam_ez, sigma_ez = streuquerschnitt(200, komponente=mp.Ez)mie_ez = np.array([mie_zylinder(l, 0.05, polarisation="Ez")for l in lam_ez])fig, achse = plt.subplots(figsize=(7, 3.4))achse.axvspan(495, 570, color="green", alpha=0.10)achse.plot(lam_ez *1000, mie_ez *1000, "k-", lw=1.2, label="Zylinder-Theorie ($E_z$-Fall)")achse.plot(lam_ez *1000, sigma_ez *1000, "o", ms=4, mfc="none", color="goldenrod", label="Meep, $E_z$-Polarisation")achse.set(xlabel="Wellenlänge (nm)", ylabel="Streuquerschnitt (nm)", title="Goldscheibe in $E_z$-Polarisation: kein Plasmonen-Peak")achse.legend(fontsize=8)fig.tight_layout()plt.show()abw = np.abs(sigma_ez / mie_ez -1)print(f"Abweichung von der Theorie: im Mittel {np.mean(abw)*100:.1f} %")
Abweichung von der Theorie: im Mittel 0.7 %
Kein Peak im Grünen — die Kurve steigt einfach zu langen Wellen hin. In \(E_z\)-Polarisation schiebt das Feld die Elektronen längs der (in 2D unendlich langen) Scheibenachse: Da gibt es keine Ränder, keine Oberflächenladungen, keine Rückstellkraft — also keinen Resonator und kein Plasmon (Kapitel 13 lässt grüßen: Polarisation entscheidet, welche Physik überhaupt stattfindet). Was bleibt, ist die Scheibe als dünner leitender Draht, in dem das Feld frei Strom treibt — ein winziger Spiegel, der lange Wellen immer effektiver zurückwirft. Bemerkenswert am Rande: Hier liegen schon die 200er-Messpunkte auf etwa ein Prozent an der Theorie — die Treppenstufen am Rand stören kaum noch, weil die empfindliche Physik (die Randladungen des Plasmons) in dieser Polarisation gar nicht existiert.
Das Kleingedruckte
Fünf Randnotizen. Erstens: Die Lorentz-Formel folgt aus Newton für ein Federelektron, \(m\ddot x = -m\omega_0^2 x + qE\): Für \(E \propto e^{-i\omega t}\) ist die Auslenkung \(x =
qE/[m(\omega_0^2 - \omega^2)]\), die Polarisation \(P = Nqx\) liefert \(\varepsilon = 1 + Nq^2/[\varepsilon_0 m(\omega_0^2 -
\omega^2)]\) — unsere Formel mit \(\sigma f_0^2 = Nq^2/(4\pi^2
\varepsilon_0 m)\). Echte Gläser haben mehrere Resonanzen; die Praxisformel der Optikindustrie (Sellmeier) ist schlicht eine Summe solcher Terme. Zweitens: Zwischen Unter- und Oberseite einer Resonanz fällt \(n\) mit \(f\) („anomale Dispersion”) — dort wird auch kräftig absorbiert, und die Gruppengeschwindigkeit verliert ihre einfache Bedeutung als Energietempo; die saubere Schranke, die immer gilt, ist die Frontgeschwindigkeit\(\le c\) (Kapitel 20/29). Drittens: Hängt \(v_g\) selbst von \(f\) ab (das tut es fast immer), zerfließen Pulse unterwegs — Gruppengeschwindigkeits-Dispersion. Für Glasfaser-Strecken ist sie der begrenzende Gegner: Ein Bit, das zerfließt, frisst seinen Nachbarn. Die Gegenmittel — Betrieb nahe 1310 nm, wo die GVD der Quarzfaser durch null geht, oder Kompensationsfasern mit gegenläufiger Dispersion — sind angewandte \(n_g(f)\)-Kurven. Viertens, der versprochene Werkstatt-Fallstrick: Eine GaussianBeamSource prägt der Quelllinie ein festes räumliches Phasenmuster auf. Kippt man den Strahl, gehört zu diesem Muster für jede Frequenz eine andere Richtung (\(\sin\theta \propto 1/f\)) — ein breitbandiger Puls fächert dann nach Farben auf, bevor er das Prisma überhaupt erreicht. Deshalb blieb unser Strahl horizontal (Phasenmuster flach, Richtung frequenzunabhängig) und das Prisma wurde gedreht. Fünftens: Die Plasmonen-Resonanz der Scheibe kann man quasistatisch abschätzen (Resonanz des kleinen Zylinders bei \(\operatorname{Re}\varepsilon = -1\), der Kugel bei \(-2\)) — für Gold landet das bei ~430 nm statt der gemessenen ~520 nm: Bei 100 nm Durchmesser ist die Scheibe nicht mehr „klein gegen \(\lambda\)” (Verzögerungs-Rotverschiebung), und die Interband-Elektronen dämpfen das blaue Ende. Die ausgetippte Zylinder-Reihe kennt all das; die Faustformel liefert nur noch die Richtung „blau-grün”. Solche ehrlichen Abweichungen zwischen Faustformel und exakter Theorie sind in der Plasmonik Alltag.