眼鏡をかけている人の写真を撮ると、レンズに蛍光灯が白く映り込んで目が見えなくなることがあります。ところが最近の眼鏡は、正面から見ると薄く紫や緑がかって見えるだけで、映り込みはずいぶん弱い。あの色は汚れでも着色でもなく、厚さ100ナノメートルほどの透明な膜が、反射光を干渉で打ち消していることの証拠です。ガラスの表面は本来、垂直入射でも光の4.26%を跳ね返します。それをコーティング1枚で1%台、3層重ねれば0.2%台まで落とせる——薄膜干渉はそういう技術です。
この「反射を消す」技術は、身の回りだけでなく研究や産業の中核にも入り込んでいます。たとえばカメラの交換レンズは10群以上のレンズを使うので空気とガラスの境界が20面もあり、無コートなら光の6割近くが失われて画面はゴーストとフレアだらけになります。太陽電池では、シリコン表面の反射をどれだけ削れるかがそのまま発電量に効きます。ほかにも、レーザー共振器のミラーや窓板(わずかな戻り光が発振を乱す)、光ファイバの端面(反射がノイズ源になる)、ディスプレイのアンチグレア処理など、光を扱う装置で反射防止(AR: Anti-Reflection)コーティングが載っていない面を探すほうが難しいくらいです。

図の左側が起きていることの全体像です。光は膜の表面と裏面の2か所で反射するので、戻ってくる波が2本になります。右側のように、この2本が「山と谷が逆」でしかも「同じ大きさ」であれば、足し算の結果はどこでもゼロ——反射が消えます。そして消えた分のエネルギーは失われるのではなく、そのまま透過光として下へ流れていきます。
この記事では、「なぜ膜1枚で反射が消えるのか」を多重反射の足し算からきちんと導き、単層膜の設計条件 $n_f = \sqrt{n_0 n_s}$ と厚さ $\lambda/4$ を省略なしで導出します。そのうえで、単層では原理的に届かない性能を出すために使われる特性行列法を導入し、2層のV字型コート・3層の広帯域Wコートまで設計します。最後に、入射角を振ったときと膜厚を作り損ねたときに性能がどう崩れるかを数値で確かめます。
本記事の内容
- 薄膜で反射が消える仕組みの直感的な理解(位相条件と振幅条件)
- 多重反射の等比級数から合成反射係数 $r=(r_1+r_2e^{-2j\delta})/(1+r_1r_2e^{-2j\delta})$ を導出
- $\lambda/4$ 膜の条件 $n_f=\sqrt{n_0n_s}$ の導出と、MgF$_2$ を使ったときの残留反射の評価
- 特性行列法による多層膜への一般化(半波長層=absentee layer の証明つき)
- 2層Vコート・3層Wコートの設計と広帯域化の原理
- Pythonによる反射スペクトル・入射角マップ・膜厚誤差感度の解析
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
特に「2つの波を足すと位相差 $\pi$ で打ち消し合う」という干渉の基本と、境界で光の一部が反射するというフレネルの考え方は、この記事の全編で使います。
なぜ膜を1枚のせると反射が消えるのか
まず、コーティングが無いときに何が起きているかを確認します。空気(屈折率 $n_0=1$)からガラス($n_s=1.52$)に光が垂直に入ると、境界で光の一部が跳ね返ります。跳ね返る割合は後で導く式から $R=4.26\%$ です。100の光を当てて4.26が戻り、95.74が通る。1面ならたいした損ではありませんが、ガラス板1枚には表と裏の2面があり、レンズを何枚も重ねれば面の数はどんどん増えていきます。
さて、この表面に薄い透明な膜をのせると、境界が2つになります。空気と膜の境界、そして膜とガラスの境界です。光は両方で反射するので、戻ってくる光は2本になる。この2本をわざと逆位相にしてぶつけ、消し合わせる——これが反射防止コーティングのアイデアの全部です。
ここで大事なのは、2つの波が完全に消えるためには条件が2つ必要だという点です。波を $A_1e^{j\phi_1}$、$A_2e^{j\phi_2}$ と書けば、和がゼロになるのは
- 位相条件: $\phi_2-\phi_1 = \pi$(逆向き)
- 振幅条件: $A_1 = A_2$(同じ大きさ)
の両方が満たされるときだけです。片方だけでは足りません。位相だけ合っていて振幅が違えば、大きいほうの残りが漏れてきます。振幅だけ合っていても位相がずれていれば、むしろ強め合うことすらあります。

3つのケースを実際に足してみると差は歴然です。(A) は逆位相なので打ち消しは効きますが、振幅が1.0と0.45で釣り合っていないため差の0.55が残ります。(B) は同じ大きさどうしでも位相差が $\pi/2$ しかないため、打ち消すどころか和の振幅が $\sqrt{2}=1.41$ に増えてしまいます。両方が揃った (C) でだけ、和が全区間で完全にゼロになります。反射防止の設計とは、この (C) の状態を作り込む作業にほかなりません。
そして、この2つの条件がそれぞれ膜の厚さと膜の屈折率という2つの設計自由度に対応します。膜の中を往復する分だけ2本目の波は遅れるので、厚さが位相差を決めます。一方、2つの境界での反射の強さは屈折率の飛び幅で決まるので、屈折率が振幅比を決めます。「厚さで位相を合わせ、屈折率で振幅を合わせる」。この対応関係さえ頭に入れば、あとの数式は全部その具体化にすぎません。
もうひとつ、直感的に押さえておきたいことがあります。反射が消えたとき、その光はどこへ行ったのでしょうか。膜は透明で吸収しないので、エネルギーは消えません。反射しなくなった分はすべて透過に回ります。反射防止コーティングは「光を捨てる装置」ではなく「光を通す装置」なのです。だからカメラレンズでも太陽電池でも、ARコートは明るさの改善として効いてくるわけです。
では、この2つの条件を数式にしていきましょう。まずは各境界で「どれだけ反射するか」を与えるフレネル反射係数から出発します。
フレネル反射係数の復習
屈折率 $n_a$ の媒質から $n_b$ の媒質へ光が垂直入射するとき、振幅反射係数は
$$ \begin{equation} r = \frac{n_a – n_b}{n_a + n_b} \end{equation} $$
で与えられます。これは電場と磁場が境界で連続であるという条件から出てくる式で、詳しい導出は光の反射・屈折とスネルの法則にあります。ここでは結果を道具として使います。
観測できるのは強度(パワー)なので、反射率は
$$ R = |r|^2 = \left(\frac{n_a-n_b}{n_a+n_b}\right)^2 $$
です。空気からガラス($n_a=1$, $n_b=1.52$)なら
$$ r = \frac{1-1.52}{1+1.52} = \frac{-0.52}{2.52} = -0.2063, \qquad R = 0.2063^2 = 0.0426 $$

左のグラフでは、空気($n_a=1$)から入るかぎり $n_b>1$ の全域で $r$ が負であり、反射のたびに電場の符号が反転することが読み取れます。右のグラフは反射率で、屈折率が大きいほど急に反射が強くなる様子がわかります。ガラスの4.26%は「ましなほう」で、屈折率3.5のシリコンでは30.9%——当てた光の3割が跳ね返ってしまいます。太陽電池でARコートが必須とされる理由がこの1点に凝縮されています。
つまり4.26%。$r$ が負になっているのが重要です。屈折率の高い側へ入るときの反射では、電場の符号が反転する(位相が $\pi$ ずれる)ことを意味します。逆に高い側から低い側へ出るときは $r>0$ で反転しません。この符号の非対称性が、後で「膜の屈折率を基板より低くする」設計判断につながります。
斜め入射では偏光ごとに式が分かれます。入射角 $\theta_a$、屈折角 $\theta_b$ として、s偏光(電場が入射面に垂直)とp偏光(電場が入射面内)でそれぞれ
$$ r_s = \frac{n_a\cos\theta_a – n_b\cos\theta_b}{n_a\cos\theta_a + n_b\cos\theta_b}, \qquad r_p = \frac{n_b\cos\theta_a – n_a\cos\theta_b}{n_b\cos\theta_a + n_a\cos\theta_b} $$
となります。これを見ると、垂直入射の式で $n$ を
$$ \begin{equation} \eta_s = n\cos\theta, \qquad \eta_p = \frac{n}{\cos\theta} \end{equation} $$
に置き換えただけの形になっていることに気づきます。この $\eta$ を光学アドミッタンス(傾斜アドミッタンス)と呼びます。$\eta$ を使えば偏光と角度の違いを吸収して、すべて $r=(\eta_a-\eta_b)/(\eta_a+\eta_b)$ という1本の式で書ける。この記事でも後半で $\eta$ を使い、垂直入射($\theta=0$)では $\eta=n$ に戻ることを利用します。
ちなみに、この形は電気回路の反射係数 $\Gamma=(Z_1-Z_2)/(Z_1+Z_2)$ とまったく同じです。光学アドミッタンスは特性インピーダンスの逆数に相当し、反射防止コーティングは光学版のインピーダンス整合にほかなりません。L型整合回路の設計で $\sqrt{Z_1Z_2}$ という幾何平均が出てくるのを見たことがあるなら、これから導く $n_f=\sqrt{n_0n_s}$ に既視感を覚えるはずです。
境界での反射の大きさが決まりました。次は、膜の中を往復することで2本目の波がどれだけ遅れるか——位相厚さを求めます。
膜の中の位相厚さ δ
厚さ $d$、屈折率 $n_f$ の膜に、空気側から角度 $\theta_0$ で光が入ってくる状況を考えます。膜の中では屈折角 $\theta_f$(スネルの法則で $n_0\sin\theta_0 = n_f\sin\theta_f$)で進みます。

この作図が以下の計算の全体地図になります。ポイントは、波2が膜内を $A\to B\to C$ と余分に走る一方で、波1も $A$ から $D$ までのあいだ空気中を先行して進んでいることです。素朴に「膜内の往復ぶんが光路差」としてしまうと、この $AD$ の分を二重に数えることになります。以下ではこの図の記号どおりに $AB+BC$ から $AD$ を引いていきます。
上面で反射する光(波1)と、いったん膜に入って下面で反射して戻ってくる光(波2)を比べます。波2は膜の中を斜めに1往復するので、その分だけ余計に走ります。膜の上面での入射点を $A$、下面での反射点を $B$、再び上面に戻る点を $C$ とすると、膜内の経路長は $AB+BC = 2d/\cos\theta_f$ です。屈折率をかけて光路長にすると $2n_fd/\cos\theta_f$。
ただしこれをそのまま光路差にしてはいけません。波1と波2は上面の別々の点($A$ と $C$)から出ていくので、波1のほうも $A$ から $C$ の手前まで空気中を進んでいるからです。$C$ から波1の進行方向に下ろした垂線の足を $D$ とすると、波1は $AD$ の分だけ空気中を余分に走っています。$AC = 2d\tan\theta_f$ で、$AD = AC\sin\theta_0$ ですから、差し引くべき光路長は
$$ n_0 \cdot AD = n_0 \cdot 2d\tan\theta_f\sin\theta_0 $$
です。ここでスネルの法則 $n_0\sin\theta_0=n_f\sin\theta_f$ を代入すると、$n_0\sin\theta_0$ を $n_f\sin\theta_f$ に置き換えられて
$$ n_0\cdot AD = 2d\tan\theta_f\cdot n_f\sin\theta_f = \frac{2n_fd\sin^2\theta_f}{\cos\theta_f} $$
となります。したがって正味の光路差は
$$ \Delta = \frac{2n_fd}{\cos\theta_f} – \frac{2n_fd\sin^2\theta_f}{\cos\theta_f} = \frac{2n_fd(1-\sin^2\theta_f)}{\cos\theta_f} $$
分子に $1-\sin^2\theta_f = \cos^2\theta_f$ を使えば $\cos\theta_f$ が1つ約分できて、驚くほど簡単な形に落ち着きます。
$$ \begin{equation} \Delta = 2n_fd\cos\theta_f \end{equation} $$
光路差 $\Delta$ を位相差に直すには $2\pi/\lambda$ をかけます($\lambda$ は真空中の波長)。往復ぶんの位相差を $2\delta$ と書くことにすると、片道ぶんの位相が
$$ \begin{equation} \delta = \frac{2\pi n_f d\cos\theta_f}{\lambda} \end{equation} $$
と定義できます。この $\delta$ を位相厚さと呼びます。単なる厚さ $d$ ではなく、屈折率と角度と波長が全部混ざった「光にとっての厚さ」です。以降、膜を1枚通り抜けるたびに $e^{-j\delta}$ の因子がつく、と考えてください。
$\delta$ の式を眺めると、設計上とても重要な3つの性質が読み取れます。第一に、$\delta$ は $1/\lambda$ に比例するので、ある波長で狙いどおりの位相にしても、別の波長ではずれます。これが単層ARが特定波長でしか効かない根本原因です。第二に、$\cos\theta_f$ がかかっているので入射角を大きくすると $\delta$ は小さくなり、設計波長が短波長側にずれます(斜めから見た反射防止膜が青紫っぽく見えるのはこのためです)。第三に、$n_fd$ という積で現れるので、屈折率と物理厚さは独立には効きません。この積を光学膜厚と呼び、設計では常に $n_fd$ をひとつの量として扱います。
位相の道具がそろいました。次はいよいよ、無限回の多重反射をすべて足し合わせて、膜1枚の合成反射係数を求めます。
多重反射を足し合わせる — 合成反射係数の導出
膜の中の光は、下面で反射して上面に戻り、そこでまた一部が反射して下面へ、というのを無限に繰り返します。厳密に扱うには、この無限個の波をすべて足す必要があります。

右のグラフは、これから導く「閉じた式」がどれくらい正確かを先に示したものです。各項の振幅は公比 $|r_1r_2|$ の等比数列で落ちていき、MgF$_2$($n_f=1.38$)では公比がわずか0.0077しかないので、2本目以降の寄与は急速に無視できる大きさになります。高屈折率膜($n_f=2.35$)でも公比は0.086です。実線(各項)と破線(部分和と閉じた式の差)が同じ傾きで落ちていることが、級数が等比級数として厳密に閉じることの数値的な裏づけになっています。
記号を決めます。上側の境界(空気→膜)について、振幅反射係数を $r_1$、透過係数を $t_1$、逆向き(膜→空気)の反射係数を $r_1’$、透過係数を $t_1’$ とします。下側の境界(膜→基板)の反射係数を $r_2$ とします。すなわち
$$ r_1 = \frac{n_0-n_f}{n_0+n_f}, \qquad r_2 = \frac{n_f-n_s}{n_f+n_s} $$
です。膜の中を片道進むごとに位相因子 $e^{-j\delta}$ がつきます。
出ていく波を発生順に並べます。
- 1本目: 上面でそのまま反射 → 振幅 $r_1$
- 2本目: 上面を透過($t_1$)→ 膜内を片道($e^{-j\delta}$)→ 下面で反射($r_2$)→ 膜内を片道($e^{-j\delta}$)→ 上面から出る($t_1’$)→ 振幅 $t_1t_1’r_2e^{-2j\delta}$
- 3本目: 2本目の経路の途中で、上面の内側で1回跳ね返って($r_1’$)もう一度往復($r_2e^{-2j\delta}$)→ 振幅 $t_1t_1’r_2e^{-2j\delta}\cdot(r_1’r_2e^{-2j\delta})$
- 以下、往復するたびに $(r_1’r_2e^{-2j\delta})$ が1つずつ増える
つまり2本目以降は公比 $q = r_1’r_2e^{-2j\delta}$ の等比数列です。$|r_1’r_2|<1$ なので級数は必ず収束し、
$$ r = r_1 + t_1t_1’r_2e^{-2j\delta}\sum_{m=0}^{\infty}q^m = r_1 + \frac{t_1t_1’r_2e^{-2j\delta}}{1-r_1’r_2e^{-2j\delta}} $$
と書けます。ここでストークスの関係式を使います。時間反転対称性から導かれる関係で、
$$ r_1′ = -r_1, \qquad t_1t_1′ = 1-r_1^2 $$
が成り立ちます($r_1’=-r_1$ は、垂直入射のフレネル式で $n_0$ と $n_f$ を入れ替えれば直接確かめられます)。これらを代入すると、分母の符号が反転して
$$ r = r_1 + \frac{(1-r_1^2)r_2e^{-2j\delta}}{1+r_1r_2e^{-2j\delta}} $$
となります。右辺を通分しましょう。分母を $1+r_1r_2e^{-2j\delta}$ にそろえると、分子は
$$ r_1(1+r_1r_2e^{-2j\delta}) + (1-r_1^2)r_2e^{-2j\delta} = r_1 + r_1^2r_2e^{-2j\delta} + r_2e^{-2j\delta} – r_1^2r_2e^{-2j\delta} $$
第2項と第4項がきれいに打ち消し合い、残るのは $r_1 + r_2e^{-2j\delta}$ だけです。したがって
$$ \begin{equation} r = \frac{r_1 + r_2e^{-2j\delta}}{1 + r_1r_2e^{-2j\delta}} \end{equation} $$
これが単層膜の合成振幅反射係数です。反射率は $R=|r|^2$ で求まります。
この式は非常によくできています。分子を見れば、狙いどおり「上面の反射 $r_1$」と「下面の反射に往復位相をかけたもの $r_2e^{-2j\delta}$」の足し算になっている。分母の $1+r_1r_2e^{-2j\delta}$ が、膜内で何度も往復する高次の光の効果をまとめて表しています。$r_1r_2$ が小さければ分母はほぼ1なので、弱い反射どうしなら「2本の波の単純な足し算」で近似してよいことも読み取れます。実際、ガラスとMgF$_2$ の組み合わせでは $r_1r_2 \approx 0.16\times(-0.05)$ 程度で、多重反射の寄与はごくわずかです。
式が手に入ったので、次はこれをゼロにする条件を解きます。ここで最初に述べた「位相条件」と「振幅条件」が数式として姿を現します。
反射ゼロの条件 — λ/4膜と n_f = √(n0 n_s)
$r=0$ にするには分子をゼロにすればよく、
$$ r_1 + r_2e^{-2j\delta} = 0 $$
が条件です。$r_1$ と $r_2$ はここでは実数なので、複素数 $e^{-2j\delta}$ が実数にならないと等式は成立しません。実数になるのは $e^{-2j\delta}=\pm1$、すなわち $2\delta$ が $\pi$ の整数倍のときです。
$e^{-2j\delta}=+1$($\delta=0,\pi,2\pi,\dots$)を選ぶと $r_1+r_2=0$ が必要ですが、$n_0
そこで $e^{-2j\delta}=-1$、つまり
$$ 2\delta = \pi \quad\Longrightarrow\quad \delta = \frac{\pi}{2} $$
を選びます。これを位相厚さの定義に戻すと、垂直入射($\theta_f=0$)では
$$ \frac{2\pi n_fd}{\lambda_0} = \frac{\pi}{2} \quad\Longrightarrow\quad \begin{equation} n_fd = \frac{\lambda_0}{4} \end{equation} $$
光学膜厚が設計波長の4分の1、という有名な条件が出ました。これがいわゆる$\lambda/4$膜(quarter-wave layer, QW)です。膜の中を往復すると光路差が $\lambda_0/2$、位相にして $\pi$ になり、2本の反射波がちょうど逆位相になります。これが位相条件の正体です。
$e^{-2j\delta}=-1$ を代入すると、合成反射係数は
$$ r = \frac{r_1-r_2}{1-r_1r_2} $$
となり、これがゼロになる条件は $r_1=r_2$、すなわち
$$ \frac{n_0-n_f}{n_0+n_f} = \frac{n_f-n_s}{n_f+n_s} $$
です。これが振幅条件です。両辺にたすきがけして分母を払います。
$$ (n_0-n_f)(n_f+n_s) = (n_f-n_s)(n_0+n_f) $$
左辺を展開すると $n_0n_f + n_0n_s – n_f^2 – n_fn_s$、右辺を展開すると $n_0n_f + n_f^2 – n_0n_s – n_fn_s$ です。両辺に共通する $n_0n_f$ と $-n_fn_s$ を消すと
$$ n_0n_s – n_f^2 = n_f^2 – n_0n_s $$
移項して $2n_f^2 = 2n_0n_s$、したがって
$$ \begin{equation} n_f = \sqrt{n_0 n_s} \end{equation} $$
膜の屈折率は、両側の媒質の屈折率の幾何平均でなければならない。これが単層反射防止膜の設計条件です。冒頭で述べた「厚さが位相を、屈折率が振幅を決める」という直感が、$n_fd=\lambda_0/4$ と $n_f=\sqrt{n_0n_s}$ という2本の式に正確に対応していることを確認してください。
なお、$n_f=\sqrt{n_0n_s}$ は $n_0
条件を満たさない膜をのせるとどうなるか
実際の材料は理想値ぴったりではないので、$\lambda/4$ 厚は守るが屈折率がずれている場合の残留反射を計算しておくと便利です。$\delta=\pi/2$ での $r=(r_1-r_2)/(1-r_1r_2)$ に、フレネル係数を代入します。まず分子を通分すると
$$ r_1 – r_2 = \frac{(n_0-n_f)(n_f+n_s) – (n_f-n_s)(n_0+n_f)}{(n_0+n_f)(n_f+n_s)} = \frac{2(n_0n_s-n_f^2)}{(n_0+n_f)(n_f+n_s)} $$
(分子の展開は先ほどと同じ計算です)。次に分母を同じ形にそろえると
$$ 1 – r_1r_2 = \frac{(n_0+n_f)(n_f+n_s) – (n_0-n_f)(n_f-n_s)}{(n_0+n_f)(n_f+n_s)} = \frac{2(n_0n_s+n_f^2)}{(n_0+n_f)(n_f+n_s)} $$
共通因子 $(n_0+n_f)(n_f+n_s)$ と因子2が約分されて、非常にすっきりした形になります。
$$ \begin{equation} r(\lambda_0) = \frac{n_0n_s – n_f^2}{n_0n_s + n_f^2}, \qquad R(\lambda_0) = \left(\frac{n_0n_s – n_f^2}{n_0n_s + n_f^2}\right)^2 \end{equation} $$
この式の美しいところは、$n_f^2$ と $n_0n_s$ の「ずれ」がそのまま反射係数になっている点です。$n_f^2=n_0n_s$ ちょうどならゼロ、外れれば外れるほど反射が残る。設計目標が幾何平均であることが式の形からも一目でわかります。
ここまでで単層膜の理論は完成しました。次は実在する材料の数値を入れて、この理論が現実にどこまで通用するかを見てみます。
具体例: ガラスにMgF₂をのせる
一般的な光学ガラス(BK7相当、$n_s=1.52$)を空気中($n_0=1$)で使う場合、理想的な膜の屈折率は
$$ n_f = \sqrt{1\times 1.52} = 1.2329 $$
です。ところが困ったことに、可視光で透明かつ屈折率1.23の緻密な固体材料は存在しません。屈折率は物質の分極率と密度で決まるため、実用的な耐久性のある薄膜材料の下限がおよそ1.35〜1.4なのです。もっとも低いのがフッ化マグネシウム MgF$_2$ で $n_f = 1.38$、次いで二酸化ケイ素 SiO$_2$ で $n_f\approx 1.46$ です。
MgF$_2$ を使ったときの残留反射を、いま導いた式で計算してみましょう。$n_f^2 = 1.38^2 = 1.9044$、$n_0n_s = 1.52$ ですから
$$ r(\lambda_0) = \frac{1.52 – 1.9044}{1.52 + 1.9044} = \frac{-0.3844}{3.4244} = -0.11225 $$
$$ R(\lambda_0) = 0.11225^2 = 0.01260 = 1.26\% $$
無コートの4.26%から1.26%へ、およそ3.4分の1まで減りました。ゼロにはできませんが、大きな改善です。反射係数が負であることは、上面反射が下面反射より強いままで「消し残っている」ことを示しています。膜の屈折率が理想より高すぎるので、下面(膜→ガラス)の屈折率差が小さくなりすぎて、上面の反射に振幅で釣り合えないのです。
必要な物理膜厚も出しておきます。設計波長を可視域の中心 $\lambda_0=550$ nm(人間の目の感度が最大の緑)にとると
$$ d = \frac{\lambda_0}{4n_f} = \frac{550}{4\times 1.38} = 99.6\ \text{nm} $$
わずか0.1マイクロメートル。髪の毛の直径の1000分の1ほどの膜で、反射が3分の1になるわけです。
膜の屈折率を変えたときの残留反射を並べると、この設計がいかに屈折率に敏感かがわかります。
| 膜材料(例) | $n_f$ | $R(\lambda_0)$ |
|---|---|---|
| (理想値) | 1.2329 | 0.000% |
| 多孔質フッ化物 | 1.20 | 0.073% |
| (仮想材料) | 1.30 | 0.280% |
| MgF$_2$ | 1.38 | 1.260% |
| SiO$_2$ | 1.46 | 2.805% |
| Al$_2$O$_3$ | 1.60 | 6.498% |
注目すべきは最下段です。Al$_2$O$_3$($n=1.60$)を $\lambda/4$ でのせると、無コートの4.26%より反射が増えて6.50%になります。基板より屈折率の高い膜は反射防止どころか反射増加膜として働く、という先ほどの指摘が数値でも確認できました。単に「透明な膜をのせれば反射が減る」わけではないのです。

このグラフは上の表を連続的に描き直したものです。曲線は幾何平均1.2329を底とする谷の形をしており、そこから左右どちらにずれても反射が立ち上がります。特徴的なのは谷の左右で立ち上がり方が非対称なことで、屈折率を下げる方向(左)はゆるやかなのに対し、上げる方向(右)は急峻です。だから1.20の多孔質膜は理想からのずれが0.03しかないのに対し、1.38のMgF$_2$は0.15のずれで一気に1.26%まで悪化します。さらに $n_f>1.52$ では曲線が無コートの破線を上回り、赤い領域——反射増加膜になってしまう領域——に入ります。
もうひとつ、上の表からは「屈折率をあと0.1下げられれば1.26%が0.28%になる」という設計者の悲願も読み取れます。実際、この壁を破るために多孔質膜(材料に微細な空隙を作って空気と混ぜ、実効屈折率を下げる)や、蛾の目にヒントを得たモスアイ構造(サブ波長の突起で屈折率を連続的に変化させる)といった手法が研究されています。ただし多孔質膜は機械的に弱く汚れを吸うため、レンズ表面には使いにくいという別の問題を抱えています。
材料の制約で単層の性能は頭打ちです。ならば層を増やして自由度を稼ぐしかありません。ただし3層4層になると、先ほどの等比級数の足し算では手に負えなくなります。そこで、任意の層数を機械的に扱える強力な道具——特性行列法を導入します。
特性行列法 — 多層膜への一般化
多層膜を扱うときの発想の転換は、「光線を追いかけるのをやめて、境界面での電磁場の値を追いかける」ことです。多重反射を数えようとすると層が増えるたびに経路が指数関数的に増えて破綻しますが、場の値なら層1枚あたり行列1個の掛け算で済みます。
膜の中では、前進波と後進波が重なった定在波的な場が立っています。境界面での電場の接線成分 $E$ と磁場の接線成分 $H$ は、マクスウェル方程式の境界条件から必ず連続です。そこで、ある層の下面での $(E,H)$ と上面での $(E,H)$ を結びつける行列を作ります。
層内の波動方程式の解を前進波と後進波の重ね合わせで書き、上下面での値を消去すると、屈折率 $n_j$・位相厚さ $\delta_j$ の層について
$$ \begin{equation} \bm{M}_j = \begin{pmatrix} \cos\delta_j & \dfrac{j\sin\delta_j}{\eta_j} \\[8pt] j\eta_j\sin\delta_j & \cos\delta_j \end{pmatrix} \end{equation} $$
という2×2行列が得られます。これを特性行列と呼びます。$\eta_j$ は先ほど定義した光学アドミッタンス(垂直入射なら $\eta_j=n_j$、s偏光なら $n_j\cos\theta_j$、p偏光なら $n_j/\cos\theta_j$)、$\delta_j=2\pi n_jd_j\cos\theta_j/\lambda$ は位相厚さです。虚数単位を $j$ と書いていますが、添字の $j$ と紛らわしいので以降は層の番号を明示しないときは省きます。
$\bm{M}_j$ の構造を眺めると、対角成分が $\cos\delta$、非対角成分が $\sin\delta$ で、しかも $\eta$ が片方には割られ片方には掛けられている。これは伝送線路の $ABCD$ 行列とまったく同じ形です。薄膜1枚は、特性インピーダンス $1/\eta$・電気長 $\delta$ の伝送線路である——この対応を知っていると、多層膜設計とマイクロ波の多段整合が同じ数学であることが見えてきます。
層が $N$ 枚あるときは、空気側から数えて順に掛けるだけです。
$$ \begin{equation} \begin{pmatrix} B \\ C \end{pmatrix} = \left(\prod_{j=1}^{N}\bm{M}_j\right) \begin{pmatrix} 1 \\ \eta_s \end{pmatrix} \end{equation} $$
右端のベクトル $(1,\eta_s)^\top$ は「基板側には前進波しかない(無限に厚い基板で戻ってこない)」という境界条件を表しています。得られた $B$、$C$ から等価アドミッタンス
$$ Y = \frac{C}{B} $$
を作ると、多層膜つき基板の全体は「アドミッタンス $Y$ の1枚の媒質」と等価になります。あとは空気とその等価媒質の境界として
$$ \begin{equation} r = \frac{\eta_0 – Y}{\eta_0 + Y}, \qquad R = |r|^2 \end{equation} $$
で反射率が求まります。層数がいくつでも手続きは同じ。これが特性行列法の強みです。
単層に戻して整合を確認する
新しい道具を手にしたら、既知の結果を再現できるか確かめるのが鉄則です。単層($N=1$、垂直入射で $\eta=n$)について計算してみます。
$$ \begin{pmatrix} B \\ C \end{pmatrix} =\begin{pmatrix} \cos\delta & j\sin\delta/n_f \\ jn_f\sin\delta & \cos\delta \end{pmatrix} \begin{pmatrix} 1 \\ n_s \end{pmatrix} =\begin{pmatrix} \cos\delta + jn_s\sin\delta/n_f \\ jn_f\sin\delta + n_s\cos\delta \end{pmatrix} $$
ここで $\lambda/4$ 膜、すなわち $\delta=\pi/2$ を代入します。$\cos(\pi/2)=0$、$\sin(\pi/2)=1$ なので
$$ B = j\frac{n_s}{n_f}, \qquad C = jn_f $$
等価アドミッタンスは虚数単位が約分されて
$$ Y = \frac{C}{B} = \frac{jn_f}{jn_s/n_f} = \frac{n_f^2}{n_s} $$
これを反射係数の式に入れると
$$ r = \frac{n_0 – n_f^2/n_s}{n_0 + n_f^2/n_s} = \frac{n_0n_s – n_f^2}{n_0n_s + n_f^2} $$
先ほど等比級数から導いた式と完全に一致しました。特性行列法が正しく機能していることが確認できます。
この計算からもうひとつ重要な事実が読めます。$\lambda/4$ 層は、入ってきたアドミッタンス $Y_{\text{in}}$ を
$$ \begin{equation} Y_{\text{out}} = \frac{\eta^2}{Y_{\text{in}}} \end{equation} $$
に変換する、という単純な作用を持ちます。これはアドミッタンス反転器です(マイクロ波の $\lambda/4$ 変成器と同じ)。多層設計はこの「反転」を何回か使って、基板のアドミッタンス $n_s$ を空気の $n_0=1$ に運ぶパズルだと考えられます。
半波長層は「見えない層」になる
もうひとつ、多層設計で決定的に効く性質を証明しておきます。$\delta=\pi$ の層、つまり光学膜厚が $\lambda_0/2$ の層(half-wave layer, HW)を考えます。$\cos\pi = -1$、$\sin\pi = 0$ なので特性行列は
$$ \bm{M} = \begin{pmatrix} -1 & 0 \\ 0 & -1 \end{pmatrix} = -\bm{I} $$
単位行列のマイナス1倍です。これを掛けると $B$ も $C$ も同時に符号が変わりますが、$Y=C/B$ では符号が打ち消し合うので等価アドミッタンスはまったく変化しません。つまり、設計波長 $\lambda_0$ において半波長層は光学的に存在しないのと同じになります。これをabsentee layer(欠席層)と呼びます。

左の数直線は、多層設計が「アドミッタンスを空気の1.0まで運ぶすごろく」であることを可視化したものです。MgF$_2$ を1枚のせただけでは1.52が1.2529までしか動かず、赤い破線(目標の1.0)に届きません。ところが $n_2=1.7014$ の層でいったん1.9044まで遠ざけてから MgF$_2$ で反転させると、ぴったり1.0000に着地します。遠回りに見える一手が正解になる、というのが多層設計の面白さです。右のグラフは半波長層の効果で、設計波長510 nmでは2層と3層のカーブが同じ点(反射率0.00000%)を通り、そこから離れた波長でだけ緑の破線が大きく下がっています。半波長層が「設計波長では何もせず、周辺波長でだけ働く層」であることが一目でわかります。
これは一見すると無駄な層ですが、実は広帯域設計の主役です。なぜなら、$\delta = \pi$ が成り立つのは $\lambda=\lambda_0$ のときだけだからです。設計波長では何もせず、設計波長から外れたところでだけ働く層——欲しかったのはまさにこれです。中心波長の性能を壊さずに、周辺波長の反射だけを叩ける。3層Wコートはこの性質を使って作ります。
道具がそろいました。まず2層で「究極の1点狙い」を作り、次に3層で「広帯域」を作ります。
2層コート(Vコート)— 1つの波長を完全にゼロにする
単層でゼロにできなかったのは、$n_f=1.2329$ という材料が無かったからでした。では、手に入る屈折率だけを2枚組み合わせて、実効的に理想値を合成することはできないでしょうか。
$\lambda/4$ 層を2枚重ねます。空気側から順に $n_1$(外側)、$n_2$(内側、基板に接する)とします。先ほど示したアドミッタンス反転の性質を2回使えばよいので、計算は暗算でできます。基板から出発して、
- 内側の層($n_2$)を通ると: $Y \to n_2^2/n_s$
- 外側の層($n_1$)を通ると: $Y \to n_1^2/(n_2^2/n_s) = \dfrac{n_1^2 n_s}{n_2^2}$
したがって全体の等価アドミッタンスは
$$ \begin{equation} Y = \frac{n_1^2 n_s}{n_2^2} \end{equation} $$
反射ゼロの条件 $Y=n_0$ から
$$ \frac{n_1^2n_s}{n_2^2} = n_0 \quad\Longrightarrow\quad \begin{equation} \frac{n_2}{n_1} = \sqrt{\frac{n_s}{n_0}} \end{equation} $$
重要なのは、条件が屈折率の「比」だけで書かれていることです。単層では絶対値 $n_f=1.2329$ が要求されて詰みましたが、2層では比さえ合えばよい。自由度がひとつ増えたおかげで、実在材料で解が作れます。
$n_s=1.52$、$n_0=1$ なら必要な比は $\sqrt{1.52}=1.2329$。外側に MgF$_2$($n_1=1.38$)を使うと、内側に必要なのは
$$ n_2 = 1.38\times 1.2329 = 1.7014 $$
屈折率1.70前後の材料(酸化物の混合膜などで作れます)を1枚挟むだけです。実際に $n_2=1.70$(ぴったり1.7014でなくても)で計算すると
$$ R(\lambda_0) = \left(\frac{n_0n_2^2 – n_sn_1^2}{n_0n_2^2 + n_sn_1^2}\right)^2 = \left(\frac{2.8900 – 2.8947}{2.8900 + 2.8947}\right)^2 = 6.6\times10^{-7} $$
0.00007%。実質ゼロです。単層の1.26%と比べると、桁が4つ違います。
ただし、これには代償があります。次節の数値計算で見ますが、この設計の反射スペクトルは設計波長で深く鋭い谷を作り、そこから外れると急速に立ち上がるV字型になります。実際、400 nmでの反射率は4.35%と、無コートのガラス(4.26%)より悪くなります。だからこの設計は「Vコート」と呼ばれ、レーザーのように波長が単色で決まっている用途専用です。カメラレンズにVコートを使えば、赤と青が反射しまくって使い物になりません。
では、谷を広げるにはどうすればよいか。ここで先ほど証明した「半波長層=absentee layer」が効いてきます。
3層コート(Wコート)— 広帯域化の原理
広帯域ARの定番が、外側から順に$\lambda/4$(低屈折率)/ $\lambda/2$(高屈折率)/ $\lambda/4$(中屈折率)と積む3層構成です。頭文字をとってQHQ構成、スペクトル形状からWコートと呼ばれます。
仕組みは2段構えです。
(1)設計波長 $\lambda_0$ では、真ん中の半波長層は消える。 absentee layer の性質から、$\lambda=\lambda_0$ における等価アドミッタンスは、真ん中の層が無い場合と同じ、つまり2層Vコートの式そのままです。
$$ Y(\lambda_0) = \frac{n_1^2n_s}{n_3^2} $$
(2)$\lambda_0$ から外れると、半波長層が働き始める。 $\delta_2 \neq \pi$ になるので $\bm{M}_2$ は $-\bm{I}$ から外れ、アドミッタンスを動かします。この「動き」を使って、$\lambda_0$ の両側にもう2つの反射ゼロ点を作るのです。
うまく作るコツは、少し意外なところにあります。あえて $n_3$ をVコートの完全整合値(1.7014)から外すのです。そうすると $\lambda_0$ では完全ゼロにならず、小さな山(極大)が残ります。しかしその代わり、その山の両側に真のゼロ点が2つ現れる。結果としてスペクトルは「ゼロ・小さな山・ゼロ」というW字型になり、その谷2つで挟まれた広い範囲が低反射に保たれます。1点で完全にゼロにする代わりに、広い帯域でそこそこゼロに近い値を保つ——設計思想としてはチェビシェフ的な等リプル近似の発想です。
実際の設計例として、$\lambda_0 = 510$ nm、材料を
- 第1層(外側): MgF$_2$, $n_1=1.38$, $\lambda/4$ → $d_1 = 510/(4\times1.38) = 92.4$ nm
- 第2層(中間): ZrO$_2$ 相当, $n_2=2.10$, $\lambda/2$ → $d_2 = 510/(2\times2.10) = 121.4$ nm
- 第3層(内側): Al$_2$O$_3$ 相当, $n_3=1.62$, $\lambda/4$ → $d_3 = 510/(4\times1.62) = 78.7$ nm
としてみます。$\lambda_0=510$ nm での反射率は、absentee の性質からVコートの式で予言できます。
$$ R(\lambda_0) = \left(\frac{1\times 1.62^2 – 1.52\times 1.38^2}{1\times 1.62^2 + 1.52\times 1.38^2}\right)^2 = \left(\frac{2.6244-2.8947}{2.6244+2.8947}\right)^2 = 0.00240 = 0.240\% $$
そして数値計算すると、442 nm と 604 nm にきれいなゼロ点が現れ、400〜700 nm の全域で反射率は最大でも1.08%、平均0.214%に収まります。単層MgF$_2$ の平均1.47%と比べて7分の1です。
なぜ中間層に高屈折率材料(2.10)を使うのかも直感的に説明できます。半波長層の「働き」の強さは、$\delta$ が $\pi$ からずれたときにアドミッタンスをどれだけ動かせるかで決まり、それは周囲との屈折率コントラストに比例します。コントラストが弱いと帯域が広がらず、逆に強すぎると振れが大きくなりすぎてスペクトルが暴れます。$n_2=2.10$ 前後がちょうどよいバランスなのです(実際、$n_2=2.30$ にすると同じ構成でも最大反射率が1.08%から2.61%に悪化します)。
理論の話はここまでです。以降は、いま設計した3つのコート(単層・Vコート・Wコート)をPythonで実装して、スペクトル・入射角・製造誤差の3つの観点から性能を比べます。
Pythonでの実装(1)特性行列法と反射スペクトル
まず特性行列法をそのまま関数にします。任意の層数・任意の入射角・任意の偏光を1本の関数で扱えるように書きます。
import numpy as np
def reflectance(lam_nm, layers, n0=1.0, ns=1.52, theta0_deg=0.0, pol="s"):
"""特性行列法で多層膜の反射率を計算する
lam_nm : 波長 [nm](スカラーまたは配列)
layers : [(屈折率, 物理膜厚[nm]), ...] 空気側から基板側の順
n0 : 入射媒質の屈折率, ns : 基板の屈折率
pol : "s" または "p"
"""
lam = np.atleast_1d(np.asarray(lam_nm, dtype=float))
theta0 = np.deg2rad(theta0_deg)
s0 = n0 * np.sin(theta0) # スネルの不変量 n*sinθ
def eta(n): # 光学アドミッタンス
cos_t = np.sqrt(1 - (s0 / n) ** 2 + 0j)
return n * cos_t if pol == "s" else n / cos_t
# 単位行列から出発して層を順に掛ける
one = np.ones_like(lam) + 0j
zero = np.zeros_like(lam) + 0j
M = [[one, zero], [zero, one]]
for n, d in layers:
cos_t = np.sqrt(1 - (s0 / n) ** 2 + 0j)
delta = 2 * np.pi * n * d * cos_t / lam # 位相厚さ
e = eta(n)
m = [[np.cos(delta), 1j * np.sin(delta) / e],
[1j * e * np.sin(delta), np.cos(delta)]]
M = [[M[0][0]*m[0][0] + M[0][1]*m[1][0], M[0][0]*m[0][1] + M[0][1]*m[1][1]],
[M[1][0]*m[0][0] + M[1][1]*m[1][0], M[1][0]*m[0][1] + M[1][1]*m[1][1]]]
e0, es = eta(n0), eta(ns)
B = M[0][0] + M[0][1] * es # 境界条件 (1, ηs)^T を掛ける
C = M[1][0] + M[1][1] * es
r = (e0 * B - C) / (e0 * B + C) # Y = C/B を代入した形
return np.abs(r) ** 2
関数の中身は、これまで導いた式をそのまま並べただけです。層ごとに $\delta$ と $\eta$ を計算して2×2行列を作り、順に掛け、最後に境界条件ベクトル $(1,\eta_s)^\top$ を掛けて $B,C$ を得る。$r=(\eta_0-Y)/(\eta_0+Y)$ に $Y=C/B$ を代入して分母分子に $B$ を掛けると、コード中の $(\eta_0B-C)/(\eta_0B+C)$ という形になります。
次に3つの設計を定義して、可視域のスペクトルを描きます。
import matplotlib, matplotlib.pyplot as plt
for cand in ["Hiragino Sans", "Yu Gothic", "Noto Sans CJK JP", "IPAexGothic", "Meiryo"]:
if any(cand == f.name for f in matplotlib.font_manager.fontManager.ttflist):
plt.rcParams["font.family"] = cand
break
plt.rcParams["axes.unicode_minus"] = False
L0 = 550.0 # 単層・Vコートの設計波長 [nm]
L0W = 510.0 # Wコートの設計波長 [nm]
BARE = [] # 無コート
SINGLE = [(1.38, L0 / (4 * 1.38))] # MgF2 λ/4
VCOAT = [(1.38, L0 / (4 * 1.38)), # MgF2 λ/4
(1.70, L0 / (4 * 1.70))] # n=1.70 λ/4
WCOAT = [(1.38, L0W / (4 * 1.38)), # MgF2 λ/4
(2.10, L0W / (2 * 2.10)), # ZrO2 λ/2 (absentee)
(1.62, L0W / (4 * 1.62))] # Al2O3 λ/4
lam = np.linspace(400, 700, 601)
designs = [("無コート", BARE, "gray"), ("単層 MgF$_2$", SINGLE, "tab:blue"),
("2層 Vコート", VCOAT, "tab:orange"), ("3層 Wコート", WCOAT, "tab:red")]
plt.figure(figsize=(9, 5.5))
for name, lay, c in designs:
R = reflectance(lam, lay) * 100
plt.plot(lam, R, label=f"{name}(平均 {R.mean():.2f}%)", color=c, lw=2)
plt.xlabel("波長 [nm]"); plt.ylabel("反射率 [%]")
plt.title("反射防止コーティングの反射スペクトル(ガラス $n_s$=1.52・垂直入射)")
plt.ylim(0, 5); plt.grid(alpha=0.3); plt.legend()
plt.tight_layout(); plt.show()
for name, lay, _ in designs:
R = reflectance(lam, lay)
print(f"{name:12s} R(550nm)={reflectance(550, lay)[0]*100:6.3f}% "
f"最大={R.max()*100:6.3f}% 平均={R.mean()*100:6.3f}%")
実行すると次の数値が得られます。
無コート R(550nm)= 4.258% 最大= 4.258% 平均= 4.258%
単層 MgF$_2$ R(550nm)= 1.260% 最大= 2.205% 平均= 1.466%
2層 Vコート R(550nm)= 0.000% 最大= 4.346% 平均= 1.120%
3層 Wコート R(550nm)= 0.147% 最大= 1.080% 平均= 0.214%

このスペクトルからは、3つの設計思想の違いがはっきり読み取れます。単層MgF$_2$ は550 nmで1.26%の谷を作りますが、その谷はとても浅く、可視域全体でだらだらと1〜2%を保ちます。悪くはないが劇的でもない、という典型です。Vコートは550 nmで完全にゼロまで落ちる代わりに、両端で急峻に立ち上がり、400 nmでは4.35%と無コートを上回ってしまいます。狙った1波長だけを見れば最強、それ以外は最弱という極端な設計です。Wコートは442 nmと604 nmの2点でゼロに触れ、その間の510 nmでは0.24%のわずかな山を作りながら、400〜700 nmの全域を1.08%以下に抑え込んでいます。平均反射率0.214%は単層の7分の1、Vコートの5分の1です。
「平均で7分の1」がどれほどのインパクトを持つか、多面系で確かめてみます。
# レンズ10枚(境界面20面)を通ったときの総透過率
for name, lay, _ in designs:
Rm = reflectance(lam, lay).mean()
print(f"{name:12s} 1面 R={Rm*100:5.3f}% → 20面通過後の透過率 {(1-Rm)**20*100:5.1f}%")
無コート 1面 R=4.258% → 20面通過後の透過率 41.9%
単層 MgF$_2$ 1面 R=1.466% → 20面通過後の透過率 74.4%
2層 Vコート 1面 R=1.120% → 20面通過後の透過率 79.8%
3層 Wコート 1面 R=0.214% → 20面通過後の透過率 95.8%

左のグラフは面数を横軸にとった累積透過率で、$(1-R)^N$ の指数関数的な減衰がそのまま現れています。無コートのカーブだけが急激に沈み、10面(レンズ5枚)の時点で早くも64.7%まで落ちます。右の棒グラフが実用上の結論で、1面あたりでは4.26%対0.214%という「たかが4%の差」が、20面では41.9%対95.8%という2倍以上の明るさの差に増幅されます。
面が20枚あると差が容赦なく効いてきます。無コートでは光の6割近くが失われて41.9%しか通らないのに対し、Wコートなら95.8%が通ります。しかも失われた光はレンズ内部を跳ね回ってゴーストやフレアになるので、明るさだけでなくコントラストにも効くわけです。「レンズは硝材で決まる」と言われがちですが、実際にはコーティング技術が写りを大きく左右することが、この数字からうかがえます。
垂直入射での比較が終わったので、次は現実の使用条件——光がさまざまな角度で入ってくる場合を見てみます。
Pythonでの実装(2)入射角依存性
位相厚さの式 $\delta = 2\pi n_fd\cos\theta_f/\lambda$ を思い出してください。入射角を増やすと $\cos\theta_f<1$ になるので $\delta$ が減ります。$\delta=\pi/2$ を保つには $\lambda$ も小さくしなければならないので、設計波長が短波長側にずれます。これがARコートを斜めから見ると青紫に見える理由です。さらに、斜め入射ではs偏光とp偏光でアドミッタンスが分かれるので、両者を別々に計算して平均する必要があります(自然光の場合)。
import numpy as np
import matplotlib.pyplot as plt
angles = np.arange(0, 61, 1.0)
lam = np.linspace(400, 700, 301)
fig, axes = plt.subplots(1, 3, figsize=(14, 4.2), constrained_layout=True)
for ax, (name, lay) in zip(axes, [("単層 MgF$_2$", SINGLE),
("2層 Vコート", VCOAT),
("3層 Wコート", WCOAT)]):
# 無偏光 = (Rs + Rp)/2 のマップを作る
Rmap = np.zeros((len(angles), len(lam)))
for i, a in enumerate(angles):
Rs = reflectance(lam, lay, theta0_deg=a, pol="s")
Rp = reflectance(lam, lay, theta0_deg=a, pol="p")
Rmap[i] = (Rs + Rp) / 2 * 100
im = ax.pcolormesh(lam, angles, Rmap, cmap="viridis",
vmin=0, vmax=4, shading="auto")
ax.set_xlabel("波長 [nm]"); ax.set_ylabel("入射角 [deg]")
ax.set_title(f"{name}:反射率マップ(無偏光)")
fig.colorbar(im, ax=ax, label="反射率 [%]")
plt.show()

マップから読み取れることは3つあります。第一に、低反射の谷(暗い帯)が入射角とともに左(短波長側)に傾いています。これは $\cos\theta_f$ による設計波長の青方偏移そのものです。第二に、Wコートの暗い領域は角度40°付近まで広い波長範囲で残っており、Vコートの細い谷より圧倒的に頑丈です。第三に、どの設計も50〜60°を超えると急に明るく(反射が強く)なります。反射防止コーティングは万能ではなく、おおむね入射角40°程度までが実用範囲だとわかります。
具体的な数値でも押さえておきましょう。
print("λ=550nm での反射率 [%](s / p / 無偏光平均)")
for a in [0, 20, 30, 40, 50, 60]:
row = []
for name, lay in [("無コート", BARE), ("単層", SINGLE),
("Vコート", VCOAT), ("Wコート", WCOAT)]:
Rs = reflectance(550, lay, theta0_deg=a, pol="s")[0] * 100
Rp = reflectance(550, lay, theta0_deg=a, pol="p")[0] * 100
row.append(f"{name} {Rs:6.3f}/{Rp:6.3f}/{(Rs+Rp)/2:6.3f}")
print(f" {a:2d}° | " + " | ".join(row))
λ=550nm での反射率 [%](s / p / 無偏光平均)
0° | 無コート 4.258/ 4.258/ 4.258 | 単層 1.260/ 1.260/ 1.260 | Vコート 0.000/ 0.000/ 0.000 | Wコート 0.147/ 0.147/ 0.147
20° | 無コート 5.001/ 3.570/ 4.285 | 単層 1.558/ 1.006/ 1.282 | Vコート 0.051/ 0.037/ 0.044 | Wコート 0.180/ 0.061/ 0.120
30° | 無コート 6.121/ 2.708/ 4.414 | 単層 2.064/ 0.702/ 1.383 | Vコート 0.287/ 0.151/ 0.219 | Wコート 0.275/ 0.005/ 0.140
40° | 無コート 8.135/ 1.555/ 4.845 | 単層 3.110/ 0.317/ 1.714 | Vコート 1.063/ 0.359/ 0.711 | Wコート 0.584/ 0.066/ 0.325
50° | 無コート 11.740/ 0.379/ 6.059 | 単層 5.310/ 0.027/ 2.669 | Vコート 3.163/ 0.697/ 1.930 | Wコート 1.538/ 0.554/ 1.046
60° | 無コート 18.344/ 0.153/ 9.248 | 単層 10.082/ 0.605/ 5.343 | Vコート 8.246/ 1.744/ 4.995 | Wコート 4.365/ 2.439/ 3.402
この表には興味深い非対称性が現れています。s偏光は角度とともに一貫して悪化し、p偏光はむしろ改善するのです。無コートの60°でs偏光18.3%に対しp偏光0.15%という極端な差は、p偏光がブリュースター角($\arctan 1.52 = 56.7°$)付近で反射がほぼ消えるためです。コーティング後も傾向は同じで、s偏光が全体の足を引っ張ります。だから、大きな入射角で使う光学素子(プリズムの斜面、ビームスプリッタなど)では、s偏光を意識した専用設計が必要になります。

左のグラフを見ると、実線(s偏光)は例外なく右肩上がり、破線(p偏光)はいったん下がってブリュースター角付近で底を打つ、という正反対の振る舞いが確認できます。無コート(灰色)の破線が56.7°でゼロに触れているのがブリュースター角そのもので、コートを付けた3本の破線も似た位置に極小を持ちます。右の無偏光平均では、40°の点線まではWコートの赤い線がほぼ床に張りついたままで、そこを超えると急速に立ち上がる——実用範囲の目安が40°前後だという指摘が視覚的にも裏づけられます。
もうひとつ、Wコートは30°でも無偏光平均0.140%と、垂直入射(0.147%)とほとんど変わらない性能を保っています。層が多いほど角度耐性も上がる、というのは経験的に知られていることですが、数値でもはっきり確認できました。
角度の影響がわかったので、最後に製造側の現実——膜厚を作り損ねたときに何が起きるかを調べます。
Pythonでの実装(3)膜厚誤差の感度解析
コーティングは真空蒸着やスパッタリングで作られ、膜厚は光学モニタや水晶振動子でリアルタイム監視されます。それでも数%の誤差は避けられません。設計が誤差にどれだけ強いかは、量産の歩留まりに直結する重要な指標です。
import numpy as np
import matplotlib.pyplot as plt
lam = np.linspace(400, 700, 601)
errors = [0.95, 1.00, 1.05] # 全層の膜厚を -5%, 設計値, +5%
fig, axes = plt.subplots(1, 3, figsize=(14, 4.2), constrained_layout=True)
for ax, (name, lay) in zip(axes, [("単層 MgF$_2$", SINGLE),
("2層 Vコート", VCOAT),
("3層 Wコート", WCOAT)]):
for f, style in zip(errors, ["--", "-", ":"]):
lay_e = [(n, d * f) for n, d in lay] # 全層を一律スケール
R = reflectance(lam, lay_e) * 100
ax.plot(lam, R, style, lw=2,
label=f"膜厚 ×{f:.2f}(平均 {R.mean():.2f}%)")
ax.set_xlabel("波長 [nm]"); ax.set_ylabel("反射率 [%]")
ax.set_title(f"{name}:膜厚 ±5% の影響"); ax.set_ylim(0, 5)
ax.grid(alpha=0.3); ax.legend(fontsize=9)
plt.show()
print("設計波長での反射率 [%](膜厚スケール依存)")
for name, lay, l0 in [("単層", SINGLE, 550), ("Vコート", VCOAT, 550),
("Wコート", WCOAT, 510)]:
vals = [reflectance(l0, [(n, d*f) for n, d in lay])[0]*100 for f in errors]
print(f" {name:8s} λ0={l0}nm : " +
" ".join(f"×{f:.2f}→{v:.4f}%" for f, v in zip(errors, vals)))
設計波長での反射率 [%](膜厚スケール依存)
単層 λ0=550nm : ×0.95→1.2791% ×1.00→1.2601% ×1.05→1.2791%
Vコート λ0=550nm : ×0.95→0.1182% ×1.00→0.0001% ×1.05→0.1182%
Wコート λ0=510nm : ×0.95→0.1932% ×1.00→0.2398% ×1.05→0.1932%

3枚のグラフに共通しているのは、誤差がスペクトルの形を壊すのではなく、そのまま横に平行移動させるという点です。膜厚を5%厚くすれば谷が5%長波長側へ、薄くすれば短波長側へずれるだけで、谷の深さ自体はほとんど変わりません。位相厚さ $\delta$ が $n_fd/\lambda$ という比でしか効かないので、$d$ を1.05倍することと $\lambda$ を1.05倍することが同義になるためです。だからこそ設計波長付近では影響が小さく、帯域端(Wコートの700 nm側など)では性能が大きく崩れます。

左のグラフは、設計波長での反射率を膜厚スケールの関数として描いたものです。3本とも $\times1.00$ の点で接線が水平になっており(Vコートと単層は谷、Wコートは山)、これが「誤差に対して1次で鈍感」であることの正体です。灰色の帯($\pm5\%$)の中で値がほとんど動いていないことを確認してください。右の棒グラフは次節で詳しく見る層別の感度で、第2層(半波長層)だけが突出して最大反射率を悪化させています。
まず目を引くのは、3つの設計すべてで $\pm5\%$ の誤差がまったく同じ結果を与えていることです。1.2791% と 1.2791%、0.1182% と 0.1182%、0.1932% と 0.1932%。これは偶然ではありません。$\lambda/4$ 設計では $\delta=\pi/2$ が反射率の極値なので、そこでの微分がゼロ、つまり膜厚誤差に対して1次で鈍感(2次でしか効かない)なのです。$5\%$ の厚さ誤差がVコートで 0.0001% → 0.118% という「大きな相対悪化」に見えても、絶対値としてはまだ0.12%であり、無コートの4.26%に比べれば無視できるレベルに留まっています。$\lambda/4$ 設計が製造現場で愛される理由がここにあります。
Wコートだけ符号の向きが逆なのも面白いところです。510 nm はWコートにとって2つのゼロ点に挟まれた小さな山の頂上(0.240%)なので、膜厚がどちらにずれても山から降りる方向に動き、反射率はむしろ 0.193% へ下がります。極値であることは同じですが、それが谷か山かで誤差の効き方の符号が変わる、というわけです。
一方で、帯域全体を見ると話が変わります。
print("400-700nm 帯域での性能(膜厚スケール依存)")
for name, lay in [("単層", SINGLE), ("Vコート", VCOAT), ("Wコート", WCOAT)]:
for f in errors:
R = reflectance(lam, [(n, d*f) for n, d in lay])
print(f" {name:8s} ×{f:.2f} : 最大 {R.max()*100:6.3f}% 平均 {R.mean()*100:6.3f}%")
400-700nm 帯域での性能(膜厚スケール依存)
単層 ×0.95 : 最大 1.918% 平均 1.449%
単層 ×1.00 : 最大 2.205% 平均 1.466%
単層 ×1.05 : 最大 2.518% 平均 1.516%
Vコート ×0.95 : 最大 3.338% 平均 1.064%
Vコート ×1.00 : 最大 4.346% 平均 1.120%
Vコート ×1.05 : 最大 5.153% 平均 1.305%
Wコート ×0.95 : 最大 1.970% 平均 0.337%
Wコート ×1.00 : 最大 1.080% 平均 0.214%
Wコート ×1.05 : 最大 3.111% 平均 0.278%
帯域端では話が別です。膜厚が5%厚くなればスペクトル全体が5%長波長側にシフトするので、700 nm側の性能が悪化し、最大反射率はWコートで1.08%から3.11%へ跳ね上がります。「設計波長では鈍感、帯域端では敏感」——これが $\lambda/4$ 系設計の誤差特性です。ただし、これでも平均反射率は0.28%と、誤差ありのWコートが誤差なしの単層(1.47%)を5倍以上上回っています。層数を増やすことのメリットは、多少の製造誤差では失われません。
最後に、どの層の誤差が一番効くかを個別に調べます。
print("Wコート:1層だけ +5% した場合")
R0 = reflectance(lam, WCOAT)
print(f" 設計値 : 最大 {R0.max()*100:6.3f}% 平均 {R0.mean()*100:6.3f}%")
names = ["第1層 MgF2 (λ/4)", "第2層 ZrO2 (λ/2)", "第3層 Al2O3 (λ/4)"]
for i, nm in enumerate(names):
lay_e = [(n, d * (1.05 if j == i else 1.0)) for j, (n, d) in enumerate(WCOAT)]
R = reflectance(lam, lay_e)
print(f" {nm} +5% : 最大 {R.max()*100:6.3f}% 平均 {R.mean()*100:6.3f}%")
Wコート:1層だけ +5% した場合
設計値 : 最大 1.080% 平均 0.214%
第1層 MgF2 (λ/4) +5% : 最大 1.792% 平均 0.259%
第2層 ZrO2 (λ/2) +5% : 最大 2.190% 平均 0.279%
第3層 Al2O3 (λ/4) +5% : 最大 1.051% 平均 0.221%
最も誤差に敏感なのは第2層の半波長層で、これだけ5%厚くすると最大反射率が1.08%から2.19%へ倍増します。理由は明快で、半波長層は「$\delta=\pi$ ちょうど」でのみ absentee になるからです。厚さがずれると設計波長でも消えずに残り、せっかく作った中心付近の低反射を乱してしまいます。逆に第3層(内側の $\lambda/4$)は最大反射率がむしろ1.051%へ微減しており、この設計が第3層の厚さに関してはほぼ最適点にないことを示唆します(もう少し厚くしたほうがよい方向)。
実務的には、半波長層の膜厚制御に最も気を使うべきという設計指針がここから出てきます。実際の蒸着装置では、この層だけ光学モニタでの終点検出(透過率の極値を検出する方法)を使うといった工夫がなされます。
数値実験を通じて設計の全体像が見えました。最後に、この記事のモデルが取りこぼしている現実の要素を整理しておきます。
モデルの限界と実務上の注意
この記事では、話を透明にするためにいくつかの理想化をしました。実際に設計するときに効いてくる要素を挙げておきます。
(1)屈折率の波長分散を無視している。 実際の材料の屈折率は波長とともに変化します(可視域では短波長ほど高い、正常分散)。MgF$_2$ なら400 nmで約1.395、700 nmで約1.376といった具合です。この記事の計算は数%レベルの誤差を含んでおり、実設計ではセルマイヤー式などで $n(\lambda)$ を与えます。ただし、傾向や設計思想は変わりません。
(2)吸収を無視している。 屈折率を実数として扱いましたが、実際には複素屈折率 $\tilde n = n – jk$ です。可視域の誘電体膜なら $k$ はほぼゼロですが、紫外域や、金属を含む膜では吸収が効き、$R+T<1$ になります。特性行列法は複素屈折率をそのまま入れれば動くので、拡張は容易です。
(3)基板の裏面を無視している。 実際のガラス板には裏面があり、そこでも4.26%反射します。表面だけコートしても、板全体の透過率は裏面の反射で制限されます。両面コートが基本です。また、基板が有限の厚さで干渉が起きるほど薄い(数マイクロメートル)場合は、基板も1つの層として扱う必要があります。
(4)膜の不均一性・界面粗さを無視している。 実際の膜には柱状構造による異方性、堆積条件による密度変化、界面の混合層があり、名目屈折率どおりにはなりません。特に多孔質な膜は大気中の水分を吸って屈折率が変わるため、湿度で性能が変動します。
(5)層数をもっと増やせる。 実用の広帯域ARは4〜7層、ブロードバンド反射防止(400〜1100 nmで0.5%以下など)では10層を超えることもあります。層数が増えると解析設計では手に負えなくなるので、特性行列法を評価関数に組み込んだ数値最適化(メリット関数の最小化)が使われます。この記事の reflectance 関数はそのまま最適化のコアに使えます。
(6)まったく別のアプローチもある。 屈折率を空気から基板まで連続的に変化させる勾配屈折率(GRIN)ARや、波長より小さい突起で実効屈折率を連続変化させるモスアイ構造は、原理的に極めて広帯域・広角度なARを実現します。干渉ではなく「境界そのものを無くす」発想で、ナノインプリントの進歩とともに実用化が進んでいます。
まとめ
本記事では、薄膜干渉による反射防止コーティングの原理と設計を解説しました。
- 反射が消えるには条件が2つ: 2本の反射波の位相差が $\pi$(位相条件)で、かつ振幅が等しい(振幅条件)。前者は膜の厚さ、後者は膜の屈折率が担う
- 多重反射の等比級数から $r=(r_1+r_2e^{-2j\delta})/(1+r_1r_2e^{-2j\delta})$ が導かれる。位相厚さは $\delta=2\pi n_fd\cos\theta_f/\lambda$
- 単層AR の条件は $\delta=\pi/2$(光学膜厚 $\lambda_0/4$)と $n_f=\sqrt{n_0n_s}$。$\lambda_0$ での残留反射は $R=\left((n_0n_s-n_f^2)/(n_0n_s+n_f^2)\right)^2$
- 材料の壁: ガラス($n_s=1.52$)の理想値は1.2329だが実材料の下限はMgF$_2$ の1.38。残留反射は1.26%(無コート4.26%の約1/3.4)
- 特性行列法で任意の層数を統一的に扱える。$\lambda/4$ 層はアドミッタンス反転器 $Y\to\eta^2/Y$、$\lambda/2$ 層は設計波長で消える absentee layer
- 2層Vコートは $n_2/n_1=\sqrt{n_s/n_0}$ で1波長を完全にゼロにできるが帯域が狭く、400 nmでは無コートより悪化する
- 3層Wコート(QHQ構成)は半波長層の非設計波長での働きを使い、400〜700 nmで最大1.08%・平均0.214%を達成する(単層の約1/7)
- 誤差感度: $\lambda/4$ 設計は設計波長で膜厚誤差に2次でしか反応しないが、帯域端では敏感。Wコートでは半波長層の厚さ制御が最も重要
薄膜干渉は、干渉という最も基本的な波動現象が、そのまま製品の性能を決める技術に直結している好例です。同じ数学(多重反射の級数と伝送行列)は、誘電体多層膜ミラー、光学フィルタ、ファブリ・ペロー共振器、さらにはマイクロ波の多段インピーダンス整合まで、まったく同じ形で現れます。この記事で作った reflectance 関数は、屈折率と厚さのリストを変えるだけでそれら全部に使えます。
次のステップとして、以下の記事も参考にしてください。
- マイケルソン干渉計の原理と応用 — 2光波干渉を測定に使う代表例
- 回折格子の分光分解能 — 多光束干渉が波長分離を生む仕組み
- 単スリットのフラウンホーファー回折 — 干渉とセットで理解したい回折の基礎
- ジョーンズベクトルによる偏光の記述 — 斜め入射でs偏光とp偏光が分かれる話の先へ
- L型整合回路の設計 — 幾何平均 $\sqrt{Z_1Z_2}$ が現れる電気回路版の同じ問題