ホーム  •  ニュース  •  フォーラム  •  アカウント情報  •  サイト内検索  •  新規登録
 ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
 カウントダウンブロック
カウントダウンイベントはありません
 メニュー

メイン
   地球科学のための R
     蜃気楼モデル
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
投稿日時: 2006-5-8 18:57
登録日: 2004-7-29
居住地: 地球
投稿: 303
蜃気楼モデル
「光の気象学」(柴田清孝著)に基づく、蜃気楼の計算
1. 関数
#############################
#
#  レイヤーモデル
#
#############################
#
#  アルゴリズム
#
#  ray の各ステップごとの変数
#          仰角(in radian)
#          レイヤ( 0.1 m = 10cm = 1dm ごとを想定。)
#          位置(x)
#      これらをリストにしておく
#      object <- list( angle=0.1, layer=10, pos=0 )
#
# 屈折を光線が境界面に達するごとに計算する
#     ただし、全反射になったら上下の向きを変える。
#
#############################
nextstep <- function( obj, depth=0.1 ){
#
  if( obj$angle > 0 ){
    upward    <- T
    nextlayer <- obj$layer + 1
  }else{
    upward    <- F
    nextlayer <- obj$layer - 1
  }
#
  fracin    <- frac(obj$layer)
  fracout   <- frac(nextlayer)
  outsin    <- cos( obj$angle ) * fracin / fracout 

  if( outsin > 1 ){
    return( list( angle=     -obj$angle, layer=obj$layer, pos=obj$pos + depth * tan( pi/2 - abs(obj$angle) )))
  }else{
    if( upward ){
      return( list( angle= acos(outsin), layer=nextlayer, pos=obj$pos + depth * tan( pi/2 - abs(obj$angle) )))
    }else{
      return( list( angle=-acos(outsin), layer=nextlayer, pos=obj$pos + depth * tan( pi/2 - abs(obj$angle) )))
    }
  }
}



2. 上方蜃気楼の計算
2-1. 計算過程
###################################
#
# 上方蜃気楼
#

frac <- function(n){
  return( 1 + ( 0.00027 + 0.00006*cos( 7*pi/20 + n / 1000 * 2 * pi ) * exp( - n/1000) ) * exp( - n / 20000 ))
}

# png("Upper_Mirage.png",width=800,height=600)
par(fig=c(5,40,0,100)/100)
plot(frac(1:2000),1:2000, ylim=c(0,2000), type='l',
     xlab="Refraction Index", ylab="Height[dm]")

par(fig=c(30,100,0,100)/100, new=T)
plot(0,0,type='n', xlim=c(0,30000), ylim=c(0,2000),
     xlab="Distance[dm]", ylab="")

for( angle in seq(0.02,-0.02,-0.0005)){
  object <- list( angle=angle, layer=10, pos=0 )
  for( i in 1:2000 ){
    object <- nextstep(object)
    par(mfg=c(1,1))
    points(object$pos, object$layer, pch='.')
    if( object$layer < 0 ) break
  }
}
# dev.off()

2-2. 計算結果
[img]http://buran.u-gakugei.ac.jp/LEARNING/index.php?plugin=attach&pcmd=open&file=Upper_Mirage.png&refer=%B5%A4%BE%DD%B3%D8%2F2006-05-02[/img]

3. 下方蜃気楼の計算
3-1. 計算過程
###################################
#
# 下方蜃気楼
#

frac <- function(n){
  return( 1 + ( 0.00027 - 0.00010*cos( -2*pi/20 + n / 400 * 2 * pi ) * exp( - n/100) ) * exp( - n / 20000 ))
}

# png("Lower_Mirage.png",width=800,height=600)
par(fig=c(5,40,0,100)/100)
plot(frac(1:600),1:600, ylim=c(0,600), type='l',
     xlab="Refraction Index", ylab="Height[dm]")

par(fig=c(30,100,0,100)/100, new=T)
plot(0,0,type='n', xlim=c(0,5000), ylim=c(0,500),
     xlab="Distance[dm]", ylab="")

for( angle in seq(0.015,-0.015,-0.0005)){
  object <- list( angle=angle, layer=40, pos=0 )
  for( i in 1:600 ){
    object <- nextstep(object)
    points(object$pos, object$layer, pch='.')
    if( object$layer < 0 ) break
  }
}
# dev.off()

3-3. 計算結果
[img]http://buran.u-gakugei.ac.jp/LEARNING/index.php?plugin=attach&pcmd=open&file=Lower_Mirage.png&refer=%B5%A4%BE%DD%B3%D8%2F2006-05-02[/img]
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 


WWW を検索 meteorology.jp を検索

Powered by XOOPS 2.0 © 2001-2006 The XOOPS Project, Maitained by A. Mori
FI Theme :: XOOPS 2 Theme by ImageSquare :: Costomized by matchan and A.Mori