虹に乗ってみたい

Python

はじめに

虹の上を歩く、虹を滑り台にする…など虹の上で何かをするということはアニメの描写でよくあるものです。しかし、実際に虹は遠くに見えるだけでどの程度の大きさかはよくわかりません。

もしかしたら、細すぎて落ちてしまうかもしれない、あるいはパーティができるほど大きいかもしれない

そこで虹についてあれこれを実際に考えてみました。

虹とは

虹とは、大気中に存在する水滴に対して太陽光(白色光)が分散して虹色となる現象のことです。

簡単に言うと、太陽光みたいな白い光には全部の色が入っていて普段は白い色に見えるけど、特定の条件でその色は分かれて虹色になるよといったことです。

つまり、虹は光であるため上には乗れません。

また、虹は太陽光を背にしたときに太陽光から見て約40°前後の方向にしか現れません。そのため虹は観測者の位置によって現れる場所が変化すること意味します。

つまり、虹を追いかけても近づけず、側面に回ることもできません。(太さがない)

虹の見える角度が決まっているのはなぜ

虹は前で説明した通り、白色光が分散されることで多色が見えます。ここで分散というのはプリズムに入射された白色光がいろいろな色に分離されて出てくる現象が一番想像しやすいと思います。

これはプリズムが光の波長によって屈折率が異なるのが原因です。詳しくは光の散乱・分散このサイトがわかりやすいです。よって光の屈折率を考えてから実際に虹の光の様子を考えたいと思います。

光の波長と水の屈折率

媒質の屈折率の波長依存性はセルマイヤー方程式(The Sellmeier equation)を解くことによっても求めることができます。

$$ n(\lambda)^2 = 1 + \sum_{n = 1}^{m} \frac{A_i \lambda^2}{\lambda^2-C_i} $$

ここで\(A_i,C_i\)は実験的に求められる定数です。水の場合のセルマイヤー定数は以下のようになります。

これを用いて計算を行うと水の可視域(300 nm~800 nm)での屈折率曲線は次のようになります。

ちなみに可視域の波長は以下のようになっています。(引用元様:my craft 「波長」とは)

屈折の様子

水滴内で光がどのように屈折しているかを示したのが次の図になります。

つまり、\(2\phi\)の値がわかれば虹がどの角度に現れるかがわかりそうです。

中学の図形の分野で簡単に解ける問題です。上の三角形から\(\phi\)を求めてみます。三角形の内閣の和が180°であることを利用します。

角Aは対頂角の関係から\(\phi_i\)

角Bは三角形の内角の和が180°であるから\(180-2 \theta_y\)

つまり

$$ \phi = 180 – A – B = 2\theta_y – \phi_i $$

よって、反射してくる角度は\(2\phi = 4\theta_y – 2\phi_i\)となります。

ここでスネルの法則から\(n_{air} \sin \phi_i = n_{water} \sin \theta_y\)なので

$$ \theta_y = \arcsin(\frac{n_{air} \sin \phi_i}{n_{water}})$$

先ほどの計算から赤色(700 nm)のときの屈折率は1.33なのでそれを用いて、屈折率を変化させたものが次のグラフになります。

 

角度の変化が0のところで最も光線は集中するため、数値計算から60°のところで、つまり虹は42.515…≈43°で赤色の光は最大となることがわかります。

これを各波長ごとに計算してあげます。

よって、虹は39~43°付近で紫~赤色の光として見えることがわかりました。

虹の探し方

これまでの議論とちょっとした考察から虹は自分の影の頭の先から39~43°付近に現れることがわかります。

また、虹の大きさについても距離×正接(tan)39~43°で求まることがわかります。つまり距離×(0.80978~0.93252)であるので~距離×0.12273の太さとなります。

例えば1 km先の虹は122 mもの太さになっています。結構大きいですね。

あとがき

今回、このサイトを作成するにあたり「眠れなくあるほど面白い物理の話」「これが物理学だ!」を参考に書きました。これらの本は虹に加えてとても面白かったのでおすすめです。特に後者の本はこのサイトを見てるような科学好きにはたまらない本になっていると思います。

また、虹や大気中の光学に興味がある方は「Atmospheric Optics」「Astronomy Picture of the Day」がおすすめです。

コード

今回計算に使ったコードをここに示します。間違いがあったら教えてください。

import matplotlib.pyplot as plt
import math 

#フォント
plt.rcParams['font.family'] = 'Times New Roman' #フォント一括
plt.rcParams["font.size"] = 20
plt.rcParams['ytick.direction'] = 'in'
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams["xtick.top"] = True # 上部に目盛り線を描くかどうか
plt.rcParams["ytick.right"] = True # 右部に目盛り線を描くかどうか

"""
Sellmier equationを解く
"""

#sellmier sigma term
def sell(A,C,lam):
    return A*lam**2/(lam**2-C)

#sellmier parameter
A1 = 7.58*10**-1
A2 = 0.85*10**-1

C1 = 1.007*10**-2
C2 = 8.91377


lam = []
ri = []

for i in range(300,800):
    la = i/1000
    n = (1 + sell(A1,C1,la) + sell(A2,C2,la))**0.5
    lam.append(i)
    ri.append(n)


plt.plot(lam,ri)
plt.xlabel("wavelength (nm)")
plt.ylabel("reflective index")

"""
赤色の光の屈折の様子
"""

plt.figure()

theta_in = []
theta_out = []
ma = 0
for i in range(1,90):
    theta_in.append(i)
    theta_y = math.asin(1/1.33*math.sin(math.radians(i)))
    out = 4*math.degrees(theta_y)-2*i 
    if out > ma:
        inma = i
        ma = out
    theta_out.append(out)

#print(inma,ma)

plt.plot(theta_in,theta_out)   
plt.xlabel("angle of incident (degree)")
plt.ylabel("angle of emergence (degree)") 

"""
可視域全部で解く
"""
plt.figure()
theta_out2 = []
wave = []

aa = 299
ma = 0
for n in ri:
    aa = aa + 1
    wave.append(aa)
    for i in range(1,90):
        theta_y = math.asin(1/n*math.sin(math.radians(i)))
        out = 4*math.degrees(theta_y)-2*i 
        ma = max(ma,out)
    theta_out2.append(ma)

plt.plot(wave,theta_out2)
plt.xlabel("wavelength (nm)")
plt.ylabel("angle of emergence (degree)") 

コメント

タイトルとURLをコピーしました