我々は、マグカップにコーヒーを入れて、窓際で飲んでいます。飲み終わったカップの内側を眺めていると、うっすら白く明るい部分が曲線状に見えました。不思議に思って、カップの角度を変えると、その白く明るい部分はいろいろに変わります。どうやら、この明るい部分は、太陽の光がカップの内側に反射してできているようです。
部屋に戻って、器を動かしながら光を当ててみるとやっぱり、うっすらと白く明るい部分の形が変わります。
このような現象を観察し、コンピュータでシミュレーションしてみましょう。
器を太陽の窓際に置く。そのあと、角度を変えて光の当たる角度を変えてみる。(器の縁から内側の曲面を光の向きに合わせてから少しずつ動かすと、明るい曲線が見つけやすいかもしれません。)
器に見えるうっすら明るいところを見たいだけならば、天井のライトや電気スタンド、懐中電灯などでも観察ができます。直接反射する赤丸ではなく、青線の脇のうっすら白く明るいところが、反射光が面に当たっている部分です。
スマホなどで撮影するときは、2人以上で実験することをお勧めします。自分(たち)の影がかからないように注意しましょう。
太陽光の反射で生じるうっすら明るい線は、「太陽光の性質」と「曲面での光の反射」から説明することができます。この現象は、コンピュータを使ってシミュレーションできますので、曲面での光の反射を説明したうえで、写真のようなうっすら明るい部分をプログラムを作って再現をしてみます。
一般に光の通る軌跡は直線と考えることができます。太陽光は数学的に簡単に扱える特別な光です。通常の光は光源から放射状に飛んでいると考えられますが、太陽は地球から大変遠いため、太陽から地表に届く光はすべて平行に飛んできていると考えることができます。そのため、太陽光を数学的に考えるときには、平行な直線の集まりと考えられます。
鏡のような滑らかな平面に光が当たると、光は反射します。
入ってくる光(入射光)の直線を決めたとき、鏡の平面に当たる点が決まり、また光が当たる点で鏡の平面に垂直な直線(法線ベクトル)が決まります。反射光の直線は、入射光の直線と光が当たった点での法線ベクトルの両方を含む平面上にあり、また、入射角と反射角が等しいという性質があります。
この性質は、曲面でも同じように考えることができます。まず、曲面に対して入射光が当たる点で接する平面を考えます。その平面の法線ベクトルを考えて、入射光の直線と法線ベクトルを含む平面を考えることで、平面での反射と全く同じに曲面での反射光の向きを考えることができます。
これらの性質を用いると、曲面での反射光のシミュレーションができます。
反射光のシミュレーションでは
を変えることでいろいろな実験ができます。
本記事では、円錐の一部(最初の写真の皿を想定)・回転放物面に太陽光を当てて、反射光がある平面に当たるときのシミュレーションを紹介します。 入射光を太陽光と考えるとき、入射光の全体は同じ平面上の等間隔の点からの直線の全体と考えることができました。今回のシミュレーションでは、入射光がこの仮定を満たすようにしているので、「反射する点」(赤い点)「反射光があたる点」(青い点)の間隔が光の強さに対応する(点が集まっている辺りが明るい、点があまりない部分は明るくない)ようにしてあります。
太陽光は左側に角度θ傾いて斜めの曲面(z=5r-4)に当たり(赤い点)、反射して底面(z=0)に当たる(青い点)とする。 (左上からsinθ=0.1, 0.2, 0.3, 0.4, 0.5の傾きで太陽光が入射している。底面での反射光は考慮していない。)
最初の図は最初の写真の左、一番右の図は、写真の右に似ていませんか?
回転放物面は放物線を回転させたものなので、放物線と同様に、回転軸に平行な入射光は全て反射して一点(焦点)で交わります。この「一点で交わる」という性質は入射光の向きを回転軸から少し傾けただけでも変わってしまうのでしょうか? 試してみました。
太陽光は左側に角度θ傾いて回転放物面に当たり(赤い点)、反射して焦点のある平面z=0.25に当たる(青い点)とする。
注:(r,z)=(0,0.25)は回転放物面の焦点
真上から当てた時(上左:θ=0)は焦点1点で平面Z=0.25と交わっていますが、わずかに(sinθ=0.01)傾けただけで交点は1点から領域に変化し(上中)、sinθ=0.3(下右)ではだいぶ様子が異なるようです。つまり、厳密に回転放物面を作っても光の向きに正確に回転軸を向けないと反射光が一点で交わらないことが分かりました。
オリンピックの聖火の採火式などでわかるように、現実に太陽光と回転放物面を使って火をつけることができます。多少角度が回転軸からずれても中心近くは大変熱くなっていることは間違えないようです。非常に危険ですので実物で確かめるのは止めましょう。
本記事のシミュレーションの内容は、2022年度福島大学共生システム理工学類、数理・情報学演習IIの演習の課題をもとにしております。掲載した図は課題のサンプル図(笠井が作成)と、講義の受講者の柴崎右京君、陳景宜さん、渡部友也君が作成したものです。光の反射・屈折の実験にはいろいろなものがあります。例えば、「実験数学読本②矢崎成俊:著 日本評論社(2019)」を参考にしてください。
#### 反射光のサンプルプログラム
####
####円錐の一部に斜めから光を当てる。
###[z=0 (0<r<0.8), z= 5r -4 (0.8 <r <1 ) ]
## 円錐の一部に太陽光が当たるときの反射光
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
Eps=0.000001 # 微小量の定義(Newton法で使う)
Al=0.5 #α:Be=0ならば、この値がsinθに相当 Al^2+Be^2+Ga^2=1 を満たす
Be=0 #β: (Al, Be, Ga) が単位方向ベクトル
Ga=-np.sqrt(1-Al**2-Be**2) # γ:下向きなのでマイナスにしてある。
R=1
Tz=0
NNA=128 ### 点の数を決めるパラメータ
NNB=128 ### 点の数を決めるパラメータ
p=5 # 側面の曲面 z=p(r-R)+R
### 側面の傾きの指定P=1のとき円錐、p>1 で底面がある円錐
def XX0(a,b): ## 入射光の始点を決める。方向単位ベクトルに垂直な平面上の点
Sq=np.sqrt(Al**2+Be**2)
x0=-(Be/Sq)*a-(Al*Ga/Sq)*b
y0=(Al/Sq)*a-(Be*Ga/Sq)*b
z0= R+Sq*b+0.01
return x0,y0,z0
def F(x,y): # function(適当な関数f1 をreturn の後に入れる)
return p*np.sqrt(x**2+y**2)+(1-p)*R
def FX(x,y): # derivative (Fのxに関する導関数をreturnのあとに入れる)
return p*x/np.sqrt(x**2+y**2)
def FY(x,y): # derivative (Fのyに関する導関数をreturnのあとに入れる)
return p*y/np.sqrt(x**2+y**2)
def SOL(x,y,z,Init,eps): ## 曲面との交点を求める(Newton法)
ll0=Init
ll=ll0
G=F(x+ll0*Al,y+ll0*Be)-(z+ll0*Ga)
GX=FX(x+ll0*Al,y+ll0*Be)*Al+FY(x+ll0*Al,y+ll0*Be)*Be-Ga
for i in range(1, 100):
if abs(G)<eps :
break
else:
ll=ll0-G/GX
G=F(x+ll*Al,y+ll*Be)-(z+ll*Ga)
GX=FX(x+ll*Al,y+ll*Be)*Al+FY(x+ll*Al,y+ll*Be)*Be-Ga
ll0=ll
ls=ll
x1=x+ls*Al
y1=y+ls*Be
z1=F(x1,y1)
if x1**2+y1**2<(R*(1-1/p))**2:
z1=0
return x1,y1,z1
def DD(x,y): ## 反射光の方向ベクトルを計算する
fx=FX(x,y)
fy=FY(x,y)
S=1+fx**2+fy**2
dd=2*(Al*fx+Be*fy-Ga)/S
d1=Al-dd*fx
d2=Be-dd*fy
d3=Ga+dd
return d1,d2,d3
######## ここから計算の実行 ########
x = np.linspace(-R, R, 100)
plt.plot(x,np.sqrt(R**2-x**2)) #### 上から見た曲線の縁の図
plt.plot(x,-np.sqrt(R**2-x**2)) ####
for AA in range(0, NNA): ### 始点を動かす
for BB in range(0, NNB): ### 始点を動かす
x0,y0,z0=XX0(-R+2*R*AA/NNA,-R+2*R*BB/NNB)
if ( x0+Al*(R-z0)/Ga )**2+( y0+Be*(R-z0)/Ga )**2 < R**2:
## 「曲面の領域の縁」の内側にあるとき(関数依存)
x1,y1,z1=SOL(x0,y0,z0,(R-z0)/Ga, Eps) ##曲面との交点x1,y1を決める
if x1**2+y1**2<R**2 and x1**2+y1**2>(R-R/p)**2 :
## 交点が側面にある条件(関数依存)
plt.scatter(x1,y1, c='red',s=1)
d1,d2,d3=DD(x1,y1) # 反射光の方向ベクトル(d1,d2,d3)を決める
x2=x1+(Tz-z1)*d1/d3
y2=y1+(Tz-z1)*d2/d3
if z1 >0 and x2**2+y2**2<(R-(R-Tz)/p)**2:
## 反射光が曲面内でz=Tzと交わっている条件
plt.scatter(x2,y2, c='blue',s=2)
plt.title('z=0. ')
plt.xlabel('x')
plt.ylabel('y')
# fig.show()
(より詳しい解説を「太陽光の反射(シミュレーション)」として書きました。一部、高校の学習範囲を超えますが、サンプルプログラムを解読したいなど興味のある方はご覧ください。)
掲載大学 学部 |
福島大学 共生システム理工学類 | 福島大学 共生システム理工学類のページへ>> |
私たちが考える未来/地球を救う科学技術の定義 | 現在、環境問題や枯渇資源問題など、さまざまな問題に直面しています。 これまでもわたしたちの生活を身近に支えてきた”工学” が、これから直面する問題を解決するために重要な役割を担っていると考えます。 |