2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ホログラム干渉縞をPythonで再現!光の波が描く「模様」の正体に迫る

2
Posted at

え、干渉縞ってただの模様じゃないの?

そう思ったあなた、実はこの「ただの模様」の中に、光の波の情報が全部詰まっているんです。しかも、この模様を読み解けば、物体のナノメートル単位の変形まで計測できちゃう。

今日は、ブラウザで動く無料ツール「ホログラム干渉縞シミュレーター」を使って、この奥深い世界をコード付きで解説していきます。


ざっくり本質:干渉縞は「波の喧嘩」の記録

まず、直感を掴みましょう。

湖面に2つの石を投げ入れたら、波紋が広がって重なりますよね。山と山が重なると大きな波に、山と谷が重なると打ち消し合って平らになる。

光も全く同じです。

レーザー光のような「波の山と谷が揃った光(コヒーレント光)」を2つ重ねると、場所によって明るくなったり暗くなったりする。それが干渉縞です。

「干渉縞とは、光の波が『どこで強め合い、どこで弱め合うか』を可視化した地図である」

この地図を読み取る技術こそが、ホログラフィの本質なんです。


数式で理解する:たった3つの式で全てが決まる

では、シミュレーターの計算ロジックを数式で押さえましょう。

基本の式:複素振幅の重ね合わせ

まず、観測点 $(x,y)$ における光の複素振幅 $U$ は、$N$ 個の点光源からの寄与の和です:

U(x,y) = \sum_{i=1}^{N}\frac{A_i}{r_i}e^{ikr_i}
  • $A_i$ : 光源 $i$ の振幅(明るさ)
  • $r_i$ : 観測点から光源 $i$ までの距離
  • $k = 2\pi/\lambda$ : 波数(波長 $\lambda$ に反比例)

「距離が違うと位相がずれる」 これが全ての始まりです。

強度の式:実際に見える明るさ

人間の目やカメラで見えるのは強度(振幅の2乗) です:

I(x,y) = \sum_i A_i^2 + 2\sum_{i < j}A_i A_j \cos\bigl(k(r_i - r_j)\bigr)

第1項は各光源の強度の単純和。第2項が干渉項で、光源間の距離差 $r_i - r_j$ に応じて $\cos$ で変調されます。

これが干渉縞の正体。距離差が波長の整数倍で明るく、半整数倍で暗くなる。

縞の間隔:実務で最も使う式

2点光源の場合、縞の間隔 $\Lambda$ は:

\Lambda = \frac{\lambda}{2\sin\theta}

$\theta$ は2つの光源を観測点から見た角度の半分。

覚えておいてください。 波長を短くするより、光源間の角度を大きくする方が縞は劇的に細かくなります。これ、実務の鉄則です。


コードで実装する:JavaScriptで30行

シミュレーターのコア計算を、実際に動くコードで再現します。

// ホログラム干渉縞 コア計算 (Canvas用)
// 引数: ctx (2Dコンテキスト), sources (光源配列), lambda (波長), width, height

function drawInterferencePattern(ctx, sources, lambda, width, height) {
    const k = 2 * Math.PI / lambda;  // 波数
    const imageData = ctx.createImageData(width, height);
    const data = imageData.data;
    
    // 各ピクセルで強度計算
    for (let y = 0; y < height; y++) {
        for (let x = 0; x < width; x++) {
            // 複素振幅の実部・虚部を累積
            let realSum = 0, imagSum = 0;
            
            for (const src of sources) {
                // 観測点から光源までの距離
                const dx = x - src.x;
                const dy = y - src.y;
                const r = Math.sqrt(dx*dx + dy*dy);
                
                // 振幅減衰 (距離に反比例) + 位相回転
                const amp = src.amplitude / (r + 1e-10);  // ゼロ割防止
                const phase = k * r;
                realSum += amp * Math.cos(phase);
                imagSum += amp * Math.sin(phase);
            }
            
            // 強度 = |U|^2 = real^2 + imag^2
            const intensity = realSum*realSum + imagSum*imagSum;
            
            // グレースケールにマッピング (0〜255)
            const val = Math.min(255, Math.max(0, Math.floor(intensity * 50)));
            const idx = (y * width + x) * 4;
            data[idx] = val;      // R
            data[idx+1] = val;    // G
            data[idx+2] = val;    // B
            data[idx+3] = 255;    // A
        }
    }
    ctx.putImageData(imageData, 0, 0);
}

// 使用例: 2点光源 (波長 500nm, 画面サイズ 400x400)
const sources = [
    { x: 150, y: 200, amplitude: 1.0 },
    { x: 250, y: 200, amplitude: 1.0 }
];
drawInterferencePattern(ctx, sources, 500e-9, 400, 400);

このコードのポイント:

  • 複素振幅を実部・虚部で管理 → 後で強度計算に使う
  • 距離による振幅減衰を $1/r$ でモデル化
  • 波数 $k$ で位相回転 → 波長が短いほど位相変化が急峻に

実際のシミュレーターも、これと同じ原理で動いています


数値例で確かめる:縞の間隔を手計算

では、具体的な数値で確認しましょう。

条件:

  • 波長 $\lambda = 532 ,\text{nm}$(グリーンレーザー)
  • 2つの光源の間隔 $D = 10 ,\text{mm}$
  • 観測スクリーンまでの距離 $z = 1 ,\text{m}$

ステップ1:角度を求める

光源間の角度 $2\theta$ は、スクリーンから見た角度:

\tan(2\theta) \approx 2\theta = \frac{D}{z} = \frac{10\,\text{mm}}{1000\,\text{mm}} = 0.01 \,\text{rad}

よって $\theta = 0.005 ,\text{rad}$

ステップ2:縞の間隔を計算

\Lambda = \frac{\lambda}{2\sin\theta} \approx \frac{532 \times 10^{-9}}{2 \times 0.005} = 5.32 \times 10^{-5} \,\text{m} = 53.2 \,\mu\text{m}

つまり、約0.05mm間隔で明暗が繰り返す。

コードでこの条件を入力すると、確かに画面上で約53ピクセル(1ピクセル=1μmと仮定)間隔の縞が現れます。理論と実装が一致しました。


シミュレーターで遊ぶ:3つの実験

実際にツールを開いて、一緒に試しましょう。

実験1:波長を変えてみる

プリセット「2点光源」 を選択。波長スライダーを400nm(青)→ 700nm(赤) に動かす。

  • 何が起きる? 縞の間隔が広がる
  • なぜ? $\Lambda = \lambda / (2\sin\theta)$ の $\lambda$ が大きくなるから
  • 実務の教訓: 赤いレーザー(He-Ne, 632.8nm)より青いレーザー(Ar, 488nm)の方が細かい計測ができる

実験2:光源の間隔を変える

光源1を左に、光源2を右にドラッグ。間隔を50px → 200px に拡大。

  • 何が起きる? 縞が劇的に細かくなる
  • なぜ? 角度 $\theta$ が大きくなり、$\sin\theta$ が増加 → $\Lambda$ が減少
  • 実務の教訓: 波長より幾何学的配置の影響が圧倒的に大きい。干渉計測では光源の位置決めが命

実験3:ゾーンプレートでレンズ効果を体感

プリセット「ゾーンプレート4源」 を選択。光源数を4→8→16と増やす。

  • 何が起きる? 中心に明るいスポットが現れ、周囲に同心円状の縞
  • なぜ? 多数の点光源からの光が中心で強め合う → レンズのように集光
  • 実務の応用: これがゾーンプレートレンズ。X線顕微鏡など、ガラスレンズが使えない波長域で活躍

現場でハマるポイント:3つの落とし穴

1. コヒーレンスを忘れるな

シミュレーターは全ての光源が完全にコヒーレントと仮定。でも現実のLEDや太陽光では干渉縞は見えません

対策: 干渉実験には必ずレーザーを使う。単一波長・同位相が絶対条件。

2. コントラストは強度バランスで決まる

振幅を「メイン光源10、他1」にしてみてください。干渉縞がほとんど見えなくなりますよね?

理由: 強度の式の第1項(各光源の強度和)が大きくなり、干渉項の変調が相対的に小さくなるから。

実務の教訓: ホログラム記録では参照光と物体光の強度比を1:1〜1:3に調整する。これが守れないと、再生像がぼやける。

3. スケール感覚を誤るな

波長を400nmから700nmに変えても、縞の変化は「少し」。でも光源間距離を1mmから10mmに変えると、縞は10倍細かくなる。

覚えておくべき順序:

  1. 光源の幾何学的配置(角度・距離)が最も効く
  2. 次に波長
  3. 最後に振幅バランス

シミュレーターでパラメータを大胆に振って、この感覚を身につけてください。


まとめ:今日の3つの要点

  1. 干渉縞は「光路差の地図」 — 距離差が波長の整数倍で明るく、半整数倍で暗くなる。この原理でナノメートル計測が可能。

  2. 実装の核心はたった30行のJavaScript — 複素振幅を足し合わせて強度を計算。シミュレーターもこれと同じ原理。

  3. 実務で最も効くパラメータは「角度」 — 波長より幾何学的配置の影響が圧倒的に大きい。自由にパラメータを動かして感覚を掴め。


今日紹介したツール:

ホログラム干渉縞シミュレーター — ブラウザで即動作、登録不要

光源をドラッグして縞がリアルタイムに変化する様子を、ぜひ自分の手で体感してください。数式とコードで理解した原理が、目で見える形で確かめられる — これが最速の学び方です。

NovaSolverでは700以上の工学シミュレーターを無料公開中 👉 一覧はこちら

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?