Dieses Buch hat zwei offene Rechnungen. In Kapitel 16 haben wir Wellenberge gemessen, die mit \(1{,}67\,c\) durch ein Drude-Medium liefen — und beruhigt: Die Front eines Signals sei trotzdem nie schneller als \(c\), das zeigen wir später. In Kapitel 28 haben wir uns zweimal darauf berufen, dass es negative Materialkonstanten „nur mit Dispersion” gibt — auch das ohne Beweis. Beide Schulden begleicht dieses Kapitel, und zwar mit einem einzigen Gedanken, den wir seit Kapitel 20 besitzen: Materie kann nicht antworten, bevor das Feld da ist.
Aus diesem harmlosen Satz folgt Erstaunliches. Der niederländische Physiker Hendrik Kramers und sein deutscher Kollege Ralph Kronig zeigten 1926/27: Wenn die Antwort eines Materials kausal ist, dann sind sein Realteil (die Brechung) und sein Imaginärteil (die Absorption) keine unabhängigen Größen. Wer die Absorption bei allen Frequenzen kennt, kann die Brechzahl bei jeder Frequenz ausrechnen — ohne ein einziges weiteres Experiment. Ein Material kann nicht erst beim Brechen „ja” und beim Schlucken „nein” sagen; beides ist dieselbe Auskunft, einmal als Echo und einmal als Verspätung gelesen. In diesem Kapitel bauen wir diese Rechnung nach: erst am Lorentz-Modell aus Kapitel 16 (maschinen-genau), dann an Meeps echter Gold-Karte — und zum Schluss messen wir im selbstgebauten FDTD, dass die Signalfront tatsächlich nie schneller als \(c\) ist, selbst wenn die Berge das Licht überholen.
Lernziele
Nach diesem Kapitel kannst du …
… die Antwortfunktion\(\chi(t)\) als Gedächtnis der Materie lesen: Die Polarisation ist eine Faltung über die Feld-Vergangenheit, und \(\chi(t)\) des Lorentz-Glases ist wörtlich die gedämpfte Schwingung aus Kapitel 19,
… erklären, warum Kausalität Real- und Imaginärteil von \(\chi(\omega)\) verkettet — mit nichts als der Zerlegung in gerade und ungerade Anteile,
… das Kramers-Kronig-Integral numerisch ausführen (Hauptwert per Subtraktions-Trick) und am Lorentz-Modell auf zehn Stellen verifizieren,
… die Kausalitäts-Probe führen: \(\chi(t)\) per inverser FFT ausrechnen und prüfen, ob vor \(t = 0\) wirklich nichts kommt — und du weißt, warum ein perfekt durchsichtiges Glas mit \(n \neq 1\) daran scheitert,
… erklären, warum das KK-Integral das ganze Spektrum braucht (Meeps Gold-Karte: oben abschneiden verzeiht, unten nicht),
… messen, dass die Signalfront ein Medium ohne jede Verzögerung durchquert — auch bei \(v_p = 1{,}67\,c\).
29.1 Die Antwort kommt zu spät
Bisher haben wir Materialantworten im Frequenzbild geschrieben: \(P(\omega) = \varepsilon_0\,\chi(\omega)\,
E(\omega)\) — bei jeder Frequenz ein eigener Proportionalitätsfaktor. Im Zeitbild steckt hinter so einer frequenzweisen Multiplikation immer eine Faltung (das ist der Faltungssatz aus Kapitel 23, hier rückwärts gelesen):
Die Gleichung erzählt eine kleine Geschichte: Die Polarisation jetzt (\(t\)) entsteht aus dem Feld von vorhin (\(t - \tau\)), gewichtet mit einer Funktion \(\chi(\tau)\), die angibt, wie stark sich die Materie an ein Feld erinnert, das vor der Zeitspanne \(\tau\) anlag. \(\chi(t)\) heißt darum Antwortfunktion — das Gedächtnis des Materials. Und die untere Integralgrenze \(0\) ist keine Bequemlichkeit, sondern Physik: Bei negativem \(\tau\) stünde dort das Feld der Zukunft. Kausalität (Kapitel 20) heißt genau
\[
\chi(t) = 0 \quad \text{für } t < 0 .
\]
Wie sieht so ein Gedächtnis aus? Für das Lorentz-Glas aus Kapitel 16 können wir es erraten, ohne zu rechnen: Dort hängt an jedem Atom ein gedämpfter Oszillator (\(\ddot{P} + \gamma\dot{P} + \omega_0^2 P =
\omega_p^2\,E\), das ist Kapitel 19 in Materialform). Gibt man so einem Oszillator einen einzigen Stoß — ein Delta-Blitz von \(E\) —, dann schwingt er gedämpft aus. Die Antwortfunktion ist diese Ausschwingkurve:
Das prüfen wir jetzt nach — und bauen uns dabei gleich das Werkzeug für den Rest des Kapitels. Versuchsaufbau: Die Frage ist, ob das frequenzweise \(\chi(\omega) =
\omega_p^2/(\omega_0^2 - \omega^2 - \mathrm{i}\gamma\omega)\) aus Kapitel 16 im Zeitbild wirklich diese Ausschwingkurve ergibt — und ob vor \(t = 0\) wirklich nichts kommt. Die Bühne ist ein reines NumPy-Rechenblatt: Wir werten \(\chi(\omega)\) auf einem feinen, symmetrischen Frequenzgitter aus (\(\pm 200\), \(2^{18}\) Punkte) und übersetzen mit der inversen Fourier-Transformation \(\chi(t) = \tfrac{1}{2\pi}\int \chi(\omega)\,
\mathrm{e}^{-\mathrm{i}\omega t}\,\mathrm{d}\omega\) ins Zeitbild. Gemessen werden zwei Zahlen: der größte \(\chi\)-Wert vor\(t = 0\) (Erfolg: praktisch null) und die größte Abweichung von der Kapitel-19-Formel nach\(t = 0\) (Erfolg: ebenso).
import matplotlib.pyplot as pltimport numpy as np# das Lorentz-Glas aus Kapitel 16: Resonanz, Daempfung, StaerkeW0, GAMMA, WP =1.0, 0.1, 1.0def chi_lorentz(w):"""χ(ω) des Lorentz-Oszillators (Zeitfaktor e^{−iωt})."""return WP**2/ (W0**2- w**2-1j* GAMMA * w)# symmetrisches Frequenzgitter: negative UND positive Frequenzen,# denn das Zeitsignal entsteht aus beiden Haelften gemeinsamNT =2**18W_FFT =200.0w_fft = np.linspace(-W_FFT, W_FFT, NT, endpoint=False)dw = w_fft[1] - w_fft[0]def antwortfunktion(chi_w):"""χ(t) = (1/2π) ∫ χ(ω) e^{−iωt} dω, Zeitachse aufsteigend sortiert."""# np.fft.ifftshift: Gegenstueck zu fftshift aus Kap. 28 — schiebt die# Nullfrequenz von der Gittermitte an den Anfang, wie die FFT es will chi_t = np.fft.fft(np.fft.ifftshift(chi_w)) * dw / (2* np.pi)# np.fft.fftfreq: die VOLLE Frequenzachse zur FFT (positive und# negative Werte) — rfftfreq aus Kap. 10 war nur die halbe ts = np.fft.fftfreq(NT, d=dw / (2* np.pi))# np.argsort liefert die Indizes, die ein Array sortieren wuerden —# damit bringen wir Zeitachse und Werte gemeinsam in Reihenfolge ordnung = np.argsort(ts)return ts[ordnung], chi_t[ordnung]ts, chi_t = antwortfunktion(chi_lorentz(w_fft))chi_t = chi_t.real # Imaginaerteil ~ 1e-12 (Realitaets-Check)vorher = np.abs(chi_t[ts <-0.5]).max() / np.abs(chi_t).max()nu = np.sqrt(W0**2- GAMMA**2/4)maske = (ts >0.5) & (ts <40.0)formel = (WP**2/ nu) * np.exp(-GAMMA * ts[maske] /2) * np.sin(nu * ts[maske])abw = np.abs(chi_t[maske] - formel).max() / np.abs(chi_t).max()print(f"vor t=0: |χ| höchstens {vorher:.1e} des Maximums")print(f"nach t=0: Abweichung von der Kap.-19-Formel höchstens {abw:.1e}")
vor t=0: |χ| höchstens 3.5e-07 des Maximums
nach t=0: Abweichung von der Kap.-19-Formel höchstens 3.3e-07
Beide Zahlen liegen bei \(10^{-7}\) — das ist die Güte des endlichen Frequenzfensters, nicht der Physik. Das Gedächtnis des Lorentz-Glases ist exakt die gedämpfte Schwingung aus Kapitel 19, und vor dem Stoß ist es leer:
zoom = (ts >-15) & (ts <50)fig, ax = plt.subplots(figsize=(7.0, 3.6))ax.plot(ts[zoom], chi_t[zoom], "C0-", lw=1.4, label="χ(t) aus iFFT")ax.plot(ts[maske][::1500], formel[::1500], "ko", ms=4, label="Kap.-19-Formel (Stichproben)")ax.axvline(0, color="k", lw=0.8)ax.axhline(0, color="0.8", lw=0.6)ax.annotate("hier wäre die Zukunft —\nund hier ist nichts", xy=(-8, 0.4), fontsize=9, ha="center")ax.set_xlabel("Zeit t seit dem Feld-Blitz")ax.set_ylabel("χ(t)")ax.set_title("Die Materie antwortet mit Gedächtnis — aber nie im Voraus")ax.legend(fontsize=9)plt.show()
Abbildung 29.1: Das Gedächtnis des Lorentz-Glases: die Antwortfunktion χ(t) aus der inversen FFT von χ(ω) (blau) und die Kapitel-19-Ausschwingformel (ω_p²/ν)·e^(−γt/2)·sin(νt) als schwarze Punkte — sie liegen exakt aufeinander. Links der senkrechten Linie (t < 0, vor dem Feld-Blitz) ist die Antwort null auf sieben Stellen: Das ist die Kausalität, aus der dieses Kapitel alles Weitere zieht.
Der Film führt die Faltung vor, die aus diesem Gedächtnis die Polarisation macht: Zwei Feld-Blitze laufen vorbei, und das Material „erinnert” sich an jeden — mit der Ausschwingkurve als Gewicht. Bevor du startest: Was macht \(P(t)\) zwischen den beiden Blitzen, wo \(E = 0\) ist?
Code der Animation (nur in der HTML-Fassung)
from matplotlib import animationfrom IPython.display import HTML# kraeftiger gedaempftes Gedaechtnis, damit der Film kompakt bleibtGAMMA_F =0.35nu_f = np.sqrt(W0**2- GAMMA_F**2/4)dt_f =0.05t_film = np.arange(0, 60, dt_f)e_film = (np.exp(-((t_film -10) /1.5) **2)+0.7* np.exp(-((t_film -28) /1.5) **2))chi_film = np.where(t_film >=0, (WP**2/ nu_f) * np.exp(-GAMMA_F * t_film /2)* np.sin(nu_f * t_film), 0.0)# np.convolve (Kap. 23): diskrete Faltung; mit dt multipliziert wird# daraus das Integral P(t) = ∫ χ(τ) E(t−τ) dτp_film = np.convolve(e_film, chi_film)[:len(t_film)] * dt_ffig, (ax1, ax2) = plt.subplots(2, 1, figsize=(7.2, 5.0), sharex=True)ax1.plot(t_film, e_film, "0.6", lw=1.2, label="E(τ): zwei Blitze")gedaechtnis, = ax1.plot([], [], "C3-", lw=1.4, label="Gedächtnis χ(t−τ) (rückwärts)")ax1.axhline(0, color="0.85", lw=0.6)ax1.set_ylabel("E bzw. χ")ax1.set_ylim(-1.1, 1.3)ax1.legend(fontsize=8, loc="upper right")ax2.plot(t_film, p_film, "C0-", lw=0.8, alpha=0.3)spur, = ax2.plot([], [], "C0-", lw=1.8)punkt, = ax2.plot([], [], "C0o", ms=6)ax2.axhline(0, color="0.85", lw=0.6)ax2.set_xlabel("Zeit τ")ax2.set_ylabel("P(t)")titel = ax1.set_title("", fontsize=10)fig.subplots_adjust(top=0.9, hspace=0.15)bilder = np.linspace(40, len(t_film) -1, 36).astype(int)def bild(i): j = bilder[i] t_jetzt = t_film[j]# das Gedaechtnis laeuft rueckwaerts ueber die Vergangenheit:# an der Stelle τ zaehlt χ(t_jetzt − τ). np.interp: lineare# Interpolation — liest chi_film an den gespiegelten Stellen ab chi_rueck = np.where(t_film <= t_jetzt, np.interp(t_jetzt - t_film, t_film, chi_film), 0.0) gedaechtnis.set_data(t_film, chi_rueck) spur.set_data(t_film[:j +1], p_film[:j +1]) punkt.set_data([t_jetzt], [p_film[j]]) titel.set_text("Faltung: das Gedächtnis wird über die Vergangenheit ""geschoben\n"f"t = {t_jetzt:.1f} — P(t) klingt nach JEDEM Blitz nach")return [gedaechtnis, spur, punkt, titel]anim = animation.FuncAnimation(fig, bild, frames=len(bilder), interval=160)plt.close(fig)HTML(anim.to_jshtml(default_mode="loop"))
Zwischen den Blitzen schwingt \(P(t)\) munter weiter — das Material erinnert sich, obwohl das Feld längst null ist. Genau dieses Nachklingen ist die Dispersion: Die Antwort hängt nicht vom Augenblickswert des Feldes ab, sondern von seiner Geschichte — und damit, im Frequenzbild, von der Frequenz.
29.2 Die halbe Funktion bestimmt die ganze
Jetzt kommt der zentrale Gedanke des Kapitels — und er braucht keine höhere Mathematik, nur einen Trick, der dir in Kapitel 10 schon einmal begegnet ist: Jede Funktion lässt sich in einen geraden und einen ungeraden Anteil zerlegen,
Für eine beliebige Funktion sind \(\chi_g\) und \(\chi_u\) unabhängig voneinander. Für eine kausale Funktion nicht! Denn für \(t < 0\) ist \(\chi(t) = 0\), also \(\chi_g(t) = \chi(-t)/2\) und \(\chi_u(t) = -\chi(-t)/2\) — die beiden Anteile sind dort exakt entgegengesetzt. Und für \(t > 0\) sind sie exakt gleich (beide \(\chi(t)/2\)). Kompakt:
\[
\chi_u(t) = \mathrm{sgn}(t)\cdot\chi_g(t) .
\]
Wer den geraden Anteil kennt, kennt also automatisch den ungeraden — die halbe Funktion bestimmt die ganze. Das prüfen wir sofort am Lorentz-Gedächtnis von oben nach:
# symmetrisches Zeitgitter um 0, Werte vom FFT-Gitter uebernomment_sym = np.linspace(-40, 40, 8001)# np.interp: lineare Interpolation — liest chi_t an den neuen Stellen abc_sym = np.interp(t_sym, ts, chi_t)gerade = (c_sym + c_sym[::-1]) /2# [::-1] spiegelt: χ(−t)ungerade = (c_sym - c_sym[::-1]) /2probe = np.abs(ungerade - np.sign(t_sym) * gerade).max() / np.abs(c_sym).max()print(f"χ_u = sgn(t)·χ_g erfüllt bis auf {probe:.1e}")
χ_u = sgn(t)·χ_g erfüllt bis auf 5.0e-04
Warum ist das der Schlüssel? Erinnere dich an Kapitel 10: Bei der Fourier-Transformation gehört der gerade Anteil einer reellen Funktion zum Realteil des Spektrums, der ungerade zum Imaginärteil. Die Kette schließt sich:
Aus \(\mathrm{Im}\,\chi\) lässt sich \(\chi_u\) bauen, daraus per \(\mathrm{sgn}\)-Multiplikation \(\chi_g\), daraus \(\mathrm{Re}\,\chi\) — Real- und Imaginärteil einer kausalen Antwort sind zwei Lesarten derselben Information. Führt man die drei Pfeile formal aus (die \(\mathrm{sgn}\)-Multiplikation wird im Frequenzraum zu einer Faltung mit \(1/\omega\) — die Rechnung steht im Kleingedruckten), entsteht die berühmte Kramers-Kronig-Relation:
Lies sie ruhig zweimal: Links steht die Brechung bei einer Frequenz, rechts ein Integral über die Absorption bei allen Frequenzen. Das \(\mathcal{P}\) („Hauptwert”) warnt vor der Stelle \(\omega' = \omega\), an der der Nenner null wird — dazu gleich. Die Relation funktioniert auch umgekehrt (Re rein, Im raus, mit einem Minuszeichen); wir arbeiten mit der Richtung, die Messpraxis hat: Absorption ist meist leichter zu messen als Brechung.
29.3 Das Hauptwert-Integral zähmen
Ein Integral, dessen Integrand bei \(\omega' = \omega\) durch null teilt, sieht nach Ärger aus. Der Hauptwert rettet es: Man nähert sich der heiklen Stelle von beiden Seiten gleich schnell, und weil der Integrand links und rechts davon entgegengesetzte Vorzeichen hat, heben sich die beiden Unendlichkeiten weg. Numerisch gibt es dafür einen Trick, der so einfach ist, dass er fast verdächtig wirkt — der Subtraktions-Trick. Wir schreiben den Zähler als \(h(\omega') = \omega'\,\mathrm{Im}\,\chi(\omega')\) und ziehen seinen Wert an der heiklen Stelle ab:
Der erste Integrand ist nirgends mehr singulär: An der Stelle \(\omega' = \omega\) wird er zu „\(0/0\)” mit dem harmlosen Grenzwert \(h'(\omega)/(2\omega)\) — eine normale Zahl, die np.trapezoid problemlos verdaut. Und das zweite Integral enthält gar kein \(h\) mehr; es ist eine Schulbuch-Stammfunktion (\(\ln\)-Ausdruck), die wir von Hand hinschreiben. Versuchsaufbau: Frage — rekonstruiert das KK-Integral aus dem Imaginärteil des Lorentz-\(\chi\) den Realteil? Bühne: Integrationsgitter von fast 0 bis \(W = 400\) mit 800 000 Punkten; ausgewertet wird an 60 Teststellen zwischen \(\omega = 0{,}05\) und \(3\) (bewusst um einen halben Gitterabstand versetzt, damit keine Teststelle exakt auf einem Integrationspunkt liegt — sonst wird der „glatte” Quotient dort numerisch doch wieder wacklig). Messgröße: die größte Abweichung vom exakten \(\mathrm{Re}\,\chi\). Erfolgskriterium: nahe Maschinengenauigkeit — die Relation ist ja exakt.
def kk_re(w_aus, ws, im_funktion):"""Re χ an den Stellen w_aus aus Im χ (Kramers-Kronig). ws: Integrationsgitter (beginnt nahe 0); im_funktion(ω) liefert Im χ. Der Wert an der heiklen Stelle wird exakt ausgewertet.""" h = ws * im_funktion(ws) # Zaehler des Integranden re = np.empty(len(w_aus)) a, b = ws[0], ws[-1]for k, w inenumerate(w_aus): hw = w * im_funktion(w) # h an der heiklen Stelle glatt = (h - hw) / (ws**2- w**2) # nirgends mehr singulaer# Hauptwert des Rest-Integrals ∫ dω′/(ω′²−ω²) von a bis b,# von Hand integriert (Partialbruch → Logarithmus): rest = hw / (2* w) * np.log(abs((b - w) * (a + w)/ ((b + w) * (a - w)))) re[k] = (2/ np.pi) * (np.trapezoid(glatt, ws) + rest)return rews = np.linspace(1e-6, 400.0, 800_000)w_test = np.linspace(0.05, 3.0, 60) + (ws[1] - ws[0]) /2re_kk = kk_re(w_test, ws, lambda w: chi_lorentz(w).imag)fehler = np.abs(re_kk - chi_lorentz(w_test).real).max()print(f"größter Fehler der Rekonstruktion: {fehler:.1e}")
größter Fehler der Rekonstruktion: 3.3e-10
Zehn Stellen. Aus der Absorptionskurve allein entsteht die komplette Brechungskurve — inklusive des anomalen Einbruchs an der Resonanz und der Flügel weit draußen:
Abbildung 29.2: Kramers-Kronig bei der Arbeit: Aus dem Imaginärteil des Lorentz-χ (rot, die Absorptionslinie — das ist die EINZIGE Eingabe) rekonstruiert das Hauptwert-Integral den Realteil an 60 Teststellen (schwarze Punkte). Die blaue Linie ist der exakte Realteil: Die Punkte liegen mit einem größten Fehler von 3·10⁻¹⁰ darauf — Brechung und Absorption sind eine einzige Information.
In der Spielwiese kannst du dem Integral beim Arbeiten zusehen — und es absichtlich verhungern lassen. Drei Aufträge, erst vorhersagen: (1) Verbreitere die Linie (GAMMA_SW = 0.5) — bleibt die Rekonstruktion gut? (2) Schalte mit STAERKE_2 = 0.5 eine zweite Linie bei \(\omega = 2\) dazu — muss das Integral davon wissen? (3) Schrumpfe das Integrationsfenster auf W_FENSTER = 3.0 — wo reißt die Rekonstruktion zuerst ab?
Zu (3): Der Abriss beginnt am oberen Rand der Teststellen — die Flügel der Rekonstruktion hängen am abgeschnittenen Schwanz des Integrals. Wie schnell der Schaden mit dem Fenster wächst, vermisst Übung 29.4.
29.4 Die Kausalitäts-Probe
Die Relation kann mehr als rekonstruieren: Sie kann Materialien verbieten. Wenn Re und Im zusammengehören, dann kann man nicht beliebige Wunschpaare hinschreiben — und das prüfen wir jetzt an einem Wunschtraum der Optik.
HinweisVorhersage (PRIMM)
Wir nehmen das Lorentz-\(\chi\) und löschen den Imaginärteil: \(\chi_{\text{Spiel}}(\omega) =
\mathrm{Re}\,\chi(\omega)\), also volle Dispersion, aber null Absorption bei allen Frequenzen — ein perfekt durchsichtiges dispersives Glas. Dann rechnen wir wie in Abbildung 29.1 die Antwortfunktion \(\chi(t)\) aus. Was kommt heraus — (a) dieselbe Ausschwingkurve wie vorher, (b) eine etwas verformte, aber immer noch kausale Kurve, oder (c) etwas grundsätzlich Kaputtes?
Die Maschine dafür haben wir schon — ein Aufruf genügt:
ts2, spiel_t = antwortfunktion(chi_lorentz(w_fft).real +0j)spiel_t = spiel_t.realverletzung = np.abs(spiel_t[ts2 <-0.5]).max() / np.abs(spiel_t).max()print(f"Spiel-χ: |χ(t<0)| erreicht {verletzung:.2f} des Maximums")
Spiel-χ: |χ(t<0)| erreicht 1.00 des Maximums
Antwort (c), und zwar maximal kaputt: Die Antwortfunktion wird exakt gerade — das halbe Echo kommt vor dem Knall. Kein Wunder: Ein reiner Realteil ist eine gerade Funktion von \(\omega\), und die inverse FFT einer geraden reellen Funktion ist zwangsläufig gerade in \(t\). Unser Wunschglas müsste anfangen zu schwingen, bevor der Feld-Blitz eintrifft:
zoom = (ts >-40) & (ts <40)fig, ax = plt.subplots(figsize=(7.0, 3.8))ax.plot(ts[zoom], chi_t[zoom], "C0-", lw=1.2, label="Lorentz-χ(t): kausal")ax.plot(ts2[zoom], spiel_t[zoom], "C3-", lw=1.2, alpha=0.85, label="Spiel-χ(t): Im = 0 erzwungen")ax.axvline(0, color="k", lw=0.8)ax.set_xlabel("Zeit t seit dem Feld-Blitz")ax.set_ylabel("χ(t)")ax.set_title("Absorption gelöscht — das halbe Echo kommt vor dem Knall")ax.legend(fontsize=9, loc="upper left")plt.show()
Abbildung 29.3: Die Kausalitäts-Probe: das ehrliche Lorentz-χ(t) (blau) beginnt exakt bei t = 0. Das Spiel-Material mit gelöschter Absorption (rot) hat dieselbe Dispersion — aber seine Antwortfunktion ist spiegelsymmetrisch: Sie schwingt schon VOR dem Blitz (links der schwarzen Linie), mit voller halber Amplitude. Ein dispersives Material ohne jede Absorption müsste hellsehen.
WarnungNaheliegende Vermutung: „Ein perfekt durchsichtiges Glas mit n ≠ 1 bei allen Frequenzen ist nur eine Frage der Materialkunst“
Warum sie naheliegt: Fensterglas wirkt im Sichtbaren verlustfrei und hat trotzdem \(n = 1{,}5\) — warum sollte man das nicht auf alle Frequenzen ausdehnen können, wenn man nur das richtige Material fände?
Was stattdessen stimmt:Abbildung 29.3 ist der Unmöglichkeitsbeweis. \(n \neq 1\) heißt \(\chi \neq 0\), und ein \(\chi\), dessen Imaginärteil überall null ist, hat eine zeitlich gerade Antwortfunktion — es müsste antworten, bevor gefragt wird. Echtes Glas trickst nicht, es verlagert: Seine Absorption wohnt im Ultravioletten und Infraroten (Übung 29.1 rechnet nach, dass die BK7-Resonanzen bei 77 nm, 141 nm und 10 µm sitzen — alle außerhalb des Sichtbaren). Das \(n = 1{,}5\) im Sichtbaren ist das Kramers-Kronig-Echo dieser unsichtbaren Absorptionslinien. Durchsichtig in einem Fenster ist erlaubt — durchsichtig überall nicht. Und nebenbei ist damit auch der Kapitel-28-Kredit eingelöst: \(\chi \neq 0\) erzwingt Absorption irgendwo, Absorption erzwingt über KK Frequenzabhängigkeit — negative Konstanten ohne Dispersion kann es nicht geben.
Die Spielwiese macht aus dem Alles-oder-nichts ein Stufenlos: Der Regler ANTEIL_IM skaliert den Imaginärteil zwischen 1 (ehrlich) und 0 (Wunschglas). Vorhersage: Bei ANTEIL_IM = 0.5 — ist die Antwort dann „halb kausal”? Und warum zeigt die Kennzahl bei 0 exakt 1,00?
Bei ANTEIL_IM = 0.5 schwingt das Vorab-Echo mit einem Drittel des Maximums — Kausalität ist keine Eigenschaft, die man teilweise haben kann; jede Abweichung vom ehrlichen Im-Re-Paar erzeugt sofort Antwort vor der Ursache. Und bei 0 ist die Funktion exakt gerade: Vorab-Echo = Nach-Echo.
29.5 Die Absorption ist global festgenagelt
Aus der Verkettung folgt noch eine Zugabe, die wir gleich für Gold brauchen werden. Weit oberhalb aller Resonanzen können die Elektronen dem Feld nur noch als freie Teilchen folgen; jedes Material wird dort zum Drude-Plasma mit \(\chi \to -\omega_p^2/\omega^2\) (Kapitel 16). Setzt man dieses Verhalten in die KK-Relation ein, fällt für \(\omega \to \infty\) heraus:
Das ist die f-Summenregel: Die Gesamtfläche unter der (gewichteten) Absorptionskurve ist durch die Elektronendichte festgelegt — egal, wie sich die Absorption auf Linien verteilt. Ein Material kann seine Absorption verschieben (in den UV-Bereich, wie Glas), aber nicht löschen. Die Probe am Lorentz-Modell:
integral = np.trapezoid(ws * chi_lorentz(ws).imag, ws)# was jenseits von W = 400 fehlt, von Hand: Im χ → γω_p²/ω′³,# also ∫_W^∞ ω′·Im χ dω′ ≈ γω_p²/Wauslaeufer = GAMMA * WP**2/400.0print(f"Integral bis 400: {integral:.6f}")print(f"+ Ausläufer-Restwert {auslaeufer:.6f} → "f"{integral + auslaeufer:.6f}")print(f"Sollwert π/2·ω_p² = {np.pi /2* WP**2:.6f}")
Integral bis 400: 1.570546
+ Ausläufer-Restwert 0.000250 → 1.570796
Sollwert π/2·ω_p² = 1.570796
Hübsches Detail: Das numerische Integral verfehlt \(\pi/2\) um exakt den von Hand gerechneten Ausläufer \(\gamma\omega_p^2/W\) — die Abweichung ist keine Ungenauigkeit, sondern der ehrlich fehlende Schwanz. Merke dir diesen Schwanz; beim Gold gleich entscheidet sein Gegenstück am unteren Rand über Erfolg und Desaster.
29.6 Realwelt-Probe: Meeps Goldkarte
Genug Modell — jetzt echte Materialdaten. meep.materials.Au ist Meeps Gold: ein Drude-Term plus fünf Lorentz-Linien, angepasst an Messdaten (gültig zwischen \(0{,}2\) und \(12{,}4\) µm Wellenlänge; die Suszeptibilitäten kennen wir seit Kapitel 16). Wenn unser Satz stimmt, muss diese Karte Kramers-Kronig erfüllen — sie ist ja aus kausalen Bausteinen zusammengesetzt. Aber sie gibt uns auch Gelegenheit für eine ehrliche Lektion: Was passiert, wenn man — wie jedes echte Labor — die Absorption nur in einem Messfenster kennt? Versuchsaufbau: Frage — rekonstruiert das KK-Integral \(\mathrm{Re}\,\varepsilon\) von Gold im Sichtbaren (a) aus dem fast vollständigen Spektrum (\(f'\) von nahe 0 bis 1000, in Meep-Einheiten \(f = 1/\lambda\) in µm) und (b) nur aus dem Fit-Fenster \(0{,}08\) bis \(5\)? Messgröße: die größte Abweichung von der Karte an elf Punkten zwischen \(\lambda = 400\) und 800 nm. Erwartung: (a) sehr gut, (b) deutlich schlechter — wie deutlich, ist die Lektion.
import meep as mpfrom meep.materials import Audef eps_gold(f):"""ε(f) aus Meeps Au-Karte, als analytische Drude-Lorentz-Summe. (Au.epsilon() selbst verweigert Frequenzen außerhalb des Fit-Fensters — die Summenformel ist überall definiert.)"""# np.asarray: macht aus Skalar oder Liste ein Array, ohne Kopie,# wenn es schon eines ist — so schluckt die Funktion beides f = np.asarray(f, float) eps = np.full(f.shape, complex(Au.epsilon_diag.x))for s in Au.E_susceptibilities: f0, g, sig = s.frequency, s.gamma, s.sigma_diag.xifisinstance(s, mp.DrudeSusceptibility): eps +=-sig * f0**2/ (f**2+1j* f * g)else: eps += sig * f0**2/ (f0**2- f**2-1j* f * g)return epsf_seh = np.linspace(1.25, 2.5, 11) # sichtbar: λ = 800 … 400 nmeps_karte = eps_gold(f_seh)print(f"Gold bei λ = 800 nm: ε = {eps_karte[0]:.2f}")# (a) fast das ganze Spektrum — nahe 0 logarithmisch verdichtet!# np.unique: sortiert und entfernt Doppelte — naehte der Teilgitterfs_breit = np.unique(np.concatenate([ np.geomspace(1e-6, 0.5, 100_000), np.linspace(0.5, 20.0, 400_000), np.geomspace(20.0, 1000.0, 60_000)]))re_breit = kk_re(f_seh, fs_breit, lambda f: eps_gold(f).imag) +1.0print(f"(a) KK mit f′ bis 1000: größte Abw. "f"{np.abs(re_breit - eps_karte.real).max():.1e}")# (b) nur das Fit-Fensterfs_fenster = np.linspace(0.0807, 5.0, 200_000)re_fenster = kk_re(f_seh, fs_fenster, lambda f: eps_gold(f).imag) +1.0print(f"(b) KK nur Fenster 0,08–5: größte Abw. "f"{np.abs(re_fenster - eps_karte.real).max():.1f} (!)")
Using MPI version 4.1, 1 processes
Gold bei λ = 800 nm: ε = -20.28+2.07j
(a) KK mit f′ bis 1000: größte Abw. 3.8e-04
(b) KK nur Fenster 0,08–5: größte Abw. 15.7 (!)
Mit dem ganzen Spektrum trifft das Integral die Karte auf vier Nachkommastellen — reale Materialdaten erfüllen Kramers-Kronig, so wie es der Satz verlangt. Mit dem Fenster allein liegt es um 15 daneben — bei einem Sollwert von \(-20\) ist das kein Messfehler mehr, sondern ein anderes Material:
fig, ax = plt.subplots(figsize=(7.0, 3.8))ax.plot(f_seh, eps_karte.real, "C0-", lw=1.6, label="Re ε (Goldkarte)")ax.plot(f_seh, re_breit, "ko", ms=4.5, label="KK, f′ bis 1000")ax.plot(f_seh, re_fenster, "C3s", ms=4.5, label="KK, nur Fenster 0,08–5")ax.axhline(0, color="0.85", lw=0.6)ax.set_xlabel("f = 1/λ [1/µm] (sichtbares Band)")ax.set_ylabel("Re ε")ax.set_title("Reale Daten erfüllen KK — aber nur das ganze Konto stimmt")ax.legend(fontsize=9)plt.show()
Abbildung 29.4: Gold im Sichtbaren: Re ε aus Meeps Materialkarte (blaue Linie) gegen die KK-Rekonstruktion aus Im ε. Mit Integrationsbereich bis f′ = 1000 (schwarze Punkte) liegt die Rekonstruktion exakt auf der Karte (Abweichung 4·10⁻⁴). Nur mit dem Messfenster 0,08–5 (rote Quadrate) fehlt vor allem der Drude-Anteil unterhalb des Fensters — und die Rekonstruktion verliert über 15 Einheiten. Das KK-Integral ist ein Konto: Es stimmt nur, wenn alle Posten gebucht sind.
Warum ist das Fenster so katastrophal, wo doch unser Lorentz-Integral oben bei \(W = 400\) enden durfte, ohne dass auch nur eine der zehn Stellen verloren ging? Schau, wo das Fenster schneidet.
WichtigWerkstattkasten: oben abschneiden verzeiht — unten nicht
Der Integrand der KK-Relation ist \(h(\omega') = \omega'
\,\mathrm{Im}\,\chi(\omega')\). Am oberen Ende fällt \(h\) bei jedem realen Material wie \(1/\omega'^2\); der abgeschnittene Schwanz kostet einen Fehler \(\propto 1/W^3\) (Übung 29.4 misst genau dieses Gesetz) — darum durften wir beim Lorentz-Modell sorglos bei \(W = 400\) aufhören. Am unteren Ende ist Gold aber ein Leiter: Der Drude-Term hat \(\mathrm{Im}\,\chi \propto 1/\omega'\), also läuft \(h\) auf das Plateau\(h(0) = \sigma f_0^2/\gamma \approx 1241\) — ein riesiger Buckel der Breite \(\gamma_D \approx 0{,}04\), und das Messfenster ab \(0{,}08\) schneidet ihn komplett weg. Dieses Loch kostet linear (\(\propto a\) bei unterer Grenze \(a\)) mit dem Riesen-Vorfaktor \(\omega_p^2/\gamma\). Praktische Folgen: (1) Beim numerischen KK-Integral für Leiter das Gitter bis fast 0 führen und dort verdichten (unser geomspace-Stück — ein erster Versuch mit Untergrenze \(10^{-3}\) lag um \(0{,}4\) daneben); (2) im Labor, wo man unterhalb des Messfensters schlicht keine Daten hat, rettet man sich mit verankerten Varianten der Relation („subtraktive KK”, Kleingedrucktes).
29.7 Die Front läuft nie schneller als c
Bleibt die älteste Schuld: Kapitel 16 hat im Drude-Medium \(v_p = 1{,}67\,c\)gemessen — Wellenberge, schneller als das Licht. Die beruhigende Auskunft, ein Signal sei trotzdem nie schneller als \(c\), blieb unbewiesen. Der Beweis-Gedanke gehört in dieses Kapitel, denn er ist derselbe wie bisher: Das Medium ist ein Haufen Oszillatoren mit Gedächtnis. Wenn die allererste Feldfront eintrifft, haben die Oszillatoren noch nichts gespürt — sie können noch nicht mitspielen. Die Front sieht das Medium schlicht nicht; sie läuft mit Vakuum-\(c\), und erst das Nachfolgende wird gebremst, gebrochen, verformt.
Das messen wir jetzt — und zwar nicht in Meep, sondern im selbstgebauten 1D-FDTD aus Kapitel 5/6, erweitert um genau eine Idee: An jeden Gitterpunkt im Medium hängen wir einen Kapitel-19-Oszillator. Das ist keine Metapher, sondern der Algorithmus (Meep macht es interessanterweise genauso; das Verfahren heißt ADE, auxiliary differential equation). Drei Bausteine:
Maxwell läuft über \(D\): Statt \(E\) direkt updaten wir \(D = E + P\) mit der gewohnten Nachbar-Differenz-Zeile aus Kapitel 5.
Der Oszillator liefert \(P\):\(\ddot{P} + \gamma
\dot{P} + \omega_0^2 P = \omega_p^2 E\), diskretisiert mit zentrierten Differenzen — exakt das Kapitel-19-Schema. Aufgelöst nach dem neuen Wert: \(P^{n+1} = k_a P^n + k_b P^{n-1} + k_c E^n\) mit den drei Koeffizienten aus der Zelle unten (Zähler \(2 -
\omega_0^2\Delta t^2\) bzw. \(-(1 - \gamma\Delta t/2)\) und \(\omega_p^2 \Delta t^2\), gemeinsamer Nenner \(1 +
\gamma\Delta t/2\) — dieselbe Bauform wie beim gedämpften Schwingkreis).
Der Material-Schritt:\(E^{n+1} = D^{n+1} - P^{n+1}\). Im Vakuum ist \(P = 0\) und alles kollabiert auf das alte Kapitel-5-Update.
Versuchsaufbau: Die Bühne ist eine Zeile aus 3200 Zellen (\(\Delta x = 1\), \(c = 1\), \(S = \Delta t = 0{,}5\)); bei \(x = 20\) sitzt eine weiche (additive) CW-Quelle, die bei \(t = 0\)abrupt einsetzt — der Einschalt-Knick ist hier kein Unfall wie in Kapitel 22, sondern das Messobjekt: Er ist die Front. Ab \(x = 400\) beginnt das Medium. Drei Messgrößen: (1) der Brechungsindex aus der Wellenlänge im eingeschwungenen Medium (dominante Raumfrequenz per FFT — die Nulldurchgangs-Methode stolpert hier über Restwelligkeits-Doppelnullen); (2) die Gruppengeschwindigkeit aus der Schwerpunkt-Laufzeit eines schmalbandigen Gauß-Pulses zwischen zwei Detektoren; (3) die Front-Verzögerung — dazu gleich mehr. Erfolgskriterium: \(n\) und \(v_g\) treffen die Kapitel-16-Formeln; die Front-Verzögerung ist null.
DT =0.5# S = 0,5 — mit S = 1 ist das ADE-Schema instabilNX =3200X_Q, X_MED =20, 400F_TR =0.05# Traegerfrequenz: λ = 20 ZellenW_TR =2* np.pi * F_TRdef fdtd_lauf(w0, gamma, wp2, nt, medium=True, quelle=None):"""1D-FDTD mit Lorentz-Medium ab X_MED; liefert E(t, x).""" e = np.zeros(NX); b = np.zeros(NX -1); d = np.zeros(NX) p = np.zeros(NX); p_alt = np.zeros(NX) med = np.zeros(NX, bool)if medium: med[X_MED:] =True nenner =1+ gamma * DT /2# Kap.-19-Koeffizienten ka = (2- w0**2* DT**2) / nenner kb =-(1- gamma * DT /2) / nenner kc = wp2 * DT**2/ nennerif quelle isNone: quelle =lambda t: np.sin(W_TR * t) serie = np.empty((nt, NX))for n inrange(nt): d[1:-1] += DT * np.diff(b) # Maxwell: D-Update (Kap. 5) p_neu = np.where(med, ka * p + kb * p_alt + kc * e, 0.0) p_alt, p = p, p_neu # Oszillator-Update (Kap. 19) e = d - p # Material-Schritt: E = D − P e[X_Q] += quelle(n * DT) # weiche Quelle, abrupt ab t = 0 e[0] = e[-1] =0.0 b += DT * np.diff(e) # Maxwell: B-Update serie[n] = ereturn seriedef k_dominant(profil):"""dominante Raumfrequenz: FFT + Hanning + Zero-Padding + Parabel.""" s = (profil - profil.mean()) * np.hanning(len(profil)) sp = np.abs(np.fft.rfft(s, n=8*len(profil))) fr = np.fft.rfftfreq(8*len(profil), d=1.0) i = np.argmax(sp) a, m, c = sp[i -1], sp[i], sp[i +1]return fr[i] +0.5* (a - c) / (a -2* m + c) * (fr[1] - fr[0])def schwerpunkt_zeit(signal, nt): s = signal**2return (np.arange(nt) * DT * s).sum() / s.sum()
Zuerst das Lorentz-Glas: Resonanz bei \(f_0 = 0{,}15\), Stärke so gewählt, dass \(n(f_{\text{Tr}}) = 1{,}5\) — unser Standardglas, aber diesmal ehrlich dispersiv:
Glas: n = 1.512 (Soll 1,500; Rest ist Gitterdispersion)
v_g = 0.608 c (Soll 1/n_g = 0.623 c)
Index und Gruppentempo treffen ihre Theoriewerte auf Prozent-Niveau (den Rest teilen sich die Gitterdispersion aus Kapitel 8 und die Verformung des Pulses durch die Frequenzabhängigkeit von \(v_g\) selbst). Jetzt die Front. Die naive Messung — „wann überschreitet \(|E|\) am Detektor eine Schwelle?” — hat einen Haken, der ehrlich benannt gehört: Unser Gitter mit \(S = 0{,}5\) transportiert Information mit bis zu einer Zelle pro Zeitschritt, also \(2c\); winzige numerische Vorläufer (bis \(4\cdot 10^{-3}\) der Amplitude) lecken über die \(c\)-Linie, ganz ohne Physik. Der saubere Ausweg ist ein Differenz-Experiment: Wir fahren denselben Lauf zweimal — einmal mit, einmal ohne Medium — und fragen, wann sich die beiden Läufe am Detektor zum ersten Mal unterscheiden. Alles, was das Gitter an Artefakten produziert, steckt in beiden Läufen gleich und kürzt sich; übrig bleibt allein die Wirkung des Mediums. Kann das Medium die Front bremsen (oder schieben), dann trennen sich die Läufe später (oder früher) als die Vakuum-Front-Ankunft.
HinweisVorhersage (PRIMM)
Jetzt das Drude-Medium aus Kapitel 16, Arbeitspunkt oberhalb der Plasmafrequenz: \(n = 0{,}6\), die Berge laufen mit \(v_p = 1{,}67\,c\). Der Differenz-Detektor steht 1000 Zellen tief im Medium. Trennen sich Medium-Lauf und Vakuum-Lauf dort (a) früher als die Vakuum-Front (das Medium „schiebt” — Information mit Überlicht), (b) genau mit der Vakuum-Front, oder (c) später (das Medium bremst auch die Front)? Und beim Glas aus dem letzten Lauf — gilt dort dieselbe Antwort?
Glas (n = 1,5): Front-Verzug 0.0 Zeiteinheiten
Drude: n = 0.599 → v_p = 1.67 c; v_g = 0.609 c
Front-Verzug 0.0 Zeiteinheiten
Antwort (b), in beiden Medien: Front-Verzug null. Im Glas braucht der Puls-Schwerpunkt gut 700 Zeiteinheiten länger als durchs Vakuum — die allererste Regung kommt keinen einzigen Zeitschritt später an. Und im Drude-Medium laufen die Berge mit \(1{,}67\,c\), die Energie kriecht mit \(0{,}6\,c\) — und die Front hält exakt Vakuum-Tempo. Drei Geschwindigkeiten in einem Lauf, und nur eine davon ist eine Verkehrsregel:
fig, ax = plt.subplots(figsize=(7.0, 4.4))schritte = np.arange(0, 7000, 14)xt = np.log10(np.abs(cw_drude[schritte, :2400]) +1e-12)ax.imshow(xt, origin="lower", aspect="auto", cmap="inferno", extent=[0, 2400, 0, 7000* DT], vmin=-8, vmax=0)tt = np.linspace(0, 7000* DT, 50)ax.plot(X_Q + tt, tt, "w--", lw=1.2, label="Front-Soll: x = x₀ + c·t")tg = tt[tt > X_MED - X_Q] # v_g-Linie erst ab dem Mediumax.plot(X_MED + (tg - (X_MED - X_Q)) *0.6, tg, "c-", lw=1.2, label="Energie: v_g = 0,6 c")ax.axvline(X_MED, color="w", lw=0.6)ax.set_xlim(0, 2400)ax.set_ylim(0, 7000* DT)ax.set_xlabel("x [Zellen] (Medium ab x = 400)")ax.set_ylabel("Zeit t")ax.set_title("Berge mit 1,67 c — die Front bleibt auf der c-Linie")ax.legend(fontsize=9, loc="upper left")plt.show()
Abbildung 29.5: Das Front-Rennen im Drude-Medium als Weg-Zeit-Bild (Farbskala: log|E|; Medium rechts der weißen Linie bei x = 400). Die gestrichelte weiße Gerade ist die Vakuum-Lichtlinie x = x₀ + ct: Die Feldkante klebt exakt auf ihr, im Vakuum wie im Medium. Die cyanfarbene Linie ist die Gruppengeschwindigkeit 0,6 c — auf ihr wandert die Hauptenergie. Und die Wellenberge im Medium (die feinen Streifen) sind FLACHER geneigt als die c-Linie: Sie laufen mit 1,67 c, von der Front geboren und am v_g-Rücken sterbend. Schneller als Licht sind nur die Muster — nicht die Botschaft. (Das Dreiecksmuster links stammt von der Teilreflexion an der Mediumgrenze, die zwischen dem linken Zellrand und dem Medium hin- und herläuft.)
Das ist Kramers-Kronig im Zeitbild, mit denselben Worten wie am Kapitelanfang: Die Oszillatoren des Mediums haben von der Welle noch nichts gespürt, wenn die Front eintrifft — für die Front ist jedes Medium Vakuum. Erst hinter ihr baut sich (per Faltung, Abbildung 29.1) die Materialantwort auf, und alles Spätere wird verformt: Berge dürfen dabei beliebig schnell erscheinen, denn ein Wellenberg trägt keine Neuigkeit — er ist Wiederholung. Eine Botschaft steckt erst in einer Änderung des Musters, und jede Änderung ist eine kleine Front. Sommerfeld und Brillouin haben diese Analyse 1914 mit Papier und Bleistift durchgezogen, als Antwort auf genau unsere Kapitel-16-Provokation — ihre „Vorläufer” findest du im Kleingedruckten.
Der Film zeigt das Rennen live. Verfolge einen einzelnen Berg im Medium mit dem Finger: Er ist schneller als der rote \(c\)-Punkt — und stirbt trotzdem an der Front, bevor er sie je überholt (genau das La-Ola-Muster aus Kapitel 23: Das Muster läuft, die Leute bleiben sitzen).
Code der Animation (nur in der HTML-Fassung)
# von oben: cw_drude (Drude-CW-Lauf), X_Q, X_MED, DTfig, ax = plt.subplots(figsize=(7.2, 3.8))ax.axvspan(X_MED, 2400, color="0.9")linie, = ax.plot([], [], "C0-", lw=1.0)c_punkt, = ax.plot([], [], "ro", ms=7)ax.axhline(0, color="0.85", lw=0.6)ax.set_xlim(0, 2400)y_g =1.1* np.abs(cw_drude).max() # Skala aus den Feldernax.set_ylim(-y_g, y_g)ax.set_xlabel("x (grau: das Drude-Medium, v_p = 1,67 c)")ax.set_ylabel("E")titel = ax.set_title("", fontsize=10)fig.subplots_adjust(top=0.86, bottom=0.16) # Platz fuers xlabelbilder = np.linspace(400, 6960, 33).astype(int)def bild(i): n = bilder[i] linie.set_data(np.arange(NX), cw_drude[n]) x_c =min(X_Q + n * DT, 2390.0) # die c-Marke c_punkt.set_data([x_c], [0.0]) titel.set_text("Berge im Medium: 1,67 c — der rote c-Punkt wird nie ""überholt\n"f"t = {n * DT:.0f}")return [linie, c_punkt, titel]anim = animation.FuncAnimation(fig, bild, frames=len(bilder), interval=140)plt.close(fig)HTML(anim.to_jshtml(default_mode="loop"))
29.8 Das Kapitel-Programm
programme/kap29/kap29_kramers_kronig.py bündelt alle Befunde eigenständig und mit assert-Schranken: die KK-Rekonstruktion am Lorentz-Modell (maschinen-nah), die iFFT-Kausalitätsprobe samt Kapitel-19-Formelvergleich und Spiel-\(\varepsilon\), die \(\mathrm{sgn}\)-Identität, die f-Summenregel mit Ausläufer-Korrektur, die Gold-Karte (breites Integral gegen Messfenster), beide Front-Experimente (Glas und Drude: \(n\), \(v_g\), Front-Verzug null) und den BK7-Wert aus Übung 29.1. Läuft in wenigen Sekunden — Meep wird darin nur einmal kurz nach seiner Gold-Karte gefragt, gerechnet wird alles selbst.
TippMerkkasten
Antwortfunktion:\(P(t)\) ist eine Faltung der Feld-Vergangenheit mit dem Gedächtnis \(\chi(t)\); Kausalität heißt \(\chi(t < 0) = 0\). Das Gedächtnis des Lorentz-Glases ist die gedämpfte Kapitel-19-Schwingung.
Kramers-Kronig: Kausal ⇒ \(\chi_u = \mathrm{sgn}
\cdot \chi_g\) ⇒ Re und Im von \(\chi(\omega)\) bestimmen einander (Hauptwert-Integral). Dispersion ohne Absorption (irgendwo) ist unmöglich — ein „überall durchsichtiges” Glas mit \(n \neq 1\) müsste vor der Ursache antworten.
Numerik: Hauptwert per Subtraktions-Trick (Wert an der heiklen Stelle abziehen, Rest analytisch); Kausalitäts-Probe per iFFT. Das Integral braucht das ganze Spektrum: oben abschneiden kostet \(\propto 1/W^3\), ein Loch unten (Drude-Buckel der Leiter!) kostet linear mit Vorfaktor \(\omega_p^2/\gamma\).
Summenregel:\(\int \omega\,\mathrm{Im}\,\chi\,
\mathrm{d}\omega = \pi\omega_p^2/2\) — Absorption lässt sich verschieben, nicht löschen.
Drei Tempi, eine Regel: Berge laufen mit \(v_p\) (gern \(> c\)), Energie mit \(v_g\), aber jede Änderung läuft als Front mit exakt \(c\) — die Oszillatoren des Mediums können die erste Nachricht nicht vorwegnehmen.
Werkstatt: Kausalitäts-Aussagen im FDTD als Differenz-Experiment anlegen (Medium minus Vakuum) — das \(S < 1\)-Gitter trägt selbst numerische Vorläufer über die \(c\)-Linie, die sich im Paarvergleich kürzen.
Roter Faden
Mit diesem Kapitel schließt Teil VII — und er schließt sich als Bogen: Kapitel 26 baute aus Interferenz Spiegel, Kapitel 27 daraus Resonatoren, Kapitel 28 aus Resonatoren Materialien nach Maß — und Kapitel 29 liefert das Gesetz, das all diesen Antworten zugrunde liegt. Die Kausalitäts-Wahl aus Kapitel 20 wird quantitativ: Das Gedächtnis \(\chi(t)\) ist die Kapitel-19-Schwingung, seine Frequenz-Doppelgestalt verkettet die Lorentz-Linien aus Kapitel 15/16 mit ihren eigenen Verlusten, der Faltungssatz aus Kapitel 23 übersetzt zwischen beiden Bildern, und die FFT aus Kapitel 10 ist das Messgerät. Die Kapitel-16-Schuld (\(v_p > c\)) und die Kapitel-28-Schuld (Dispersionspflicht) sind beglichen. Nach vorn: Kapitel 30 verlässt den sicheren Boden — wir fragen, wo Maxwell endet: beim Photon, beim Doppelspalt mit einzelnen Lichtteilchen, bei \(|E|^2\) als Wahrscheinlichkeit. Die Front-Regel dieses Kapitels übersteht übrigens auch diesen Umzug: Auch Quanten tragen keine Botschaft schneller als \(c\).
Übungen
Ü 29.1 — Warum Fensterglas durchsichtig ist (Verstehen). Die Brechzahl von BK7-Glas wird in Datenblättern mit der Sellmeier-Formel angegeben: \(n^2(\lambda) = 1 + \sum_k B_k\lambda^2/(\lambda^2 - C_k)\) mit \(B = (1{,}0396;\ 0{,}2318;\ 1{,}0105)\) und \(C = (0{,}0060;\ 0{,}0200;\ 103{,}56)\ \text{µm}^2\). (a) Zeige durch Vergleich mit dem Lorentz-\(\chi\) dieses Kapitels: Sellmeier ist eine Summe von Lorentz-Linien im Grenzfall \(\gamma \to 0\) — und \(\sqrt{C_k}\) sind die Resonanz-Wellenlängen. Wo wohnen die drei Resonanzen von BK7? (b) Berechne \(n\) bei der Natrium-d-Linie (\(587{,}6\) nm). (c) Warum darf die Formel die Verluste weglassen, obwohl dieses Kapitel gezeigt hat, dass es ohne Absorption keine Dispersion gibt?
HinweisMusterlösung zu Ü 29.1
Schreibe das Lorentz-\(\chi\) auf Wellenlängen um (\(\omega \propto 1/\lambda\)) und setze \(\gamma = 0\):
BK7 im Sichtbaren (gold hinterlegt): Die Sellmeier-Kurve fällt sanft von Blau nach Rot (normale Dispersion) und trifft bei 587,6 nm den Datenblattwert 1,5168 (Punkt). Die drei Resonanzen (rot gestrichelt bei 77 nm, 141 nm und 10,2 µm) liegen alle außerhalb — das Sichtbare lebt auf den ruhigen KK-Flügeln dieser unsichtbaren Absorber.
\(n(587{,}6\ \text{nm}) = 1{,}5168\) — exakt der Datenblattwert. (c) Die Formel gilt nur im Transparenzfenster, weit weg von allen Resonanzen. Dort ist \(\mathrm{Im}\,\chi\) tatsächlich praktisch null — erlaubt ist das, weil die Absorption anderswo wohnt (Kapitel-Refutation: verboten ist nur überall durchsichtig). Und Übung 29.2 zeigt: Weit weg von der Linie hängt \(\mathrm{Re}\,\chi\) gar nicht von \(\gamma\) ab — darum darf Sellmeier die Breiten unterschlagen, solange die Lagen und Stärken stimmen.
Ü 29.2 — Zwei Linien, eine Regel (Verändern). Ergänze das Lorentz-\(\chi\) des Kapitels um eine zweite Linie bei \(\omega_0 = 2\) (\(\gamma = 0{,}15\), Stärke \(0{,}5\)). (a) Funktioniert die KK-Rekonstruktion unverändert? Warum? (b) Sweepe die Breite der ersten Linie (\(\gamma = 0{,}3 / 0{,}1 / 0{,}03\)) bei fester Stärke \(\omega_p^2\): Wie ändert sich der Im-Gipfel, wie der Realteil weit weg von der Linie (etwa bei \(\omega = 0{,}5\))?
HinweisMusterlösung zu Ü 29.2
def chi2(w):return (chi_lorentz(w)+0.5/ (4.0- w**2-1j*0.15* w))re2 = kk_re(w_test, ws, lambda w: chi2(w).imag)print(f"(a) zwei Linien: KK-Fehler {np.abs(re2 - chi2(w_test).real).max():.1e}")for g in (0.3, 0.1, 0.03): c =1.0/ (1.0-0.5**2-1j* g *0.5)print(f"(b) γ = {g:4.2f}: Im-Gipfel ≈ {1/g:5.1f}, "f"Re χ(0,5) = {c.real:.4f}")
(a) zwei Linien: KK-Fehler 5.8e-10
(b) γ = 0.30: Im-Gipfel ≈ 3.3, Re χ(0,5) = 1.2821
(b) γ = 0.10: Im-Gipfel ≈ 10.0, Re χ(0,5) = 1.3274
(b) γ = 0.03: Im-Gipfel ≈ 33.3, Re χ(0,5) = 1.3328
Der Fehler bleibt bei \(10^{-10}\): Sowohl die Fourier-Transformation als auch das KK-Integral sind linear — die Relation gilt für jede Summe kausaler Antworten, also für beliebig viele Linien (genau deshalb funktionierte sie auch für Meeps sechsteilige Gold-Karte).
Der Im-Gipfel wächst wie \(1/\gamma\) (die Fläche ist durch die Summenregel festgenagelt: schmaler = höher), aber \(\mathrm{Re}\,\chi(0{,}5)\) ändert sich nur um wenige Prozent — weit weg von der Linie zählt allein \(\omega_p^2/(\omega_0^2 - \omega^2)\), die Breite fällt heraus. Die Brechzahl im Transparenzfenster merkt sich nur Lage und Stärke der fernen Absorber, nicht ihre Form — die Rechtfertigung der Sellmeier-Formel aus Ü 29.1 (c).
Ü 29.3 — Der Hilbert-Schnellweg (Übertragen). Die \(\mathrm{sgn}\)-Verkettung aus diesem Kapitel heißt in der Signalverarbeitung Hilbert-Transformation, und SciPy hat sie eingebaut: scipy.signal.hilbert(x) liefert zu einem reellen Signal das „analytische Signal” \(x + \mathrm{i}\,H[x]\). (a) Finde durch Probieren am Lorentz-Modell heraus, wie \(\mathrm{Re}\,\chi\) aus hilbert(Im χ) zu gewinnen ist (Vorzeichen!). (b) Vergleiche Genauigkeit und Rechenzeit mit unserem kk_re. (c) Was braucht der Hilbert-Weg, was unser Integral nicht braucht?
HinweisMusterlösung zu Ü 29.3
import time# scipy.signal.hilbert: analytisches Signal x + i·H[x] per FFT —# H ist die Hilbert-Transformation (Faltung mit 1/(πt))from scipy.signal import hilbertt1 = time.perf_counter()re_hil =-np.imag(hilbert(chi_lorentz(w_fft).imag))dauer_hil = time.perf_counter() - t1innen = np.abs(w_fft) <5.0print(f"(a) Re χ = −Im(hilbert(Im χ)); Abw. "f"{np.abs(re_hil[innen] - chi_lorentz(w_fft[innen]).real).max():.1e}")t1 = time.perf_counter()kk_re(w_test, ws, lambda w: chi_lorentz(w).imag)dauer_kk = time.perf_counter() - t1print(f"(b) hilbert: {dauer_hil*1000:.0f} ms für {NT} Stellen — "f"kk_re: {dauer_kk*1000:.0f} ms für {len(w_test)}")
(a) Re χ = −Im(hilbert(Im χ)); Abw. 2.1e-05
(b) hilbert: 12 ms für 262144 Stellen — kk_re: 166 ms für 60
Mit unserer Konvention gilt \(\mathrm{Re}\,\chi =
-\mathrm{Im}(\texttt{hilbert}(\mathrm{Im}\,\chi))\) — das Minus steckt in SciPys Definition von \(H\). (b) Der FFT-Weg liefert alle\(2^{18}\) Stellen schneller, als unser Integral 60 Stellen schafft — pro Stelle ist er um Größenordnungen voraus. (c) Den Preis zahlt man an den Voraussetzungen: hilbert braucht das Signal auf einem gleichmäßigen Gitter über die ganze Achse (positive und negative Frequenzen) und behandelt es als periodisch — Abschneide-Artefakte wohnen an den Rändern. Unser kk_re nimmt jedes krumme Gitter (die geomspace-Verdichtung am Gold-Buckel!) und wertet gezielt einzelne Stellen aus. Werkzeugwahl wie immer: Massenware per FFT, Maßarbeit per Integral.
Ü 29.4 — Die Abschneide-Gesetze (Übertragen). Der Werkstattkasten behauptet zwei Fehlergesetze für das KK-Integral. Miss beide am Modell nach: (a) Obere Grenze \(W\) sweepen (Lorentz-Modell, Auswertung bei \(\omega = 0{,}5\)): Bestätige Fehler \(\approx 2\gamma\omega_p^2/(3\pi W^3)\). (b) Untere Grenze \(a\) sweepen (Drude-Modell \(\chi = -\omega_p^2/(\omega^2 +
\mathrm{i}\gamma\omega)\) mit \(\gamma = 0{,}05\), Auswertung bei \(\omega = 1\)): Bestätige Fehler \(\approx (2/\pi)(\omega_p^2/\gamma)\,a\). Warum ist (b) die Gold-Lektion in Formelgestalt?
Die beiden Abschneide-Gesetze im Doppel-Log: Links kostet die obere Grenze W mit der Potenz −3 (Messpunkte auf der Theorielinie 2γω_p²/(3πW³)) — bei W = 20 ist der Fehler schon unter 10⁻⁵. Rechts kostet das Loch [0, a] beim Drude-Modell nur linear, aber mit dem Riesen-Vorfaktor ω_p²/γ: Schon a = 0,01 (ein winziges Loch) verfälscht Re χ um 0,13. Gold im Messfenster scheiterte rechts, nicht links.
Beide Messreihen liegen auf ihren Theorielinien. (b) ist die Gold-Lektion: Das Messfenster begann bei \(0{,}08\) — beim Drude-Anteil von Gold (\(\sigma f_0^2/\gamma \approx 1241\)) ein Loch mit vierstelligem Vorfaktor. Oben abzuschneiden hätte fast nichts gekostet; das Loch unten kostete 15 Einheiten von 20. Wer KK auf Leiter anwendet, braucht den Gleichstrom-Rand — oder die verankerten Varianten aus dem Kleingedruckten.
Das Kleingedruckte
Kramers, Kronig und die Röntgenröhre. Ralph Kronig (1926) und Hendrik Kramers (1927) fanden die Relation unabhängig, beim Studium der Röntgen-Dispersion. Der mathematische Unterbau (für Leser mit Funktionentheorie): Kausalität macht \(\chi(\omega)\) in der oberen komplexen Halbebene analytisch — das Integral \(\int_0^\infty \chi(t)\,\mathrm{e}^{\mathrm{i}\omega t}\,
\mathrm{d}t\) konvergiert dort sogar besser als auf der reellen Achse, weil \(\mathrm{Im}\,\omega > 0\) einen zusätzlichen Dämpfungsfaktor liefert. Eine analytische Funktion ist durch ihre Werte auf dem Rand bestimmt (Cauchy-Integral um die geschlitzte Halbebene), und genau dieses Randintegral ist die KK-Relation. Unser \(\mathrm{sgn}\)-Weg ist die fouriertransformierte Fassung derselben Aussage: \(\mathcal{F}[\mathrm{sgn}](\omega)
\propto 1/\omega\), die Multiplikation im Zeitbild wird zur \(1/\omega\)-Faltung im Frequenzbild — und diese Faltung ist das Hauptwert-Integral. Der Ehrenname des Satzes in der Mathematik: Titchmarsh-Theorem.
Sommerfeld, Brillouin und die Vorläufer. Als die Frage „\(v_p > c\) — bricht da die Relativität?” um 1910 ernsthaft diskutiert wurde, rechneten Arnold Sommerfeld und Léon Brillouin (1914) die Front-Ausbreitung in einem Lorentz-Medium analytisch durch. Ergebnis: Die Front läuft exakt mit \(c\), und hinter ihr kommen zwei leise „Boten”, bevor das Hauptsignal eintrifft — der Sommerfeld-Vorläufer (die höchsten Frequenzen, für die das Medium durchsichtig wie Vakuum ist; in unserem Differenz-Experiment stecken sie im allerersten Anstieg der Differenz) und der Brillouin-Vorläufer (die Quasi-Statik). Beide sind im 21. Jahrhundert sauber gemessen worden — auch in Medien mit \(v_g > c\) („superluminale” Pulse aus invertierten Atomen): Die Pulsspitze mag früher ankommen, die Front nie. Information reist mit der Front.
Subtraktive Kramers-Kronig. Das Laborproblem aus Abbildung 29.4 — Absorption nur im Messfenster bekannt — hat einen Standard-Ausweg: Kennt man \(\mathrm{Re}\,
\chi(\omega_1)\) an einer Ankerfrequenz aus einer unabhängigen Messung, kann man die Relation für die Differenz\(\mathrm{Re}\,\chi(\omega) - \mathrm{Re}\,
\chi(\omega_1)\) schreiben; der unbekannte Rest außerhalb des Fensters fällt dann teilweise heraus, weil beide Auswertepunkte denselben fernen Schwanz sehen. Mit mehreren Ankern („multiplicatively subtractive KK”) wird das Verfahren zum Arbeitstier der Ellipsometrie und Reflexions-Spektroskopie: Aus \(R(\omega)\) über ein breites Band plus wenige Ankerpunkte entstehen komplette \(n\)-und-\(k\)-Tabellen — fast alle optischen Konstanten in Datenbanken sind so entstanden, auch die Messdaten hinter Meeps Gold-Fit.
Die Summenregel zählt Elektronen. In der Quantenfassung (Thomas-Reiche-Kuhn-Summenregel) steht rechts von \(\int \omega\,\mathrm{Im}\,\chi\,\mathrm{d}
\omega = \pi\omega_p^2/2\) die Gesamtzahl der Elektronen pro Volumen — daher der Name f-Summenregel: Die „Oszillatorstärken” \(f_k\) aller Übergänge summieren sich auf die Elektronenzahl. Praktiker prüfen damit Messreihen: Integriert die gemessene Absorption auf zu wenig Elektronen, fehlt ein Band — die Summenregel ist die Bilanzprüfung der Spektroskopie.
Kausalitätsprüfung jenseits der Optik. Die Relation gilt für jede lineare kausale Antwort: mechanische Nachgiebigkeit, akustische Impedanz, elektrische Netzwerke. In der Hochfrequenztechnik wird sie rückwärts als Lügendetektor benutzt: Gemessene oder simulierte S-Parameter einer Leitung (Kapitel 22), deren Real- und Imaginärteil die Hilbert-Verkettung verletzen, sind physikalisch unmöglich — Standardtest in jedem Schaltungssimulator, bevor ein Modell in die Zeitbereichs-Simulation darf. Auch unser FDTD lebt davon: Meeps Materialfits (wie die Gold-Karte) sind als Summen kausaler Drude-Lorentz-Terme konstruiert, damit der Zeitschritt-Algorithmus nie in die Zukunft greifen muss.