累乗2015年08月28日 03:42

累乗


(冪乗)
https://ja.wikipedia.org/wiki/%E5%86%AA%E4%B9%97

「冪乗(べきじょう、英: power)、または累乗(るいじょう、英: exponentiation) は、ある一つの数同士を繰り返し掛け合わせるという操作のこと、あるいはそれによって得られる数のことである。」

「元来は、単に「冪(べき)」と表現した。「冪乗(べきじょう)」という語は、誤用が定着したものである。」

ここでは、累乗と記す。

「上付きの n が書けない場合などには、 x^n という表記を用いることが多い。」

ここでは、その「^」表記を使うことにする。

ビュールマンZH-L16において、半飽和組織の不活性ガス分圧を算出するための式が示されている。

(改正高気圧作業安全衛生規則が施行されます)
http://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000071152.html

「高気圧作業安全衛生規則第八条第二項等の規定に基づく厚生労働大臣が定める方法等(平成26年12月1日厚生労働省告示第457号) [120KB]」参照

窒素の場合だと、以下のような感じだ。

PN2=(Pa+Pb)*NN2+R*NN2*(t-1/k)-((Pa+Pb)*NN2-QN2-R*NN2/k)*e^(-k*t)

各変数の定義は、告示を参照していただきたいんだが、例によってNN2の単位はパーセントではなく、全体を1とする組成比である。

空気の場合だと、0.78とか、0.79とか。

これに基づいて、分圧を計算するわけで、厚労省が定める方式では、16の半飽和組織毎にシコシコ計算して、その深度のM値と比較して、最もキビシー組織の値を基準に水中減圧を行うことになっている。

いったん浮上して、急いで減圧室に入るという、いわゆる船上減圧は、今回の改正では見送られた。

で、問題は、表計算とかでは、山のようなシートを作って、前のシートの値をQN2に代入したりしながら、減圧(浮上中)ステージや減圧停止(浮上停止)にM値を超えていないかどうかを判定しながら計算することになる。

この方法では、一応、未完成ながら、酸素減圧とか、ナイトロックスとか、ヘリウム混合気体とかを用いたプロファイルを計算することが出来るようになった。

(混合ガス潜水)
http://kfujito2.asablo.jp/blog/2015/08/05/7724839

げっ、もう、3週間以上も前かあ。

この間、IEが追い込みになり、今週は体調を崩したりして、ちょっとお蔵入りになってたわけだな。

「減圧表については、表計算ではなくて、通常のプログラムに落とし込むという宿題があるが、そう簡単ではなさそうだ。
しかし、大量の変数を上手く捌くことが出来れば、計算式は一つなので簡単といえば簡単だ。
何時になったら出来るかは、神のみぞ知るところではあるが、チャレンジはしてみよう。」

というわけで、IEの勉強の気分転換に、取り組みを始めてみようという気になってきた(大丈夫なのかあ?)。

まあいい。

少しは、他のことに気を向けないと、息が詰まりそうだ。

一番問題になるのは、開発環境というか、実行環境をどうするかということだ。

自分自身で使ってみるだけなら、それこそフリーの表計算ソフトをチマチマと仕上げて、パソコンの前でヘリウム吸う妄想に駆られつつ、ハアハアしながらパラメーターを入力してもいい。

しかし、お役所がせっかく公表してくれた計算式があるんだから、誰もがネットで繋げて計算できる方がいいし、たとえば、その部分をコピペして、ご自分で使いやすいようにカスタマイズできる方がもっといい。

浮沈子は、プログラミングは大昔にベーシックとやらを、少しだけ弄ったことがある程度だ(後は、エクリプスでアンドロイド用のコーディングを少しだけ)。

最近は、そういう込み入ったことはできなくなってしまって、この前も、表計算のマクロを書くのに大汗かいてしまった。

JAVAの出初めのころは、面白がってアプレット弄ったりしていたが、中身のことはさっぱりである。

C言語もハローワールドで玉砕したし、HTMLも手書きで書いてみたものの、続かずに、当時のホームページは消えた。

基本的には、1から習うようなものだから、好きな言語で書けるともいうし、逆に、まともに使える言語は皆無ともいう・・・。

どうしようかと考えているが、軽い環境で動くベーシックか、ローカル環境で動くジャバスクリプトか、どちらかを選ぼうと思っている。

両方やってもいいしな。

メリットとしては、インタープリター(または、仮想マシン)で、いちいちコンパイルしなくても動作が確認できること、実行環境がたくさん転がっている(一般的な)こと、開発環境が重たくないこと、ソースコードが分かりやすいことなどが挙げられる。

値を出し入れするところに凝りだすと、何を使っても面倒くさいので、簡単に済ませたい(ベーシックは、テキストベースだな)。

配列をうまく使って、16組織を纏めて計算して、判定のロジックを適当に書けば、何とかなりそうな気がしている。

M値を算出する表は、出来れば外部化して、保守性を持たせたりする機能も付けたい。

(高気圧作業安全衛生規則改正検討会報告書)
http://www.mhlw.go.jp/stf/shingi/0000037880.html

この、「報告書資料」とあるのを見ると(ファイル、重いです)、深度によってM値の安全率を変えている表もある(別添資料4 空気呼吸・酸素減圧表 (奨励))。

今気づいたんだが、「帯底圧力」って何なんだあ!?(項目名の左の2項:滞底圧力?)。

まあ、どうでもいいんですが。

で、この辺りの調整ができるようにしておいた方がいいかもしれない。

換算M値の算出は、通常のM値を計算してから改めて行うので、混合ガス潜水の場合は複雑になりそうだ。

2種類(窒素とヘリウム)のガス分圧の加重平均をして、当該深度のM値を出してから、安全率アルファで割ってやるというわけだ(潜水士テキスト169ページ)。

めんどくせー!。

それを、深度毎に塩梅するというのは、気の遠くなるような話である。

その辺りの調整は、後回しだな。

この安全率を使う方法については、テキストの中では触れられているが、厚労省の通達では触れられていない(基発0109第2号 平成27年1月9日)。

方法論としては、オーソライズされていないわけで、保守性を高めるやり方は任意だ。

減圧停止を長くすればいいというものでもないので、この辺りは難しいところだな。

とういわけで、初めに掲げた計算式を具体的に解いていかなければならない。

QN2の初期値については、告示の中で74.5207(kPa)を使えとなっているが、大気圧の値として、94.33(kPa)を使う話は、告示にはない(潜水士テキストや、通達の最後には書いてある)。

実際の話はともかく、違法性ということになれば、一般的には告示までが最低ラインで、通達は努力目標ということになるんだろう。

初期値の話はこれくらいにして、この式のキモは、なんといっても自然対数の底を累乗するというところだろう。

kの値も自然対数を含んでいるが、こっちは定数なので分かりやすい。

ベーシックの方は、累乗の計算は「^」演算子でやればいいんだろうが、パッと見でジャバスクリプトでは累乗の演算子はない。

調べると、関数で持っていた。

(exp関数)
http://www.ajaxtower.jp/js/math_class/index19.html

exponentiationの「exp」というわけだな。

実際に近い値(-kt=-1.394286:半飽和時間5分の時、k=0.1394286、t=10)として計算してみると、以下のようになった。

「Math.exp(-1.394286) = 0.2480100523423779」

うーん、何となく使えそうだな。

ま、ここんとこがちゃんと計算できれば、あとは変数の値を代入していくだけなので、分圧を求めること自体には問題はない。

手間が掛かりそうなのは、M値との比較とか、初めの減圧停止(浮上停止)の深さはどのくらいかとか、そこでどのくらい停止していればいいかとか、繰り返して計算しなければならない部分だな。

変数の値を変化させながら、分圧を見ていくわけで、しかも16組織がすべてクリアしなければならない判定をどうするかということだ。

停止している深度ではなく、それから3m上がった浅い深度のM値ということになるので、しかも、その深度に上がる間のガスの放出も加味しなければならない。

表計算では、浮上シートと、浮上停止シートの2種類を作って、しかもそれぞれに窒素シートとヘリウムシートを作成し、不活性ガス合計シートを加えて、その区間で3枚(浮上)+3枚(停止)の6枚を作った。

浮上と停止の間で、QN2にPN2の値を引き継がなければならないし(これは、単純に代入してしまえばいいんだろうが)、比較・判定するためには、停止深度-3mの分圧も、同時に計算しなければならない。

判定は、各組織の分圧をM値と引き算して、正の値になるかどうかで判定すればいい。

表計算の場合は、分圧がM値より大きければ1、小さければ0を充てて、16組織の合計が全部0になったらOKという、ゴリゴリしたやり方をしていた。

この辺を簡単に実装する方法も考えておかなければならない。

考えてみれば、表計算ソフトは実に便利だ。

汎用性があるし、コピペでいくらでも式やシートを増やせる(計算時間も掛かりますが)。

混合ガスの場合は、M値が当該深度の分圧の加重平均になるため、その計算もしなければならない。

空気だけなら、窒素1種類なので、深度だけで決まってしまう。

だから、3m浅い深度のM値を出して、それと比較するのも簡単だったが、混合ガスではそうはいかない。

ちゃんと、3m浅いところのその時間での不活性ガスのそれぞれの分圧を出して、それでM値を計算して、それと3m下から上がっていったときの、3m上に到達した時のその時間の合計分圧とを比較していかなければならないのだ。

うーっ、めんどくせー!。

やっぱ、最初は空気だけでやってみて、混合ガスは、その次の段階で取り組むのが良さそうだな。

それだって、単純に考えても、

01 潜降
02 滞底
03 浮上1
04 停止1
05 浮上2
06 停止2
07 浮上3
08 停止3
09 浮上4
10 停止4
11 浮上5
12 停止5
13 浮上6
14 停止6

と、6段階の停止だけ考えても、14×16の計算式と、6×16の判定を行わなければならない(最後の浮上は、上がるだけ)。

十分面倒くさい。

それを、ブラウザーのボタン1発で計算してくれたら、楽でいいだろうな。

まあ、年内完成位のスケジュール感でいかないと、身が持たないような気もする。

さて、そろそろ寝るとしよう。

明日は、プレゼンテーションの資料を仕上げてしまわなければならない。

やっぱ、IE終わってから着手というのが妥当だろう。