ヘリウム中間報告 ― 2015年10月03日 01:40
ヘリウム中間報告
コーディングをサボって、巷の減圧ソフト探しに現を抜かしているこの頃だが、全く何もしていないわけではない。
まあ、それに近いものはあるんだがな。
一応、出来たところまで公開する。
「<html lang="ja">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
</head>
<body>
<!DOCTYPE html>
<script>
function print(str){
document.write(str + "<br />");
}
/*
<<<<潜降>>>>
*/
var pa = 100;
var pb = 0;
//var nn2 = 0.79;
var nn2 = 0.5;
var nhe=0.30;
var r0;//潜降速度(m/分)
r0=10;//r0=prompt("senkou_sokudo(m/min) ? ","");
//if ( (r0 == "") || (r0 == null) ) r0 = "0";
r0 = 10*r0;
var d;//作業深度(m)
d=40;//d=prompt("sagyou_sindo(m) ? ","");
//if ( (d == "") || (d == null) ) d = "0";
var t = 10*d/r0;
var qn2 = 74.5207;
var qhe=0
var half_time_n2=[5,8,12.5,18.5,27,38.3,54.3,77,109,146,187,239,305,390,498,635];
var half_time_he=[1.887,3.019,4.717,6.981,10.189,14.453,20.491,29.057,41.132,55.094,70.566,90.189,115.094,147.170,187.925,239.623]
var kn2=new Array(15);
var bunatu_n2=new Array(15);
for (var i = 0; i < 16;i++){
kn2[i] = Math.log(2)/half_time_n2[i];
bunatu_n2[i] = (pa+pb)*nn2+r0*nn2*(t-1/kn2[i])-((pa+pb)*nn2-qn2-r0*nn2/kn2[i])*Math.exp(-kn2[i]*t);
}
var khe=new Array(15);
var bunatu_he=new Array(15);
for (var i = 0; i < 16;i++){
khe[i] = Math.log(2)/half_time_he[i];
bunatu_he[i] = (pa+pb)*nhe+r0*nhe*(t-1/khe[i])-((pa+pb)*nhe-qhe-r0*nhe/khe[i])*Math.exp(-khe[i]*t);
}
/*
<<<<作業>>>>
*/
var pb = 10*d;
var qn2=new Array(15);
var qhe=new Array(15);
var t1;//作業時間(分)
t1=60;//t=prompt("sagyou_jikan(min) ? ","");
//if ( (t1 == "") || (t1 == null) ) t1 = "0";
for (var i = 0; i < 16;i++){
qn2[i] = bunatu_n2[i];
bunatu_n2[i] = (pa+pb)*nn2-((pa+pb)*nn2-qn2[i])*Math.exp(-kn2[i]*t1);
qhe[i] = bunatu_he[i];
bunatu_he[i] = (pa+pb)*nhe-((pa+pb)*nhe-qhe[i])*Math.exp(-khe[i]*t1);
}
/*
<<<<浮上開始時の分圧>>>>
*/
var btm_bunatu_n2=new Array(15);
for (var i = 0; i < 16;i++){
btm_bunatu_n2[i] = bunatu_n2[i]
}
var btm_bunatu_he=new Array(15);
for (var i = 0; i < 16;i++){
btm_bunatu_he[i] = bunatu_he[i]
}
/*
<<<<M値>>>>
*/
var mvn2a=[126.885,109.185,94.381,82.446,73.918,63.153,56.483,51.133,48.246,43.709,40.774,38.68,34.463,33.161,30.765,29.284];
var mvn2b=[0.5578,0.6514,0.7222,0.7825,0.8126,0.8434,0.8693,0.891,0.9092,0.9222,0.9319,0.9403,0.9477,0.9544,0.9602,0.9653];
var mvhea=[174.247,147.866,127.477,112.400,99.588,89.446,80.059,71.709,66.285,62.049,59.152,58.029,57.586,58.143,57.652,57.208]
var mvheb=[0.4770,0.5747,0.6527,0.7223,0.7582,0.7957,0.8279,0.8553,0.8757,0.8903,0.8997,0.9073,0.9122,0.9171,0.9217,0.9267]
/*
<<<<初回減圧停止深度の決定>>>>
*/
var r;//浮上速度(m/分)
r=10;//r=prompt("fujyou_sokudo(m/min) ? ","");
//if ( (r == "") || (r == null) ) r = "0";
r = -10*r;
var hantei=new Array(15);
var mv=new Array(15);
var j = 0;
while (j < 20){
var t = Math.abs((d-3*j)*10/r);
var pc = 3*j*10;
for (var i = 0; i < 16;i++){
//窒素の計算
qn2[i] = btm_bunatu_n2[i];
bunatu_n2[i] = (pa+pb)*nn2+r*nn2*(t-1/kn2[i])-((pa+pb)*nn2-qn2[i]-r*nn2/kn2[i])*Math.exp(-kn2[i]*t);
//ヘリウムの計算
qhe[i] = btm_bunatu_he[i];
bunatu_he[i] = (pa+pb)*nhe+r*nhe*(t-1/khe[i])-((pa+pb)*nhe-qhe[i]-r*nhe/khe[i])*Math.exp(-khe[i]*t);
// mv[i] = (pa+pc)/mvn2b[i]+mvn2a[i];//窒素だけの時
//ヘリウム混合の時
mv[i]=(pa+pc)/((mvn2b[i]*bunatu_n2[i]+mvheb[i]*bunatu_he[i])/(bunatu_n2[i]+bunatu_he[i]))+((mvn2a[i]*bunatu_n2[i]+mvhea[i]*bunatu_he[i])/(bunatu_n2[i]+bunatu_he[i]));
// mv[i] = mv[i]/1.4//安全率
if (bunatu_n2[i]+bunatu_he[i] > mv[i]){
hantei[i] = 1;
} else {
hantei[i] = 0;
}
}//for閉じ
var hanteiti = 0;
for (var i = 0; i < 16;i++){
hanteiti = hanteiti+hantei[i];
}//for閉じ
if (hanteiti === 0){
break;
}
j++;
}//while閉じ
print(j);
for (var i = 0; i < 16;i++){
print(mv[i]);
}
/*
<<<<停止+浮上>>>>
*/
if (j === 0){
print("end");
}
/*
while (j > 0){
var teisi = j;
var teisi_bunatu=new Array(15);
for (var i = 0; i < 16;i++){
teisi_bunatu[i] = bunatu[i];
}//for抜け
var pb = 3*teisi*10;
var pc = 3*(teisi-1)*10;
var l = 1;
while (l < 300){
var t = l;
for (var i = 0; i < 16;i++){
qn2[i] = teisi_bunatu[i];
bunatu[i] = (pa+pb)*nn2-((pa+pb)*nn2-qn2[i])*Math.exp(-k[i]*t);
qn2[i] = bunatu[i];
}//for抜け
var t = Math.abs(3*10/r);
for (var i = 0; i < 16;i++){
bunatu[i] = (pa+pb)*nn2+r*nn2*(t-1/k[i])-((pa+pb)*nn2-qn2[i]-r*nn2/k[i])*Math.exp(-k[i]*t);
mv[i] = (pa+pc)/mvn2b[i]+mvn2a[i];
// mv[i] = mv[i]/1.1//安全率
if (bunatu[i] > mv[i]){
hantei[i] = 1;
} else {//if抜け
hantei[i] = 0;
}//else抜け
}//for抜け
var hanteiti = 0;
for (var i = 0; i < 16;i++){
hanteiti = hanteiti+hantei[i];
}//for抜け
if (hanteiti === 0){
break;
}//if抜け
l++
}//内側のwhile抜け
//プリント表示
print(3*j+"m,"+ l +"min");
j--
}//外側のwhile抜け
*/
</script>
</body>
</html>」
作業途中なので、見にくさ100倍なんだが、最後の<<<<停止+浮上>>>>については、全く手を付けていない(コメントアウトしてます)。
その前の所にある以下のプリント文は、ここまでの処理が正常に行われているかどうかを確認するためのものである。
「print(j);
for (var i = 0; i < 16;i++){
print(mv[i]);
}」
これをこのままの状態で実行すると、ヘリウム混合で潜った時の、初回停止深度の係数「j」(3m掛けると、初回停止深度になります:12m)と、その深度におけるM値が出てくる。
「4
558.2588050578379
475.2908259535448
422.1654567449188
383.42910024361345
362.3437278997782
341.32148400388013
325.05516818853266
311.37882693669485
301.748512769794
293.1553202554894
287.12974317366206
282.5825964063619
277.1005665073798
273.7517288580578
269.3430163673012
265.64898410370944」
画像は、表計算ソフトで行った結果と比較している。
各パラメーターの値は、コードに直書きしているが、海水、トライミックス20/30で水深40m、作業時間60分、潜降・浮上速度10m/分といういつものパターンである。
変数名をユニークにしたり(後々、パラメーターを一括で入力できるようにしたいので)、計算式を見直したり、いろいろ弄っている。
傑作なバグもやらかして、時間を食っているが、自分がどういうミスをしがちかということが分かってきて、リカバリーも要領がよくなった(「half」を「herf」にしたり、式の中の「-」符号を外し忘れたり・・・)。
プログラミング以前の問題が多いな。
まあ、どうでもいいんですが。
ロジック的には、書き換えたところまでは、問題なく(?)動いている。
少なくとも、計算の値は確かだ。
最後のところは、少し頭が冴えてる時でないと書き換えができない(んじゃあ、いつまでたってもダメじゃん!?)。
じっくり、考えながら、取り組むことにしよう。
while文の入れ子になっているところなので、ベーシックで書いたときのように、外側のロジックが動いているかどうかを確認してから、内側の値を小さくして、チェックしていくのがいいだろう。
何言ってるか、自分でも良く分かってないんだがな。
とりあえず、今日はこれで保存して寝る。
表計算ソフトでは、この設定時の減圧スケジュールは、以下になるはずである。
「トライミックス20/30:
12m:6分
9m:12分
6m:23分
3m:49分」
そう、空気の時より、長くなっている。
窒素酔いのことを考えなければ、ヘリウム使うというのは、かえってリスクが高くなる面もある。
「空気:
12m,5min (1分)
9m,13min (1分)
6m,21min (2分)
3m,42min(7分)」
まあ、トータルでも11分の差である。
30mからヤバイといわれる、窒素の麻酔効果をどう評価するかだな。
厚労省は、金に糸目を付けずに、30mからトライミックスにせい!、といっているが、背に腹は代えられないだろう。
歩留まりも悪くなるしな。
もちろん、法的には、40mまで空気で潜らせても問題はない。
酸素減圧と組み合わせて、トライミックス使用時でも、短時間の減圧で済むようにするのが王道というわけだ。
プログラム上で、酸素減圧をどうするかについては、いろいろ考えている。
NSK減圧表のように、最終減圧を9mで済ませたりするパターンも実現できるといいな(というか、最終停止深度を3m以外に設定できるようにすべきだろう)。
こんなことや、あんなことも、いろいろ構想はあるんだが、それは、動いてからのお楽しみだ。
とりあえず、ヘリウム混合ガスで、初回停止深度の割り出しまでは漕ぎつけた。
これで、とりあえずは良しとしよう・・・。
コーディングをサボって、巷の減圧ソフト探しに現を抜かしているこの頃だが、全く何もしていないわけではない。
まあ、それに近いものはあるんだがな。
一応、出来たところまで公開する。
「<html lang="ja">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
</head>
<body>
<!DOCTYPE html>
<script>
function print(str){
document.write(str + "<br />");
}
/*
<<<<潜降>>>>
*/
var pa = 100;
var pb = 0;
//var nn2 = 0.79;
var nn2 = 0.5;
var nhe=0.30;
var r0;//潜降速度(m/分)
r0=10;//r0=prompt("senkou_sokudo(m/min) ? ","");
//if ( (r0 == "") || (r0 == null) ) r0 = "0";
r0 = 10*r0;
var d;//作業深度(m)
d=40;//d=prompt("sagyou_sindo(m) ? ","");
//if ( (d == "") || (d == null) ) d = "0";
var t = 10*d/r0;
var qn2 = 74.5207;
var qhe=0
var half_time_n2=[5,8,12.5,18.5,27,38.3,54.3,77,109,146,187,239,305,390,498,635];
var half_time_he=[1.887,3.019,4.717,6.981,10.189,14.453,20.491,29.057,41.132,55.094,70.566,90.189,115.094,147.170,187.925,239.623]
var kn2=new Array(15);
var bunatu_n2=new Array(15);
for (var i = 0; i < 16;i++){
kn2[i] = Math.log(2)/half_time_n2[i];
bunatu_n2[i] = (pa+pb)*nn2+r0*nn2*(t-1/kn2[i])-((pa+pb)*nn2-qn2-r0*nn2/kn2[i])*Math.exp(-kn2[i]*t);
}
var khe=new Array(15);
var bunatu_he=new Array(15);
for (var i = 0; i < 16;i++){
khe[i] = Math.log(2)/half_time_he[i];
bunatu_he[i] = (pa+pb)*nhe+r0*nhe*(t-1/khe[i])-((pa+pb)*nhe-qhe-r0*nhe/khe[i])*Math.exp(-khe[i]*t);
}
/*
<<<<作業>>>>
*/
var pb = 10*d;
var qn2=new Array(15);
var qhe=new Array(15);
var t1;//作業時間(分)
t1=60;//t=prompt("sagyou_jikan(min) ? ","");
//if ( (t1 == "") || (t1 == null) ) t1 = "0";
for (var i = 0; i < 16;i++){
qn2[i] = bunatu_n2[i];
bunatu_n2[i] = (pa+pb)*nn2-((pa+pb)*nn2-qn2[i])*Math.exp(-kn2[i]*t1);
qhe[i] = bunatu_he[i];
bunatu_he[i] = (pa+pb)*nhe-((pa+pb)*nhe-qhe[i])*Math.exp(-khe[i]*t1);
}
/*
<<<<浮上開始時の分圧>>>>
*/
var btm_bunatu_n2=new Array(15);
for (var i = 0; i < 16;i++){
btm_bunatu_n2[i] = bunatu_n2[i]
}
var btm_bunatu_he=new Array(15);
for (var i = 0; i < 16;i++){
btm_bunatu_he[i] = bunatu_he[i]
}
/*
<<<<M値>>>>
*/
var mvn2a=[126.885,109.185,94.381,82.446,73.918,63.153,56.483,51.133,48.246,43.709,40.774,38.68,34.463,33.161,30.765,29.284];
var mvn2b=[0.5578,0.6514,0.7222,0.7825,0.8126,0.8434,0.8693,0.891,0.9092,0.9222,0.9319,0.9403,0.9477,0.9544,0.9602,0.9653];
var mvhea=[174.247,147.866,127.477,112.400,99.588,89.446,80.059,71.709,66.285,62.049,59.152,58.029,57.586,58.143,57.652,57.208]
var mvheb=[0.4770,0.5747,0.6527,0.7223,0.7582,0.7957,0.8279,0.8553,0.8757,0.8903,0.8997,0.9073,0.9122,0.9171,0.9217,0.9267]
/*
<<<<初回減圧停止深度の決定>>>>
*/
var r;//浮上速度(m/分)
r=10;//r=prompt("fujyou_sokudo(m/min) ? ","");
//if ( (r == "") || (r == null) ) r = "0";
r = -10*r;
var hantei=new Array(15);
var mv=new Array(15);
var j = 0;
while (j < 20){
var t = Math.abs((d-3*j)*10/r);
var pc = 3*j*10;
for (var i = 0; i < 16;i++){
//窒素の計算
qn2[i] = btm_bunatu_n2[i];
bunatu_n2[i] = (pa+pb)*nn2+r*nn2*(t-1/kn2[i])-((pa+pb)*nn2-qn2[i]-r*nn2/kn2[i])*Math.exp(-kn2[i]*t);
//ヘリウムの計算
qhe[i] = btm_bunatu_he[i];
bunatu_he[i] = (pa+pb)*nhe+r*nhe*(t-1/khe[i])-((pa+pb)*nhe-qhe[i]-r*nhe/khe[i])*Math.exp(-khe[i]*t);
// mv[i] = (pa+pc)/mvn2b[i]+mvn2a[i];//窒素だけの時
//ヘリウム混合の時
mv[i]=(pa+pc)/((mvn2b[i]*bunatu_n2[i]+mvheb[i]*bunatu_he[i])/(bunatu_n2[i]+bunatu_he[i]))+((mvn2a[i]*bunatu_n2[i]+mvhea[i]*bunatu_he[i])/(bunatu_n2[i]+bunatu_he[i]));
// mv[i] = mv[i]/1.4//安全率
if (bunatu_n2[i]+bunatu_he[i] > mv[i]){
hantei[i] = 1;
} else {
hantei[i] = 0;
}
}//for閉じ
var hanteiti = 0;
for (var i = 0; i < 16;i++){
hanteiti = hanteiti+hantei[i];
}//for閉じ
if (hanteiti === 0){
break;
}
j++;
}//while閉じ
print(j);
for (var i = 0; i < 16;i++){
print(mv[i]);
}
/*
<<<<停止+浮上>>>>
*/
if (j === 0){
print("end");
}
/*
while (j > 0){
var teisi = j;
var teisi_bunatu=new Array(15);
for (var i = 0; i < 16;i++){
teisi_bunatu[i] = bunatu[i];
}//for抜け
var pb = 3*teisi*10;
var pc = 3*(teisi-1)*10;
var l = 1;
while (l < 300){
var t = l;
for (var i = 0; i < 16;i++){
qn2[i] = teisi_bunatu[i];
bunatu[i] = (pa+pb)*nn2-((pa+pb)*nn2-qn2[i])*Math.exp(-k[i]*t);
qn2[i] = bunatu[i];
}//for抜け
var t = Math.abs(3*10/r);
for (var i = 0; i < 16;i++){
bunatu[i] = (pa+pb)*nn2+r*nn2*(t-1/k[i])-((pa+pb)*nn2-qn2[i]-r*nn2/k[i])*Math.exp(-k[i]*t);
mv[i] = (pa+pc)/mvn2b[i]+mvn2a[i];
// mv[i] = mv[i]/1.1//安全率
if (bunatu[i] > mv[i]){
hantei[i] = 1;
} else {//if抜け
hantei[i] = 0;
}//else抜け
}//for抜け
var hanteiti = 0;
for (var i = 0; i < 16;i++){
hanteiti = hanteiti+hantei[i];
}//for抜け
if (hanteiti === 0){
break;
}//if抜け
l++
}//内側のwhile抜け
//プリント表示
print(3*j+"m,"+ l +"min");
j--
}//外側のwhile抜け
*/
</script>
</body>
</html>」
作業途中なので、見にくさ100倍なんだが、最後の<<<<停止+浮上>>>>については、全く手を付けていない(コメントアウトしてます)。
その前の所にある以下のプリント文は、ここまでの処理が正常に行われているかどうかを確認するためのものである。
「print(j);
for (var i = 0; i < 16;i++){
print(mv[i]);
}」
これをこのままの状態で実行すると、ヘリウム混合で潜った時の、初回停止深度の係数「j」(3m掛けると、初回停止深度になります:12m)と、その深度におけるM値が出てくる。
「4
558.2588050578379
475.2908259535448
422.1654567449188
383.42910024361345
362.3437278997782
341.32148400388013
325.05516818853266
311.37882693669485
301.748512769794
293.1553202554894
287.12974317366206
282.5825964063619
277.1005665073798
273.7517288580578
269.3430163673012
265.64898410370944」
画像は、表計算ソフトで行った結果と比較している。
各パラメーターの値は、コードに直書きしているが、海水、トライミックス20/30で水深40m、作業時間60分、潜降・浮上速度10m/分といういつものパターンである。
変数名をユニークにしたり(後々、パラメーターを一括で入力できるようにしたいので)、計算式を見直したり、いろいろ弄っている。
傑作なバグもやらかして、時間を食っているが、自分がどういうミスをしがちかということが分かってきて、リカバリーも要領がよくなった(「half」を「herf」にしたり、式の中の「-」符号を外し忘れたり・・・)。
プログラミング以前の問題が多いな。
まあ、どうでもいいんですが。
ロジック的には、書き換えたところまでは、問題なく(?)動いている。
少なくとも、計算の値は確かだ。
最後のところは、少し頭が冴えてる時でないと書き換えができない(んじゃあ、いつまでたってもダメじゃん!?)。
じっくり、考えながら、取り組むことにしよう。
while文の入れ子になっているところなので、ベーシックで書いたときのように、外側のロジックが動いているかどうかを確認してから、内側の値を小さくして、チェックしていくのがいいだろう。
何言ってるか、自分でも良く分かってないんだがな。
とりあえず、今日はこれで保存して寝る。
表計算ソフトでは、この設定時の減圧スケジュールは、以下になるはずである。
「トライミックス20/30:
12m:6分
9m:12分
6m:23分
3m:49分」
そう、空気の時より、長くなっている。
窒素酔いのことを考えなければ、ヘリウム使うというのは、かえってリスクが高くなる面もある。
「空気:
12m,5min (1分)
9m,13min (1分)
6m,21min (2分)
3m,42min(7分)」
まあ、トータルでも11分の差である。
30mからヤバイといわれる、窒素の麻酔効果をどう評価するかだな。
厚労省は、金に糸目を付けずに、30mからトライミックスにせい!、といっているが、背に腹は代えられないだろう。
歩留まりも悪くなるしな。
もちろん、法的には、40mまで空気で潜らせても問題はない。
酸素減圧と組み合わせて、トライミックス使用時でも、短時間の減圧で済むようにするのが王道というわけだ。
プログラム上で、酸素減圧をどうするかについては、いろいろ考えている。
NSK減圧表のように、最終減圧を9mで済ませたりするパターンも実現できるといいな(というか、最終停止深度を3m以外に設定できるようにすべきだろう)。
こんなことや、あんなことも、いろいろ構想はあるんだが、それは、動いてからのお楽しみだ。
とりあえず、ヘリウム混合ガスで、初回停止深度の割り出しまでは漕ぎつけた。
これで、とりあえずは良しとしよう・・・。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。
※投稿には管理者が設定した質問に答える必要があります。