以前、↓こちらのエントリーで減圧理論の勉強を兼ねて体内窒素量の算出に初挑戦しました。
Divestarの開発でこれの組み込みを進めているうち、あの内容に間違いがあるような気がしてきたので、修正します。
間違い(だと思う)が2点。
- 体内窒素分圧=0で開始していた。
→ 空気中の窒素分圧である0.79から開始するべきだよね。 - ホールデン理論の計算式の「経過時間」に潜水経過時間を入れていた。
→ その水深にいる時間(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(",") }
結果、グラフはこんな感じになりました。
前の結果よりも、早い組織、遅い組織の違いが明白です。