12  Brechung und Totalreflexion

Ein Strohhalm im Wasserglas sieht geknickt aus — das weiß jedes Kind, und kaum jemand findet es noch erstaunlich. Dabei versteckt sich gleich hinter dem Knick ein Effekt, der es verdient: Schaut man aus dem Wasser heraus flach genug nach oben, kommt das Licht gar nicht mehr hinaus. Es wird vollständig zurückgeworfen — von einer Grenzfläche, an der nichts ist außer Wasser und Luft. Ein Spiegel ohne Spiegel, und zwar ein perfekter: Gewöhnliche Metallspiegel schlucken ein paar Prozent pro Reflexion, die Totalreflexion schluckt nichts. Genau deshalb kann eine Glasfaser Licht über tausende Kilometer tragen — das Licht prallt millionenfach an der Faserwand ab und verliert dabei: nichts.

In Übung 11.3 haben wir das Werkzeug dafür schon in der Hand gehabt — ein Glasblock im Meep-Gitter, eine Welle, die hineinlief und langsamer wurde. In diesem Kapitel lassen wir die Welle schräg auf die Grenze treffen und vermessen alles, was dann passiert: den Knick (mit einer Messmethode, die das Brechungsgesetz gleich mitbeweist), den reflektierten Anteil (auf drei Nachkommastellen gegen die Theorie), den Grenzwinkel — und das Gespenst, das bei Totalreflexion jenseits der Grenze zurückbleibt.

Lernziele

Nach diesem Kapitel kannst du …

  1. … das Brechungsgesetz aus einer einzigen Idee herleiten — die Wellenberge müssen an der Grenze Schritt halten — und es als Erhaltung der Raumfrequenz \(k_x\) im Feldbild nachmessen,
  2. … den reflektierten Energieanteil einer Grenzfläche messen (Flux-Monitore plus Referenzlauf) und gegen die Fresnel-Formel halten,
  3. … den Grenzwinkel berechnen und erklären, warum es ihn nur auf dem Weg vom dichten ins dünne Medium gibt,
  4. … das evaneszente Feld hinter einer total reflektierenden Grenze messen (Eindringtiefe, „zu schnelles” \(k_x\)) und begründen, warum dort eine laufende Welle verboten ist,
  5. … eine Energiebilanz so lange verfolgen, bis sie schließt — auch wenn die fehlende Energie seitwärts entwischt.

12.1 Wellenberge müssen Schritt halten

Bevor irgendein Programm läuft, die zentrale Überlegung — sie braucht nur ein Lineal. Eine ebene Welle läuft schräg im Glas nach oben, unter dem Winkel \(\theta_1\) zur Senkrechten auf die Grenzfläche (so werden Winkel in der Optik immer gemessen: zum Lot, nicht zur Fläche). Ihre Wellenberge sind parallele Geraden im Abstand \(\lambda_1 = \lambda_0 / n_1\) — im Glas ist die Welle ja langsamer und gestaucht (Kapitel 4: \(n = \sqrt{\varepsilon_r}\), in Übung 11.3 gemessen). Wo ein Wellenberg die Grenzlinie trifft, hinterlässt er dort einen „Fußabdruck”, und die Geometrie sagt sofort, in welchem Abstand diese Fußabdrücke aufeinanderfolgen:

\[d \;=\; \frac{\lambda_1}{\sin\theta_1}.\]

(Je steiler die Welle einfällt, desto weiter rücken die Fußabdrücke auseinander; bei senkrechtem Einfall, \(\theta_1 = 0\), trifft ein Berg die ganze Grenze gleichzeitig — \(d\) wird unendlich.)

Oberhalb der Grenze muss die durchgelassene Welle dieselben Fußabdrücke bedienen: Die Felder direkt unter und direkt über der Grenze hängen über die Maxwell-Gleichungen zusammen, ein Wellenberg unten erzwingt einen Wellenberg oben, im Takt, Punkt für Punkt. Also gilt mit den Größen des oberen Mediums

\[\frac{\lambda_2}{\sin\theta_2} \;=\; \frac{\lambda_1}{\sin\theta_1},\]

und wenn man \(\lambda = \lambda_0/n\) einsetzt und umstellt, steht das Brechungsgesetz von Snellius da:

\[n_1 \sin\theta_1 \;=\; n_2 \sin\theta_2.\]

Die Handrechnung am konkreten Zahlenpunkt, die uns gleich als Messvorhersage dient: Glas (\(n_1 = 1{,}5\)), Einfall \(\theta_1 = 30°\), oben Vakuum (\(n_2 = 1\)). Dann ist \(\sin\theta_2 = 1{,}5 \cdot \sin 30° = 1{,}5 \cdot 0{,}5 = 0{,}75\), also \(\theta_2 = \arcsin(0{,}75) = 48{,}59°\) — der Strahl knickt beim Übergang ins dünnere Medium vom Lot weg, von \(30°\) auf fast \(49°\).

Für die Messung lohnt ein zweiter Blick auf die Fußabdrücke: Ihr Kehrwert \(k_x = 1/d = \sin\theta / \lambda\) ist eine Raumfrequenz — wie viele Wellenberge pro Längeneinheit die Grenze entlangwandern (der Ergebnistyp: eine Zahl, Einheit \(1/\lambda_0\)). Das Schritthalten heißt dann schlicht: \(k_x\) ist auf beiden Seiten der Grenze gleich. In dieser Form ist Snellius direkt messbar, denn Raumfrequenzen können wir seit Kapitel 8 bestimmen — mit der Nulldurchgangs-Methode, nur diesmal entlang einer Linie parallel zur Grenze.

12.2 Der Versuchsaufbau: ein Scheinwerfer im Glas

Die Frage: Knickt die Welle wirklich um die vorhergesagten \(48{,}59°\) — und ist \(k_x\) beidseits der Grenze gleich? Die Bühne: eine Zelle von \(24 \times 16\) Meep-Einheiten; wir wählen die Frequenz \(f_\text{meep} = 1\), sodass eine Längeneinheit genau eine Vakuum-Wellenlänge ist (Kapitel 11) — Auflösung 24 Punkte pro \(\lambda_0\). Die untere Halbebene (\(y < 0\)) ist Glas (\(n = 1{,}5\)), oben Vakuum, ringsum PML. Die Quelle: Ein einzelner Lichtstrahl statt einer raumfüllenden Welle — dafür hat Meep die GaussianBeamSource: eine Quellfläche, auf der Meep die Felder eines Gaußstrahls vorschreibt, also eines Wellenbündels mit glockenförmigem Querschnittsprofil, das eine Richtung (beam_kdir) und eine Taillenbreite (beam_w0) hat. Wir stellen den Scheinwerfer ins Glas (Quellfläche bei \(y = -4\)) und zielen so, dass der Strahl die Grenze immer im Ursprung \((0,0)\) trifft — dazu muss die Quelle um \(4 \tan\theta_1\) seitlich versetzt stehen, das übernimmt eine Formel. Die Taille \(w_0 = 3\lambda\) ist ein Kompromiss, den wir später noch bezahlen werden: schmal genug, dass man im Bild einen Strahl sieht, breit genug, dass das Bündel winkelscharf bleibt (mehr dazu bei der Energiebilanz). Anfangsbedingung: Felder null; die Quelle schwingt als Dauerstrich (ContinuousSource), bis das Bild eingeschwungen ist (\(t = 50\)). Gemessen wird der Ez-Schnappschuss; die Auswertung holt \(k_x\) aus je einer Gitterzeile knapp unter (\(y = -0{,}5\)) und knapp über (\(y = +0{,}5\)) der Grenze. Erfolgskriterium: beide \(k_x\) gleich \(0{,}75\) (auf rund ein Prozent), Brechungswinkel \(48{,}6°\) (auf ein halbes Grad).

import os
# vor dem Meep-Import: harmlose MPI-Hardware-Warnungen unterdrücken (Kap. 11)
os.environ["HWLOC_HIDE_ERRORS"] = "2"

import numpy as np
import matplotlib.pyplot as plt
import meep as mp

mp.verbosity(0)

N_GLAS = 1.5
AUFL = 24              # Punkte pro Längeneinheit = pro λ0 (f_meep = 1)
SX, SY = 24.0, 16.0
DX = 1.0 / AUFL
F = 1.0
W0 = 3.0               # Strahltaille (in λ0)
Y_QUELLE = -4.0


def simulation(theta_grad, zeitverlauf, mit_grenze=True, von_oben=False):
    """Gaußstrahl, der die Grenze (y = 0) immer bei (0,0) trifft."""
    th = np.radians(theta_grad)
    y_q = -Y_QUELLE if von_oben else Y_QUELLE
    kdir = mp.Vector3(np.sin(th), -np.cos(th) if von_oben else np.cos(th))
    if mit_grenze:
        geometrie = [mp.Block(size=mp.Vector3(mp.inf, SY),
                              center=mp.Vector3(0, -SY / 2),
                              # mp.Medium(index=...): Material über den
                              # Brechungsindex statt über ε angeben
                              material=mp.Medium(index=N_GLAS))]
    else:                # Referenzlauf: dasselbe Glas, aber ohne Grenze
        geometrie = [mp.Block(size=mp.Vector3(mp.inf, mp.inf, mp.inf),
                              material=mp.Medium(index=N_GLAS))]
    quelle = mp.GaussianBeamSource(   # der "Scheinwerfer"
        zeitverlauf,
        center=mp.Vector3(-abs(y_q) * np.tan(th), y_q),  # Ziel: (0,0)
        size=mp.Vector3(10, 0),       # Quellfläche, auf der Meep den
        component=mp.Ez,              #   Strahl vorschreibt
        beam_kdir=kdir,               # Strahlrichtung
        beam_w0=W0,                   # Taillenbreite
        beam_x0=mp.Vector3(0, 0),     # Ort der Taille: der Auftreffpunkt
        beam_E0=mp.Vector3(0, 0, 1))  # E zeigt aus der Ebene (TMz, Kap. 9)
    return mp.Simulation(cell_size=mp.Vector3(SX, SY), resolution=AUFL,
                         boundary_layers=[mp.PML(1.0)], sources=[quelle],
                         geometry=geometrie)


def feldbild(theta_grad, von_oben=False):
    """Dauerstrich einschwingen lassen, Ez-Schnappschuss zurückgeben."""
    # mp.ContinuousSource: Dauerstrich-Sinus (width: sanfte Anlaufzeit)
    sim = simulation(theta_grad, mp.ContinuousSource(F, width=2),
                     von_oben=von_oben)
    sim.run(until=50.0)
    return sim.get_array(component=mp.Ez, center=mp.Vector3(),
                         size=mp.Vector3(SX, SY))


ez30 = feldbild(30.0)
print(f"eingeschwungen; Feld {ez30.shape},"
      f" Grenzwinkel-Vorgriff: arcsin(1/1,5) = "
      f"{np.degrees(np.arcsin(1 / N_GLAS)):.1f}°")
Using MPI version 4.1, 1 processes
eingeschwungen; Feld (576, 384), Grenzwinkel-Vorgriff: arcsin(1/1,5) = 41.8°
WichtigVorhersage-Punkt

Der Strahl kommt mit \(30°\) zum Lot von unten. Skizziere, bevor du weiterblätterst: In welche Richtung knickt er beim Übergang ins Vakuum — zum Lot hin oder vom Lot weg? Und wird außer dem geknickten Strahl noch etwas anderes im Bild sein?

Die Antwort steckt in der Handrechnung von oben — \(\sin\theta_2\) ist größer als \(\sin\theta_1\), der Strahl flieht das Lot. Und weil schon der senkrechte Übergang Glas→Luft in Kapitel 6 ein 4-%-Spiegelbild lieferte, sollte auch hier ein reflektierter Strahl zurücklaufen. Das Bild, mit allen drei Erwartungen als Linien eingezeichnet:

# von oben: ez30, SX, SY, N_GLAS
fig, ax = plt.subplots(figsize=(7.0, 4.6))
w = np.abs(ez30).max() / 2
ax.imshow(ez30.T, origin="lower", cmap="RdBu_r", vmin=-w, vmax=w,
          extent=(-SX / 2, SX / 2, -SY / 2, SY / 2))
ax.axhline(0, color="black", lw=1.2)

th1 = np.radians(30.0)
th2 = np.arcsin(N_GLAS * np.sin(th1))          # Snellius-Erwartung
ax.plot([-7 * np.tan(th1), 0], [-7, 0], "k--", lw=1.0)   # einfallend
ax.plot([0, 7 * np.tan(th1)], [0, -7], "k--", lw=1.0)    # reflektiert
ax.plot([0, 7.5 * np.tan(th2)], [0, 7.5], "k--", lw=1.0) # gebrochen
ax.text(-9.5, -7.3, "einfallend, 30°"); ax.text(3.2, -7.3, "reflektiert")
ax.text(5.0, 5.6, "gebrochen, 48,6°")
ax.text(-11.5, 6.8, "Vakuum n = 1"); ax.text(-11.5, -5.4, "Glas n = 1,5")
ax.set_xlabel("x (λ)"); ax.set_ylabel("y (λ)")
plt.tight_layout(); plt.show()
Abbildung 12.1: Der Gaußstrahl trifft mit 30° von unten (Glas, n = 1,5) auf die Grenze zum Vakuum (schwarze Linie). Farbe = Ez; die gestrichelten Geraden sind die Erwartung: einfallender Strahl (30°), reflektierter Strahl (30° zur anderen Seite) und der gebrochene Strahl unter arcsin(1,5·sin 30°) = 48,6° — die Welle folgt allen dreien. Im Glas ist die Wellenlänge sichtbar kürzer (n = 1,5); das Streifenmuster links unten ist die Interferenz aus einfallendem und reflektiertem Strahl.

Alle drei Strahlen liegen auf ihren Erwartungslinien. Aber „liegt drauf” ist ein Urteil per Augenmaß, und seit Kapitel 10 geben wir uns damit nicht mehr zufrieden. Die Messung: Wir legen je eine Messlinie parallel zur Grenze — eine Gitterzeile im Glas (\(y = -0{,}5\)), eine im Vakuum (\(y = +0{,}5\)) — und bestimmen auf beiden die Raumfrequenz \(k_x\) über die Nulldurchgänge, wörtlich mit der Methode aus Kapitel 8:

# von oben: ez30, SX, SY, AUFL, DX
def idx(x, y):
    """Gitterindizes zum Ort (x, y)."""
    return int(round((x + SX / 2) * AUFL)), int(round((y + SY / 2) * AUFL))


def kx_aus_zeile(ez, y, x0=-4.0, x1=4.0):
    """Raumfrequenz entlang x auf Höhe y (Nulldurchgänge, Kapitel 8)."""
    i0, _ = idx(x0, 0); i1, _ = idx(x1, 0); _, j = idx(0, y)
    zeile = ez[i0:i1, j]
    s = np.flatnonzero(np.sign(zeile[:-1]) * np.sign(zeile[1:]) < 0)
    null = s - zeile[s] / (zeile[s + 1] - zeile[s])   # interpolierte Nullen
    return 1.0 / (2 * np.mean(np.diff(null)) * DX)    # kx = 1 / λx


kx_glas = kx_aus_zeile(ez30, -0.5)
kx_vakuum = kx_aus_zeile(ez30, +0.5)
print(f"kx im Glas  : {kx_glas:.4f}  (Theorie n·sin30° = {N_GLAS * 0.5:.4f})")
print(f"kx im Vakuum: {kx_vakuum:.4f}")
print(f"θ₂ = arcsin(kx·λ0) = {np.degrees(np.arcsin(kx_vakuum)):.2f}°"
      f"   (Snellius: {np.degrees(np.arcsin(N_GLAS * 0.5)):.2f}°)")
kx im Glas  : 0.7570  (Theorie n·sin30° = 0.7500)
kx im Vakuum: 0.7504
θ₂ = arcsin(kx·λ0) = 48.63°   (Snellius: 48.59°)

Beide Seiten tragen dasselbe \(k_x = 0{,}75\) — die Fußabdrücke halten Schritt, und weil im Vakuum \(|k| = 1/\lambda_0 = 1\) fest steht, folgt der Brechungswinkel aus \(\sin\theta_2 = k_x \lambda_0\) allein: \(48{,}6°\), auf vier Hundertstel Grad an der Handrechnung. Merke die Logik: Wir haben keinen Winkel gemessen, sondern eine Raumfrequenz — Snellius ist kein Gesetz über Strahlen, sondern über Wellenberge, die an einer Linie Schritt halten. Die Strahlen-Form ist nur seine Schatten-Geometrie.

Dass „Schritt halten” wörtlich gemeint ist, zeigt in dieser HTML-Fassung der Film — dieselbe Bühne, eine volle Schwingungsperiode in sechzehn Bildern. Klicke dich mit den Einzelschritt-Knöpfen durch und verfolge die Wellenberge entlang der schwarzen Grenzlinie: Im Glas stehen sie dichter, oben weiter auseinander, aber an der Grenze selbst rücken die Fußabdrücke beider Seiten gemeinsam weiter — kein Berg überholt, keiner bleibt zurück. Genau dieses Schritthalten ist Snellius.

Code der Animation (nur in der HTML-Fassung)
# von oben: simulation(), SX, SY, N_GLAS, F
from matplotlib import animation
from IPython.display import HTML

sim_film = simulation(30.0, mp.ContinuousSource(F, width=2))
sim_film.run(until=50.0)                 # einschwingen wie bei ez30
filmbilder = []
sim_film.run(mp.at_every(1.0 / F / 16, lambda s: filmbilder.append(
    s.get_array(component=mp.Ez, center=mp.Vector3(),
                size=mp.Vector3(SX, SY)))), until=1.0 / F)
filmbilder = filmbilder[:16]             # genau eine Periode: nahtloser Loop

fig_a, ax_a = plt.subplots(figsize=(6.6, 4.4))
w_a = np.abs(filmbilder[0]).max() / 2
bild_a = ax_a.imshow(filmbilder[0].T, origin="lower", cmap="RdBu_r",
                     vmin=-w_a, vmax=w_a,
                     extent=(-SX / 2, SX / 2, -SY / 2, SY / 2))
ax_a.axhline(0, color="black", lw=1.2)
th1_a = np.radians(30.0)
th2_a = np.arcsin(N_GLAS * np.sin(th1_a))
ax_a.plot([-7 * np.tan(th1_a), 0], [-7, 0], "k--", lw=0.9)
ax_a.plot([0, 7 * np.tan(th1_a)], [0, -7], "k--", lw=0.9)
ax_a.plot([0, 7.5 * np.tan(th2_a)], [0, 7.5], "k--", lw=0.9)
ax_a.set_xlabel("x (λ)"); ax_a.set_ylabel("y (λ)")
ax_a.set_title("Die Fußabdrücke halten Schritt")

def zeichne(j):
    bild_a.set_data(filmbilder[j].T)
    return [bild_a]

anim = animation.FuncAnimation(fig_a, zeichne, frames=len(filmbilder),
                               interval=110)
plt.close(fig_a)
HTML(anim.to_jshtml(default_mode="loop"))

12.3 Wie viel kommt durch? Flux und Fresnel

Das Feldbild zeigt einen reflektierten Strahl — wie viel Energie trägt er? Für den senkrechten Einfall kennen wir die Antwort aus Kapitel 6: Der Spiegelfaktor war \(r = (Z_2 - Z_1)/(Z_2 + Z_1) = 0{,}2\), also \(4\,\%\) der Energie. Die Verallgemeinerung auf schrägen Einfall heißt Fresnel-Formel; für unsere Polarisation (E zeigt aus der Ebene, „senkrecht” oder s-polarisiert) lautet sie

\[r_s \;=\; \frac{n_1\cos\theta_1 - n_2\cos\theta_2} {n_1\cos\theta_1 + n_2\cos\theta_2}, \qquad R = r_s^2.\]

Ihre Herleitung verschieben wir auf Kapitel 13 — dort wird sie zusammen mit ihrer Schwester für die zweite Polarisation gebraucht (die eine echte Überraschung bereithält). Hier prüfen wir sie erst einmal an zwei Punkten. Der Anker: Bei \(\theta_1 = 0\) sind beide Kosinus 1, und es bleibt \((n_1 - n_2)/(n_1 + n_2) = 0{,}5/2{,}5 = 0{,}2\) — exakt der Kapitel-6-Wert, die Formel kennt ihren Spezialfall. Die Handrechnung für \(30°\): \(n_1\cos\theta_1 = 1{,}5 \cdot 0{,}866 = 1{,}299\) und \(n_2\cos\theta_2 = \cos 48{,}59° = 0{,}661\), also \(r_s = 0{,}638/1{,}960 = 0{,}325\) und \(R = 0{,}325^2 = 0{,}106\) — schräg verspiegelt Glas zweieinhalbmal stärker als senkrecht.

Gemessen wird mit dem Werkzeug aus Kapitel 11: Flux-Monitore (der DFT-Detektor in seiner Energiestrom-Form — er sammelt \(E \times H\) durch eine Linie, frequenzaufgelöst) und die Referenzlauf-Methode. Der Aufbau: ein Monitor unterhalb der Grenze (\(y = -2\)), einer oberhalb (\(y = +2\)), jeweils 20 Einheiten breit. Der Referenzlauf füllt die ganze Zelle mit Glas — kein Übergang, der Monitor unten sieht die volle einfallende Leistung \(P_\text{ein}\). Im Hauptlauf läuft durch den unteren Monitor einfallende minus reflektierte Leistung, also ist \(R = (P_\text{ein} - P_\text{unten})/P_\text{ein}\); oben kommt \(T = P_\text{oben}/P_\text{ein}\) heraus. Eine Feinheit noch: Für saubere Energiezahlen nehmen wir statt des Dauerstrichs einen schmalbandigen Puls (GaussianSource) und lassen laufen, bis alle Felder durch die Monitore hindurch sind — dann ist die Flux-Summe vollständig, ohne Einschwing-Schmutz. Erfolgskriterium: \(R = 0{,}106\) auf ein Prozentpunkt-Niveau, und die Bilanz \(R + T = 1\) (Checkliste, Zeile „Erhaltung”).

# von oben: simulation(), F, N_GLAS
def fluss_bilanz(theta_grad, mit_seite=False):
    """R und T (und ggf. seitlicher Abfluss) per Puls + Referenzlauf."""
    werte = {}
    for mit_grenze in (False, True):
        # mp.GaussianSource: Puls um f = F, schmalbandig (fwidth klein)
        sim = simulation(theta_grad, mp.GaussianSource(F, fwidth=F / 8),
                         mit_grenze=mit_grenze)
        # add_flux(f, df, n, Region): Energiestrom-Monitor bei Frequenz f;
        # mp.FluxRegion: die Messlinie (Vorzeichen: Fluss in +Richtung)
        unten = sim.add_flux(F, 0, 1, mp.FluxRegion(
            center=mp.Vector3(0, -2), size=mp.Vector3(20, 0)))
        oben = sim.add_flux(F, 0, 1, mp.FluxRegion(
            center=mp.Vector3(0, +2), size=mp.Vector3(20, 0)))
        seite = sim.add_flux(F, 0, 1, mp.FluxRegion(
            center=mp.Vector3(10, 0), size=mp.Vector3(0, 4),
            direction=mp.X))              # Messlinie senkrecht: Fluss in +x
        # until_after_sources: weiterlaufen, bis n Zeiteinheiten NACH
        # Quellende vergangen sind — alle Pulse sind dann durch
        sim.run(until_after_sources=80)
        werte[mit_grenze] = (mp.get_fluxes(unten)[0],   # die Messwerte
                             mp.get_fluxes(oben)[0],
                             mp.get_fluxes(seite)[0])
    p_ein = werte[False][0]
    r = (p_ein - werte[True][0]) / p_ein
    t = werte[True][1] / p_ein
    s = werte[True][2] / p_ein
    return (r, t, s) if mit_seite else (r, t)


R30, T30 = fluss_bilanz(30.0)
print(f"30°:  R = {R30:.4f}   (Fresnel-s: 0,1058)")
print(f"      T = {T30:.4f}")
print(f"      R + T = {R30 + T30:.4f}")
30°:  R = 0.1061   (Fresnel-s: 0,1058)
      T = 0.8936
      R + T = 0.9997

Treffer auf drei Nachkommastellen, und die Energiebilanz schließt auf ein Promille. Damit ist das Brechungs-Inventar komplett: Richtung (Snellius, gemessen), Anteile (Fresnel, gemessen), Erhaltung (geprüft). Jetzt drehen wir den Winkel auf.

12.4 Der Grenzwinkel: wenn Snellius nicht mehr kann

Snellius verlangt \(\sin\theta_2 = 1{,}5\,\sin\theta_1\) — und \(\sin\theta_2\) kann nicht größer als 1 werden. Die Gleichung hat nur eine Lösung, solange

\[\sin\theta_1 \;\le\; \frac{n_2}{n_1} = \frac{1}{1{,}5} \qquad\Longrightarrow\qquad \theta_1 \;\le\; \theta_c = \arcsin\!\frac{1}{1{,}5} = 41{,}81°.\]

Bei \(41{,}8°\) Einfall verlässt der gebrochene Strahl die Grenze streifend (\(\theta_2 = 90°\)); darüber gibt es keinen Brechungswinkel mehr. Schon die Richtung des Arguments zeigt: Das kann nur passieren, wenn \(n_1 > n_2\) ist — vom dichten ins dünne Medium. Umgekehrt, von dünn nach dicht, ist \(\sin\theta_2 = \sin\theta_1/1{,}5\) immer kleiner als 1; von oben kommt man immer ins Glas hinein (Ü 12.4 prüft das nach). Und dieselbe Arcussinus-Sackgasse ist uns schon einmal begegnet: In Kapitel 8 hatte die Gitter-Dispersionsrelation unterhalb von drei Punkten pro Wellenlänge keine reelle Lösung mehr — was die Mathematik dort verweigerte, war ebenfalls eine laufende Welle. Was stattdessen passiert, sehen wir gleich; erst die Vorhersage.

WichtigVorhersage-Punkt

Wir fahren den Scheinwerfer von \(30°\) auf \(55°\) — deutlich über den Grenzwinkel. Was zeigt das Feldbild oberhalb der Grenze: exakt nichts, ein Stück gebrochener Strahl, das an der Grenze „klebt”, oder etwas Drittes? Und was erwartest du für den reflektierten Strahl im Glas?

Der Lauf ist eine Zeile — gleicher Aufbau, anderer Winkel:

# von oben: feldbild(), SX, SY
ez55 = feldbild(55.0)

fig, ax = plt.subplots(figsize=(7.0, 4.6))
w = np.abs(ez55).max() / 2
ax.imshow(ez55.T, origin="lower", cmap="RdBu_r", vmin=-w, vmax=w,
          extent=(-SX / 2, SX / 2, -SY / 2, SY / 2))
ax.axhline(0, color="black", lw=1.2)
th = np.radians(55.0)
ax.plot([-7 * np.tan(th), 0], [-7, 0], "k--", lw=1.0)
ax.plot([0, 7 * np.tan(th)], [0, -7], "k--", lw=1.0)
ax.text(-10.5, -7.3, "einfallend, 55°"); ax.text(6.0, -7.3, "reflektiert")
ax.text(-11.5, 6.8, "Vakuum: kein Strahl")
ax.set_xlabel("x (λ)"); ax.set_ylabel("y (λ)")
plt.tight_layout(); plt.show()
Abbildung 12.2: Derselbe Aufbau bei 55° Einfall, deutlich über dem Grenzwinkel von 41,8° (gestrichelt: einfallende und reflektierte Erwartungslinie). Oben existiert kein gebrochener Strahl mehr — der Strahl wird vollständig zurückgeworfen. Das kräftige Streifenmuster im Glas ist die Interferenz aus einfallendem und reflektiertem Strahl (stehende Welle quer zur Grenze, Kapitel 6); direkt über der Grenze bleibt ein hauchdünner heller Saum zurück, dem wir gleich nachgehen.

12.5 Das Gespenst über der Grenze

WarnungNaheliegende Vermutung

„Totalreflexion heißt total: Jenseits der Grenze ist das Feld exakt null.”

Warum sie naheliegt: Der Name sagt es doch — alles wird reflektiert, die Energiebilanz wird gleich \(R \approx 100\,\%\) bestätigen. Wo nichts hinfließt, sollte nichts sein.

Was stattdessen stimmt: Direkt über der Grenze lebt ein schmaler, exponentiell abklingender Feldsaum — das evaneszente Feld. Es ist kein Rechenartefakt, sondern messbare Physik mit einer messbaren Eindringtiefe (gleich: knapp ein Viertel der Wellenlänge), es wandert mit dem Strahl die Grenze entlang und transportiert dabei sogar Energie seitwärts — nur eben nicht hinaus. Die Felder können an der Grenze gar nicht schlagartig auf null springen (die Maxwell-Gleichungen verknüpfen beide Seiten); sie können oberhalb nur möglichst schnell verschwinden lernen. In Kapitel 17 wird dieser Saum zur Hauptfigur: Hält man ein zweites Glas dicht genug daran, springt das Licht hindurch — es tunnelt.

Warum kann dort keine laufende Welle sein? Das Schritthalte- Argument beantwortet auch das — und jetzt zahlt sich die \(k_x\)-Lesart von Snellius aus. Die Fußabdrücke des \(55°\)-Strahls wandern mit \(k_x = n_1 \sin 55° / \lambda_0 = 1{,}23/\lambda_0\) die Grenze entlang. Eine freie Vakuumwelle hat aber insgesamt nur \(|k| = 1/\lambda_0\), und ihre Komponenten müssen \(k_x^2 + k_y^2 = k_0^2\) erfüllen — schon die \(x\)-Komponente allein wäre hier größer als der ganze erlaubte Betrag! Für \(k_y^2 = k_0^2 - k_x^2 < 0\) gibt es keine reelle Wellenzahl nach oben; der Ausweg der Physik ist ein Feld, das in \(y\) nicht schwingt, sondern exponentiell abklingt, \(E \propto e^{-\kappa y}\), mit (in Kreiszahl-Schreibweise, daher das \(2\pi\))

\[\kappa \;=\; \frac{2\pi}{\lambda_0} \sqrt{(n_1\sin\theta_1)^2 - n_2^2} \;\stackrel{55°}{=}\; 4{,}49 / \lambda_0, \qquad \delta = \frac{1}{\kappa} = 0{,}22\,\lambda_0.\]

Beides ist nachprüfbar, und zwar im Feld, das wir schon haben. Erst das „zu schnelle” Muster: \(k_x\) auf einer Linie knapp über der Grenze —

# von oben: ez55, kx_aus_zeile(), N_GLAS
kx_saum = kx_aus_zeile(ez55, +0.15)
print(f"kx im Saum: {kx_saum:.3f}"
      f"   (n·sin55° = {N_GLAS * np.sin(np.radians(55)):.3f};"
      f" freie Vakuumwelle: maximal 1,000)")
kx im Saum: 1.215   (n·sin55° = 1.229; freie Vakuumwelle: maximal 1,000)

Da steht ein Muster mit \(k_x = 1{,}2\) im Vakuum — schneller, als jede freie Welle dort laufen dürfte. Es kann nur als gebundener Saum existieren. Jetzt sein Abklingprofil: Wir mitteln \(E_z^2\) entlang \(x\) (über den Auftreffbereich) für jede Gitterhöhe \(y\) über der Grenze und tragen den Pegel logarithmisch auf — ein Exponentialabfall muss dann eine Gerade mit Steigung \(-\kappa\) sein, und die Theoriegerade zeichnen wir dazu:

# von oben: ez55, idx(), DX, AUFL, SX, SY
i0, _ = idx(-3, 0); i1, _ = idx(3, 0); _, j0 = idx(0, 0)
hoehen, pegel = [], []
for j in range(j0 + 1, j0 + int(0.6 * AUFL)):
    hoehen.append((j + 0.5) * DX - SY / 2)
    pegel.append(np.sqrt(np.mean(ez55[i0:i1, j] ** 2)))
hoehen = np.array(hoehen); pegel = np.array(pegel)

fit = (hoehen > 0.05) & (hoehen < 0.42)
kappa = -np.polyfit(hoehen[fit], np.log(pegel[fit]), 1)[0]
kappa_theorie = 2 * np.pi * np.sqrt((N_GLAS * np.sin(np.radians(55)))**2 - 1)
print(f"κ gemessen: {kappa:.2f}   Theorie: {kappa_theorie:.2f}"
      f"   → δ = {1 / kappa:.3f} λ (Theorie {1 / kappa_theorie:.3f} λ)")

fig, achsen = plt.subplots(1, 2, figsize=(7.4, 3.2))
ax = achsen[0]
a0, _ = idx(-4, 0); a1, _ = idx(8, 0); _, b0 = idx(0, -2); _, b1 = idx(0, 2)
w = np.abs(ez55).max() / 6
ax.imshow(ez55[a0:a1, b0:b1].T, origin="lower", cmap="RdBu_r",
          vmin=-w, vmax=w, extent=(-4, 8, -2, 2))
ax.axhline(0, color="black", lw=1.0)
ax.set_xlabel("x (λ)"); ax.set_ylabel("y (λ)")
ax.set_title("Zoom auf die Grenze", fontsize=10)

ax = achsen[1]
ax.semilogy(hoehen, pegel / pegel[0], "o", ms=4, label="Messung")
ax.semilogy(hoehen, np.exp(-kappa_theorie * (hoehen - hoehen[0])), "k--",
            lw=1.0, label="Theorie $e^{-\\kappa y}$")
ax.set_xlabel("Höhe y über der Grenze (λ)")
ax.set_ylabel("Feldpegel (normiert)")
ax.set_title("Abklingen des Saums", fontsize=10)
ax.legend(fontsize=8)
plt.tight_layout(); plt.show()
κ gemessen: 4.30   Theorie: 4.49   → δ = 0.233 λ (Theorie 0.223 λ)
Abbildung 12.3: Links: Zoom auf die Grenzregion des 55°-Laufs (Farbskala um den Faktor 6 gespreizt) — der evaneszente Saum klebt als dünne Leuchtspur auf der Grenze. Rechts: sein Feldpegel (Wurzel aus dem x-Mittel von Ez², ein Punkt pro Gitterhöhe) über der Höhe y, logarithmisch aufgetragen; die gestrichelte Gerade ist die Theorie e^(−κy) mit κ = 4,49 — kein Fit, sondern Vorhersage. Der gemessene Abfall folgt ihr über eine Größenordnung; die Eindringtiefe ist knapp ein Viertel der Wellenlänge.

Die Punkte liegen auf der Vorhersage-Geraden: \(\kappa = 4{,}30\) gemessen gegen \(4{,}49\) berechnet, die Eindringtiefe trifft auf ein Hundertstel der Wellenlänge. Das Gespenst ist vermessen.

12.6 Die Bilanz, die erst beim dritten Monitor schließt

Bleibt die Kernbehauptung: total reflektiert. Die Flux-Maschinerie von oben liefert das in einer Zeile — und wer den Seitenmonitor im Code bemerkt hat, ahnt, warum wir ihn eingebaut haben:

# von oben: fluss_bilanz()
R55, T55, S55 = fluss_bilanz(55.0, mit_seite=True)
print(f"55°:  reflektiert      R = {R55:.4f}")
print(f"      oben hinaus      T = {T55:.4f}")
print(f"      seitlich (Saum)  S = {S55:.4f}")
print(f"      Summe              = {R55 + T55 + S55:.4f}")
55°:  reflektiert      R = 0.9889
      oben hinaus      T = 0.0040
      seitlich (Saum)  S = 0.0076
      Summe              = 1.0005

Auf den ersten Blick eine Enttäuschung: \(R = 98{,}9\,\%\) — was ist das für eine „Total”-Reflexion? Aber die Checkliste sagt nicht „glaube der Theorie”, sie sagt „schließe die Bilanz”. Die fehlenden 1,1 % gehen an zwei adressierbare Posten. Erstens: \(0{,}4\,\%\) verlassen die Zelle tatsächlich nach oben — unser Strahl ist kein Winkel, sondern ein Winkelbündel. Eine Taille von \(w_0 = 3\lambda\) erkauft man mit etwa \(\pm 6°\) Streuung um die \(55°\) (das ist dieselbe Reziprozität wie in Kapitel 10: schmal im Raum = breit im Spektrum, hier im Winkel-Spektrum), und die äußersten Flügel des Bündels liegen nahe genug am Grenzwinkel, um teilweise zu entkommen. Zweitens: \(0{,}8\,\%\) fließen seitwärts aus dem Messfenster — der Saum wandert mit \(k_x\) die Grenze entlang und trägt dabei Energie parallel zur Grenzfläche davon (außerdem tritt der reflektierte Strahl ein Stückchen seitlich versetzt aus, wo der Saum ihn zurückspeist — das Kleingedruckte kennt den Namen dazu). Mit allen drei Posten: \(98{,}9 + 0{,}4 + 0{,}8 = 100{,}0\,\%\). Für die ideale, unendlich ausgedehnte ebene Welle sagt die Theorie exakt \(R = 1\); unsere Messung bestätigt das so gut, wie ein endlicher Strahl es zulässt — und sie hat uns nebenbei gezwungen, dem Saum beim Energietragen zuzusehen.

12.7 Das Kapitel-Programm

programme/kap12/kap12_brechung_totalreflexion.py bündelt alle vier Befunde eigenständig und sichert sie mit assert-Schranken: \(k_x\)-Erhaltung und \(\theta_2\) (auf \(0{,}5°\)), \(R(30°)\) gegen Fresnel (auf \(0{,}01\)) samt \(R + T = 1\), Saum-\(k_x > 1{,}1\) und \(\kappa\) auf \(8\,\%\), Totalreflexions-Bilanz auf \(2\,\%\) — dazu die Übungs-Befunde (Frequenz-Skalierung des Saums, Umkehrlauf).

TippMerkkasten
  • Snellius ist Schritthalten: Die Wellenberge beider Seiten teilen sich die Fußabdrücke auf der Grenze — \(k_x\) ist erhalten, \(n_1\sin\theta_1 = n_2\sin\theta_2\) ist nur die Strahlen-Übersetzung davon.
  • Beim Übergang ins dünnere Medium flieht der Strahl das Lot — bis es bei \(\theta_c = \arcsin(n_2/n_1)\) keinen Ausweg mehr gibt: Totalreflexion, der perfekte Spiegel ohne Spiegel. Nur vom dichten ins dünne Medium!
  • Hinter der total reflektierenden Grenze ist nicht nichts: Ein evaneszenter Saum klingt mit \(\kappa = (2\pi/\lambda_0)\sqrt{(n_1\sin\theta_1)^2 - n_2^2}\) ab (gemessen), trägt sein „zu schnelles” \(k_x > k_0\) (gemessen) und schiebt Energie seitwärts, nie hinaus.
  • Energiebilanzen schließen, nicht abnicken: \(R\), \(T\) und der seitliche Abfluss summieren sich auf 100 % — gefunden mit Flux-Monitoren plus Referenzlauf (Kapitel 11).
  • Ein Strahl ist ein Winkelbündel: Taille \(w_0\) kostet Winkelschärfe \(\sim \lambda/w_0\) — Kapitel-10-Reziprozität im Winkelraum.

Roter Faden

Das Kapitel hat von fast jedem Vorgänger geerbt: Von Kapitel 4 den Brechungsindex \(n = \sqrt{\varepsilon_r}\), von Kapitel 6 den \(4\)-%-Anker für Fresnel, von Kapitel 8 die Nulldurchgangs-Messung und die Arcussinus-Sackgasse (Cutoff dort, Grenzwinkel hier — zweimal dieselbe Mathematik, zweimal stirbt eine laufende Welle), von Kapitel 10 die Schmal-breit-Reziprozität (diesmal im Winkelraum), von Kapitel 11 Flux-Monitore und die Referenzlauf-Methode, und Übung 11.3 war der Prolog. Nach vorn: Kapitel 13 holt die Fresnel-Herleitung nach und lässt die zweite Polarisation ihren Brewster-Trick zeigen; Kapitel 17 baut aus dem evaneszenten Saum eine Tunnelbrücke (FTIR) und erklärt nebenbei, warum die Glasfaser ihr Licht behält — der perfekte Spiegel aus diesem Kapitel ist ihr Betriebsgeheimnis.

Übungen

Ü 12.1 (Verstehen). Ein Speerfischer sieht einen Fisch schräg vor sich unter der Wasseroberfläche (\(n_\text{Wasser} = 1{,}33\)). Begründe mit dem Schritthalte-Argument (nicht mit auswendig gelerntem „zum Lot hin/vom Lot weg”): Knickt der Sehstrahl beim Übergang Wasser→Luft zum Lot oder vom Lot? Erscheint der Fisch dem Fischer dadurch höher oder tiefer, als er wirklich steht — und muss er beim Wurf darüber oder darunter zielen?

Im Wasser ist die Wellenlänge kürzer (\(\lambda_0/1{,}33\)). Damit die Fußabdrücke auf der Oberfläche Schritt halten (\(\lambda/\sin\theta\) beidseits gleich), muss der Sinus in der Luft größer sein — das Licht vom Fisch verlässt das Wasser vom Lot weggeknickt, läuft also flacher zum Auge, als die gerade Verbindung es täte. Der Fischer verlängert den ankommenden Strahl gedanklich geradlinig zurück und sieht den Fisch deshalb zu hoch (näher an der Oberfläche). Wer den Speer dorthin wirft, wo er den Fisch sieht, wirft zu hoch — gezielt wird darunter. (Dass der Speer auf seinem Weg ins Wasser selbst gebrochen würde, kompensiert das nicht: Der massive Speer fliegt seine ballistische Bahn — gebrochen wird nur das Licht.)

Ü 12.2 (Verstehen). Berechne von Hand die Grenzwinkel für Wasser→Luft (\(n = 1{,}33\)) und Diamant→Luft (\(n = 2{,}42\)); prüfe mit drei Zeilen Code. Erkläre dann mit den beiden Zahlen, warum ein geschliffener Brillant so auffällig funkelt — und warum derselbe Schliff aus Fensterglas (\(n = 1{,}5\)) vergleichsweise matt bliebe.

\(\theta_c = \arcsin(1/n)\): für Wasser \(\arcsin(0{,}752) = 48{,}8°\), für Diamant \(\arcsin(0{,}413) = 24{,}4°\) (Glas: 41,8°).

# von oben: nichts (eigenständige Handrechnungs-Kontrolle)
for name, n in (("Wasser", 1.33), ("Glas", 1.5), ("Diamant", 2.42)):
    print(f"{name:8}: Grenzwinkel {np.degrees(np.arcsin(1 / n)):.1f}°")
Wasser  : Grenzwinkel 48.8°
Glas    : Grenzwinkel 41.8°
Diamant : Grenzwinkel 24.4°

Im Diamanten ist schon jeder Strahl total gefangen, der die Facette flacher als \(24{,}4°\) zum Lot trifft — ein riesiger Winkelbereich. Ein gut geschliffener Brillant ist deshalb eine Falle aus perfekten (verlustfreien!) Spiegeln: Licht, das oben hineinfällt, wird an den Unterseiten-Facetten fast immer total reflektiert, springt mehrfach durch den Stein und verlässt ihn gebündelt wieder nach oben — es blitzt. Beim Glas-Imitat (Grenzwinkel \(41{,}8°\)) verfehlen viele dieser Strahlen die Totalreflexions-Bedingung, sickern durch die Unterseite hinaus, und der Stein wirkt stumpf. (Der zweite Diamant-Trumpf, die starke Farbzerlegung, braucht Dispersion — Kapitel 16.)

Ü 12.3 (Verändern). Der Saum hat bei \(f_\text{meep} = 1\) die Eindringtiefe \(\delta \approx 0{,}22\) Einheiten. Sage mit der \(\kappa\)-Formel voraus, was bei halber Frequenz (\(f_\text{meep} = 0{,}5\), also doppelter Wellenlänge) passiert, und miss nach (gleicher Aufbau, ContinuousSource(0.5, width=2), Profil wie im Kapitel — Fit-Fenster mitskalieren!). Warum ist das nur eine Umformulierung der Skaleninvarianz aus Kapitel 11?

\(\kappa \propto 1/\lambda_0\), also \(\delta \propto \lambda_0\): Halbe Frequenz heißt doppelte Eindringtiefe, \(0{,}45\) Einheiten. Das muss so sein, denn Maxwell kennt keine eigene Länge (Kapitel 11) — der Saum kann sich nur an der Wellenlänge messen, und „\(\delta = 0{,}22\,\lambda_0\)” ist die einzig mögliche Form des Ergebnisses. Die Messung:

# von oben: simulation(), idx(), DX, AUFL, SX, SY, kappa (Messwert f=1)
sim = simulation(55.0, mp.ContinuousSource(0.5, width=2))
sim.run(until=50.0)
ez_f05 = sim.get_array(component=mp.Ez, center=mp.Vector3(),
                       size=mp.Vector3(SX, SY))
i0, _ = idx(-3, 0); i1, _ = idx(3, 0); _, j0 = idx(0, 0)
h2, p2 = [], []
for j in range(j0 + 1, j0 + int(1.1 * AUFL)):     # Fenster: doppelt so hoch
    h2.append((j + 0.5) * DX - SY / 2)
    p2.append(np.sqrt(np.mean(ez_f05[i0:i1, j] ** 2)))
h2 = np.array(h2); p2 = np.array(p2)
m2 = (h2 > 0.05) & (h2 < 0.84)
kappa_f05 = -np.polyfit(h2[m2], np.log(p2[m2]), 1)[0]
print(f"κ(f=0,5) = {kappa_f05:.2f}  →  δ = {1 / kappa_f05:.2f}")
print(f"Verhältnis δ(f=0,5) / δ(f=1) = {kappa / kappa_f05:.2f}   (Theorie: 2)")
κ(f=0,5) = 1.89  →  δ = 0.53
Verhältnis δ(f=0,5) / δ(f=1) = 2.27   (Theorie: 2)

Gemessen rund 2,3 statt glatt 2 — kein Grund zur Panik, sondern ein bekannter Täter: Bei halber Frequenz ist die Taille \(w_0\) nur noch anderthalb Wellenlängen breit, das Winkelbündel also doppelt so breit, und seine flachen Flügel (kleineres \(\kappa\)) strecken den gemessenen Abfall. Wer es genauer will, muss \(w_0\) mitverdoppeln — und braucht dann eine größere Zelle: Auch Messaufbauten skalieren mit \(\lambda\).

Ü 12.4 (Übertragen). Dreh den Spieß um: Lass den \(55°\)-Strahl von oben (aus dem Vakuum) auf das Glas fallen — feldbild(55.0, von_oben=True) baut das. Sage vorher: Gibt es jetzt Totalreflexion? In welche Richtung knickt der Strahl, und unter welchem Winkel läuft er im Glas? Miss den Winkel mit der \(k_x\)-Methode des Kapitels nach (Messlinie im Glas; bedenke, dass dort \(|k| = n/\lambda_0\) gilt).

Keine Totalreflexion — abwärts (dünn → dicht) ist \(\sin\theta_2 = \sin 55°/1{,}5 = 0{,}546\) immer lösbar: \(\theta_2 = 33{,}1°\), der Strahl knickt zum Lot hin. Der Grenzwinkel ist eine Einbahnstraßen-Schranke. Die Messung — \(k_x\) ist weiterhin erhalten, nur ist der Gesamtbetrag im Glas \(|k| = n/\lambda_0 = 1{,}5\), also \(\sin\theta_2 = k_x/(n k_0)\):

# von oben: feldbild(), kx_aus_zeile(), N_GLAS
ez_oben = feldbild(55.0, von_oben=True)
kx_glas2 = kx_aus_zeile(ez_oben, -0.5)
print(f"kx im Glas: {kx_glas2:.4f}   (Theorie sin55° = "
      f"{np.sin(np.radians(55)):.4f})")
print(f"θ₂ = arcsin(kx/(n·k0)) = "
      f"{np.degrees(np.arcsin(kx_glas2 / N_GLAS)):.2f}°"
      f"   (Snellius: 33,10°)")
kx im Glas: 0.8119   (Theorie sin55° = 0.8192)
θ₂ = arcsin(kx/(n·k0)) = 32.77°   (Snellius: 33,10°)

Auch hier hält \(k_x\) Schritt — dieselben Fußabdrücke, nur diesmal von der schnellen auf die langsame Seite übergeben. Dass ein Teil reflektiert wird, bleibt übrigens auch abwärts wahr (rund 14 % bei diesem Winkel); nur das Total ist der Einbahnstraße vorbehalten.

Das Kleingedruckte

Der seitlich versetzte Wiederaustritt des reflektierten Strahls hat einen Namen: Goos-Hänchen-Verschiebung — der Strahl taucht ein Stück weit als Saum in das dünnere Medium ein, läuft dort ein Stückchen mit und tritt um etwa eine halbe Wellenlänge verschoben wieder aus. Für unsere Bilanz war er Teil des seitlichen Postens; messen lässt er sich erst mit deutlich schmaleren Strahlen, als unsere Zelle erlaubt. Und wer beim „perfekten Spiegel” an die PML aus Kapitel 9 gedacht hat: Genau andersherum — die PML ist der perfekte Schlucker und braucht dafür einen unphysikalischen Material-Trick, die Totalreflexion ist der perfekte Rückwerfer und braucht gar nichts. Echte Glasfasern verlieren übrigens doch ein wenig Licht — nicht an der Totalreflexion (die ist wirklich verlustfrei), sondern an Streuung und Restabsorption im Glas selbst; deshalb wird ihr Werkstoff so rein gekocht, dass man durch einen kilometerdicken Block noch hindurchsehen könnte.