以前、↓こちらのエントリーで減圧理論の勉強を兼ねて体内窒素量の算出に初挑戦しました。

Divestarの開発でこれの組み込みを進めているうち、あの内容に間違いがあるような気がしてきたので、修正します。

間違い(だと思う)が2点。

  1. 体内窒素分圧=0で開始していた。
    → 空気中の窒素分圧である0.79から開始するべきだよね。
  2. ホールデン理論の計算式の「経過時間」に潜水経過時間を入れていた。
    → その水深にいる時間(5秒単位のサンプリングなら、5秒)を入れるべきだよね。

これらを修正したのが、こちら。

#!/sbin/env ruby

# 体内組織ハーフタイム(ビュールマン)と排出安全係数
HALF_TIMES = {
  2.65=>6, 7.94=>5, 12.2=>4, 18.5=>3.5, 26.5=>3,
  37=>2, 53=>1.5, 79=>1.5, 114=>1.5, 146=>1.5,
  185=>1.5, 238=>1.5, 304=>1.5, 397=>1.5 }

# 体内組織内の窒素分圧(ホールデン理論)
# 引数(経過時間(分), 水深(m), ハーフタイム, 現在体内窒素分圧)
def tissue_nit(time, depth, ht, pnow)
  air = 1.013  #標準大気圧
  nit = 0.79   #空気中の窒素分圧
  wat = 0.1005 #海水1m当りの環境圧
  pnow = nit unless pnow
  # 呼吸気内の窒素分圧
  pnit = (air + wat * depth) * nit
  # 体内組織内の窒素分圧
  pt = pnow + (pnit - pnow) * (1.0 - 0.5 ** (time / ht))
  if pnow > pt
    # 排出時
    k = HALF_TIMES[ht]
    pt = pnow + (pnit - pnow) * (1.0 - 0.5 ** (time / (k * ht)))
  end
  pt
end

profile = {}
File.readlines(ARGV[0]).each {|s|
  rec = s.split(/\s*,\s*/)
  profile[rec[0].to_i] = rec[1].to_f
}
head = ["時間", "水深"]
HALF_TIMES.keys.sort.each {|ht|
  head << "#{ht}分組織"
}
puts head.join(",")
pt = {}
ptime = 0
profile.keys.sort.each {|time|
  depth = profile[time]
  rec = [time, depth]
  HALF_TIMES.keys.sort.each {|ht|
    pt[ht] = tissue_nit((time - ptime) / 60.0, depth, ht, pt[ht])
    rec << pt[ht]
  }
  ptime = time
  puts rec.join(",")
}

結果、グラフはこんな感じになりました。

image

前の結果よりも、早い組織、遅い組織の違いが明白です。