BitArts Blog

ロードバイク通勤のRubyプログラマで伊豆ダイバー。の個人的なブログ。

(潜)体内窒素量を自力で分析

減圧理論の勉強を兼ねてダイブプロフィールからの体内窒素量の算出に挑戦してみます。

いきなりですが、今回作ったプログラム。

#!/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 = 0 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 = {}
profile.keys.sort.each {|time|
  depth = profile[time]
  rec = [time, depth]
  HALF_TIMES.keys.sort.each {|ht|
    pt[ht] = tissue_nit(time / 60.0, depth, ht, pt[ht])
    rec << pt[ht]
  }
  puts rec.join(",")
}

このプログラムに潜水の経過時間と水深の推移データを投入します。以下のような感じのCSVデータ。(時間は秒)

180,14.5
185,14.9
190,15.3

そうすると、各組織(このプログラムでは14の組織に分けています)ごとの組織内窒素分圧が豪快に出ます。今のところ、反復潜水には対応していません。1本目専用です。

data

これをExcelでグラフ化。

graph 

プロフィールさえ取れれば、ダイブコンピュータの能力にかかわらず自前のアルゴリズムで分析できます。今後開発を考えているログブックソフトなどに取り入れていこうと思います。

参考にしたサイト

※10/10追記)このエントリーの内容には間違いがありました。以下↓に訂正エントリーがあります。