OTO - Ohshima Tamashima Observatory- - Optical Depth Simulation Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
!光学的深さ(厚み)が1とは
光学的深さが1というの、その問題にしている媒質(地球大気とか恒星大気とか星間物質とか)を透過する光(電磁波)が、吸収や散乱などにより弱められて元の強さの1/eになる深さのことである。
これは定義である、と言えるのであるが、では、なぜ「光学的深さが1は、強度が1/eになるように定義する」のか「その1とはいったい何のこと?」については、大抵の教科書に説明はない。
これについて、腑に落ちる説明が[[中田好一先生の講義資料|http://www.ioa.s.u-tokyo.ac.jp/kisohp/STAFF/nakada/Jugyo/Jugyo.html]]の講義資料の「J.」の一部にあったので一部|http://otobs.org/etc/OpticalDepth.pdf]]にあったので、それを実験するソフトを作ってみた。(対応する講義資料の一部を抜き出したPDFは[[こちら|http://otobs.org/etc/OpticalDepth.pdf]])
なお、中田先生の[[講義資料全体はこちら|http://www.ioa.s.u-tokyo.ac.jp/kisohp/STAFF/nakada/Jugyo/Jugyo.html]]
!!シミュレーションの実施例
使用した言語はRubyで、そのGUI開発にshoesを使った。実際には[[このサイト|http://shoesrb.com/downloads/]]からdownloadするとRuby自体も一緒にインストールされます。なお、対応するOSは、Linux・MacOS・Windows(7用32bit版ですが10でも動きました)。
設定パネル[[設定パネル|http://otobs.org/etc/opticalDepthOp.png]]
下の実験結果の説明
左上:光源をすっぽり覆う(タウ=1、衝突断面積の延べ面積が100%に対応)黒紙を10x10の紙片に切り
右上:それをばらまくと、重なったり隙間ができたりする。透過率は0.43程度(被覆率は0.57)
左下:紙片の数を40x40に増やしてばらまくと、透過率は0.39に
右下:さらに紙片を100x100に増やすと、透過率は0.37‥‥程度になり、紙片を無限個にした極限の理論値1/e=0.3678‥‥に近づく
光学的深さが2になると、切る前の紙を2枚にして、切り刻み、ばらまくことに対応する。同様に光学的深さ0.1だと、もとの紙の全面積が1/10枚分にしたものを紙片に分割してばらまいたことに対応する。
実行結果;4種類の条件[[結果|http://otobs.org/etc/opticalDepth.png]]
!!プログラムリスト(ソースコード)
被覆率を求めるアルゴリズムは次のとおりです。
(1)窓枠のサイズと紙片の数から1つの紙片の大きさを決め
(2)1つの紙片の位置を、乱数発生により決める
(3)窓全体のピクセルに対応する配列を0で初期化しておいて
(4)1つの紙片が覆うピクセルの配列の値を1に置き換える。
(5)全紙片について覆うピクセルの値を1に置き換える
(6)全配列(全ピクセル)の値の合計を求め、全ピクセルで割れば、被覆率が求まる
透過率は、1−被覆率で得られる。
このアルゴリズムでは、1ピクセルより細かく分解できないので、紙片の1辺の長さが1ピクセル以下の端数になる場合は、繰り上げか切り捨てになるので計算が不正確になる。
従って、シミュレーション結果が不正確にならないようするには、窓の大きさを紙片の数で割った値が整数になるように留意して、値を入力する必要がある。
<<<
#"opticalDepth.rb"
#光学的厚み、被覆率、透過率のシミュレーション
# 2017.10.13 by O.Ohshima with Ruby+Shoes
Shoes.app :title => "Optical Depth Simulator" , :width => 300, :height => 300 do
para "Light Box Window Size"
ws = edit_line 400, :width => 40
para "\n \n"
para"Flagment Numbers / axis"
n = edit_line 10, :width => 40
stack do
para "alignment of Flagments?"
flow { @bb=radio :stn; para strong("Random")}
flow { @aa=radio :stn; para strong("Aligned")}
button "Start" do
xx=ws.text.to_i
yy=xx
nn=n.text.to_i
para "n=",nn, " "
dx=xx/nn
dy=yy/nn
para " dx=",dx, "\n"
if @aa.checked? then
align=1
para "Aligned is selected\n"
elsif @bb.checked? then
align=0
para "Random is selected\n"
end
window :title => "Tau = 1; Window size is #{ws.text} x {ws.text}",
:width => xx, :height => yy do
background lightskyblue
ar=Array.new(xx).map{Array.new(yy,0)}
nn.times do |mx|
nn.times do |my|
fill rgb(0.5,0.5,0.5)
if align==1 then
x=dx*mx
y=dy*my
elsif align==0 then
x=rand(0-dx..xx)
y=rand(0-dy..yy)
end
rect x, y, dx,dy
dx.times do |ddx|
dy.times do |ddy|
if (((x+ddx >= 0) && (xx > x+ddx )) && ((y+ddy >= 0) && (xx > y+ddy ))) then
ar[x+ddx][y+ddy] = 1
end
end
end
end
end
b= ar.flatten
c=b.inject(:+)
cvr = sprintf( "%5.3f", c/(xx*yy).to_f)
trm = sprintf( "%5.3f", (xx*yy-c)/(xx*xx).to_f )
tagline "Flagments =", nn,"x",nn,"\n", :stroke => white
tagline"coved "covered rate =",cvr,"\n", :stroke => white
tagline "transmittance=",trm,"\n", :stroke => white
end
end
end
end
>>>
!!Ruby+Shoesの使い方
リンク
[[簡単なGUI Ruby GUI Shoesの使い方紹介|http://ruby-shoes.rokujyou.com/]]
私は主に次のURLを参考にしてプログラミングしました。
[[Ruby+Shoes 第1章|http://izu.asia/shoesruby/intro/intro.html]]
----
[[OTO-Ohshima Tamashima Observatory-]]トップへ戻る
{{counter}}
光学的深さが1というの、その問題にしている媒質(地球大気とか恒星大気とか星間物質とか)を透過する光(電磁波)が、吸収や散乱などにより弱められて元の強さの1/eになる深さのことである。
これは定義である、と言えるのであるが、では、なぜ「光学的深さが1は、強度が1/eになるように定義する」のか「その1とはいったい何のこと?」については、大抵の教科書に説明はない。
これについて、腑に落ちる説明が[[中田好一先生の
なお、中田先生の[[講義資料全体はこちら|http://www.ioa.s.u-tokyo.ac.jp/kisohp/STAFF/nakada/Jugyo/Jugyo.html]]
!!シミュレーションの実施例
使用した言語はRubyで、そのGUI開発にshoesを使った。実際には[[このサイト|http://shoesrb.com/downloads/]]からdownloadするとRuby自体も一緒にインストールされます。なお、対応するOSは、Linux・MacOS・Windows(7用32bit版ですが10でも動きました)。
設定パネル[[設定パネル|http://otobs.org/etc/opticalDepthOp.png]]
下の実験結果の説明
左上:光源をすっぽり覆う(タウ=1、衝突断面積の延べ面積が100%に対応)黒紙を10x10の紙片に切り
右上:それをばらまくと、重なったり隙間ができたりする。透過率は0.43程度(被覆率は0.57)
左下:紙片の数を40x40に増やしてばらまくと、透過率は0.39に
右下:さらに紙片を100x100に増やすと、透過率は0.37‥‥程度になり、紙片を無限個にした極限の理論値1/e=0.3678‥‥に近づく
光学的深さが2になると、切る前の紙を2枚にして、切り刻み、ばらまくことに対応する。同様に光学的深さ0.1だと、もとの紙の全面積が1/10枚分にしたものを紙片に分割してばらまいたことに対応する。
実行結果;4種類の条件[[結果|http://otobs.org/etc/opticalDepth.png]]
!!プログラムリスト(ソースコード)
被覆率を求めるアルゴリズムは次のとおりです。
(1)窓枠のサイズと紙片の数から1つの紙片の大きさを決め
(2)1つの紙片の位置を、乱数発生により決める
(3)窓全体のピクセルに対応する配列を0で初期化しておいて
(4)1つの紙片が覆うピクセルの配列の値を1に置き換える。
(5)全紙片について覆うピクセルの値を1に置き換える
(6)全配列(全ピクセル)の値の合計を求め、全ピクセルで割れば、被覆率が求まる
透過率は、1−被覆率で得られる。
このアルゴリズムでは、1ピクセルより細かく分解できないので、紙片の1辺の長さが1ピクセル以下の端数になる場合は、繰り上げか切り捨てになるので計算が不正確になる。
従って、シミュレーション結果が不正確にならないようするには、窓の大きさを紙片の数で割った値が整数になるように留意して、値を入力する必要がある。
<<<
#"opticalDepth.rb"
#光学的厚み、被覆率、透過率のシミュレーション
# 2017.10.13 by O.Ohshima with Ruby+Shoes
Shoes.app :title => "Optical Depth Simulator" , :width => 300, :height => 300 do
para "Light Box Window Size"
ws = edit_line 400, :width => 40
para "\n \n"
para"Flagment Numbers / axis"
n = edit_line 10, :width => 40
stack do
para "alignment of Flagments?"
flow { @bb=radio :stn; para strong("Random")}
flow { @aa=radio :stn; para strong("Aligned")}
button "Start" do
xx=ws.text.to_i
yy=xx
nn=n.text.to_i
para "n=",nn, " "
dx=xx/nn
dy=yy/nn
para " dx=",dx, "\n"
if @aa.checked? then
align=1
para "Aligned is selected\n"
elsif @bb.checked? then
align=0
para "Random is selected\n"
end
window :title => "Tau = 1; Window size is #{ws.text} x {ws.text}",
:width => xx, :height => yy do
background lightskyblue
ar=Array.new(xx).map{Array.new(yy,0)}
nn.times do |mx|
nn.times do |my|
fill rgb(0.5,0.5,0.5)
if align==1 then
x=dx*mx
y=dy*my
elsif align==0 then
x=rand(0-dx..xx)
y=rand(0-dy..yy)
end
rect x, y, dx,dy
dx.times do |ddx|
dy.times do |ddy|
if (((x+ddx >= 0) && (xx > x+ddx )) && ((y+ddy >= 0) && (xx > y+ddy ))) then
ar[x+ddx][y+ddy] = 1
end
end
end
end
end
b= ar.flatten
c=b.inject(:+)
cvr = sprintf( "%5.3f", c/(xx*yy).to_f)
trm = sprintf( "%5.3f", (xx*yy-c)/(xx*xx).to_f )
tagline "Flagments =", nn,"x",nn,"\n", :stroke => white
tagline
tagline "transmittance=",trm,"\n", :stroke => white
end
end
end
end
>>>
!!Ruby+Shoesの使い方
リンク
[[簡単なGUI Ruby GUI Shoesの使い方紹介|http://ruby-shoes.rokujyou.com/]]
私は主に次のURLを参考にしてプログラミングしました。
[[Ruby+Shoes 第1章|http://izu.asia/shoesruby/intro/intro.html]]
----
[[OTO-Ohshima Tamashima Observatory-]]トップへ戻る
{{counter}}