空気減圧完成!2015年09月26日 03:12

空気減圧完成!
空気減圧完成!


ちょっと、気になって眠れそうもないので弄っていたら出来てしまった。

「10 cls
20 rem
30 rem <<<<潜降>>>>
40 rem
50 pa = 100
60 pb = 0
70 nn2 = 0.79
80 input "潜行速度(m/分) ? ",r
90 r = 10*r
100 input "作業深度(m) ? ",d
110 t = 10*d/r
120 qn2 = 74.5207
130 e = exp(1)
140 dim harf_time(16)
150 dim k(16)
160 dim bunatu(16)
170 for i = 1 to 16
180 read harf_time(i)
190 k(i) = log(2)/harf_time(i)
200 bunatu(i) = (pa+pb)*nn2+r*nn2*(t-1/k(i))-((pa+pb)*nn2-qn2-r*nn2/k(i))*e^(-k(i)*t)
210 next i
220 data 5,8,12.5,18.5,27,38.3,54.3,77,109,146,187,239,305,390,498,635
230 rem
240 rem <<<<作業>>>>
250 rem
260 pb = 10*d
270 dim qn2(16)
280 r = 0
290 input "作業時間(分) ? ",t
300 for i = 1 to 16
310 qn2(i) = bunatu(i)
320 bunatu(i) = (pa+pb)*nn2+r*nn2*(t-1/k(i))-((pa+pb)*nn2-qn2(i)-r*nn2/k(i))*e^(-k(i)*t)
330 next i
340 rem
350 rem <<<<浮上開始時の分圧>>>>
360 rem
370 dim btm_bunatu(16)
380 for i = 1 to 16
390 btm_bunatu(i) = bunatu(i)
400 next i
410 rem
420 rem <<<<M値>>>>
430 rem
440 dim mvn2a(16)
450 for i = 1 to 16
460 read mvn2a(i)
470 next i
480 data 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
490 dim mvn2b(16)
500 for i = 1 to 16
510 read mvn2b(i)
520 next i
530 data 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
540 rem
550 rem <<<<初回減圧停止深度の決定>>>>
560 rem
570 input "浮上速度(m/分) ? ",r
580 r = -10*r
590 dim hantei(16)
600 dim mv(16)
610 j = 0
620 while j < 20
630 t = abs((d-3*j)*10/r)
640 pc = 3*j*10
650 for i = 1 to 16
660 qn2(i) = btm_bunatu(i)
670 bunatu(i) = (pa+pb)*nn2+r*nn2*(t-1/k(i))-((pa+pb)*nn2-qn2(i)-r*nn2/k(i))*e^(-k(i)*t)
680 mv(i) = (pa+pc)/mvn2b(i)+mvn2a(i)
690 if bunatu(i) > mv(i) then hantei(i) = 1 else hantei(i) = 0
700 next i
710 hantei = 0
720 for i = 1 to 16
730 hantei = hantei+hantei(i)
740 next i
750 if hantei = 0 then exit while
760 j = j+1
770 wend
780 rem
790 rem <<<<停止+浮上>>>>
800 rem
810 if j = 0 then print "end"
820 while j > 0
830 print 3*j;"m,";
840 teisi = j
850 dim teisi_bunatu(16)
860 for i = 1 to 16
870 teisi_bunatu(i) = bunatu(i)
880 next i
890 pb = 3*teisi*10
900 pc = 3*(teisi-1)*10
910 l = 1
920 while l < 300
930 t = l
940 for i = 1 to 16
950 qn2(i) = teisi_bunatu(i)
960 bunatu(i) = (pa+pb)*nn2-((pa+pb)*nn2-qn2(i))*e^(-k(i)*t)
970 qn2(i) = bunatu(i)
980 next i
990 t = abs(3*10/r)
1000 for i = 1 to 16
1010 bunatu(i) = (pa+pb)*nn2+r*nn2*(t-1/k(i))-((pa+pb)*nn2-qn2(i)-r*nn2/k(i))*e^(-k(i)*t)
1020 mv(i) = (pa+pc)/mvn2b(i)+mvn2a(i)
1030 if bunatu(i) > mv(i) then hantei(i) = 1 else hantei(i) = 0
1040 next i
1050 hantei = 0
1060 for i = 1 to 16
1070 hantei = hantei+hantei(i)
1080 next i
1090 if hantei = 0 then exit while
1100 l = l+1
1110 wend
1120 print l;"min"
1130 j = j-1
1140 wend
1150 end」

前回予定していた、配列変数への格納はせずに、プリント文で吐き出す(手抜きかあ?)

810行目を生かし、820行目から1140行目をwhile文で括った。

jは、そのまま使い、910行目から1110行目はl(エル)で回している。

数字の1と間違いやすいので、あまりお勧めではないが、mとかnも使いたくないし・・・。

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

830行目に停止深度を印刷するプリント文を入れ、「;」で同じ行に続けて印刷するようにしている。

その停止時間は、1120行に出てくる。

840行目から880行目は、前回書いたように上書きすることとして、変数名を整理した。

あとは、基本的に変わっていないが、1130行目で、jの値をデクリメントしている。

これは、jを水面からの3m置きの階層番号としているからだ。

当初の事例(空気潜水40m60分潜降・浮上速度毎分10m海水)では、12m(水面を0として、4番目の階層)となっていた。

そこから、減圧停止しながら浮上をかけるわけで、jの値は減ってくる。

プログラムの中で、固定値として作業していたが、インプット文で、対話的に入力できるようにした(80行目、90行目、290行目、570行目)。

画像は、空気潜水、作業水深40m、滞底時間160分(作業時間155分)、潜降・浮上速度毎分8m、海水の場合の減圧を、検討会報告書資料、表計算ソフトで作成したもの、今回のプログラムの結果を比較してみたものである。

水深40mは全部やってみたが、殆ど完全に同じ結果になった。

端数処理の影響で、1分以内の誤差(検討会報告書資料に対して)が1か所出たが保守的に出たのでいいとしよう。

プログラムと表計算ソフトとは、整合している。

「潜行速度(m/分) ? 8
作業深度(m) ? 40
作業時間(分) ? 155
浮上速度(m/分) ? 8
18 m,5 min
15 m,20 min
12 m,31 min
9 m,46 min
6 m,90 min
3 m,211 min
>」

しかし、ここまでは、どちらかといえばプログラムの手法を勉強する感じだった。

結構、ゴリゴリ書いた感じだが、我ながらあっさりクリアした気がしないでもない。

プロトタイプというか、サンプルを書きながら、構造を確認していったのが良かったのかもしれない。

元の分圧の計算式や、M値を求める式をできるだけ崩さないで、記号も同じものを使って書くようにした。

プログラムとしては見にくいが、減圧式の適用という点では、見やすくなっていると思う(どこが・・・)。

まあいい。

プログラムに慣れている人から見たら、呆れるようなコードだらけかもしれないが、動いたもん勝ちだな。

配列なんか、0から始まるのに、1からしか使っていない!。

16個の配列変数を確保しているということを分かりやすくするために、敢えてそうした。

ベーシックという、現代ではいささか特異な言語を使ったが、インタープリターですぐに結果が出るのと、軽い環境で使えるということもあって、最初に書くのに使った。

ある程度、他言語への移植を意識して、余り凝った書き方はしていない。

処理手順は、基本的には検討会報告書の例に依ったが、初回減圧停止深度を求めるのには、作業深度から上がっていくのではなく、水面から下がってくるという手順を執った。

その際にも書いたが、その深度に浮上できないことを確認してから3m下がるという、2度手間を避けるというだけの話で、深い意味はない。

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

次は、酸素減圧とか、ヘリウムを含めた混合ガス潜水とか、安全率を掛けるとかの課題があるが、浮沈子的には他言語への移植を先にやりたいな。

ソースを公表しているので、酸素とか混合ガスとか安全率は、必要な方が手を付ければいいだろう(って、浮沈子も気が向いたらやりますが)。

当初の予定では、ジャバスクリプトが第一候補だ。

ブラウザーという実行環境が普及しているので、テキストファイルをローカルに置いて読ませるだけで出来る。

PHPとかだと、サーバー環境が必要だし、コンパイルが必要な言語とか、実行環境が一般的ではない(有料とか!)では、話にならない。

ベーシックでも、十分な実行速度である(一瞬!)。

表計算ソフトなんかより、はるかに速い(表計算ソフトでも、実用上は問題ないけどな)。

まあ、大した作業量じゃないし。

使用したチップマンクベーシックについては、若干癖があるようで、同じベーシックでも、移植する際には注意が必要かもしれない。

参考にしたページをリンクしておく。

(Chipmunk BASICプログラミング入門(基礎編))
http://pharm.ph.sojo-u.ac.jp/~kumayaku/KH/CMBasic/CMBasic.html

下の方に、リファレンスの仮訳があって、ずいぶん助かった。

(BASIC入門 (全11回))
http://dotinstall.com/lessons/basic_basic

消えかけている記憶を取り戻すのに、役に立ったことは確かだ。

(十進BASICのホームページ)
http://hp.vector.co.jp/authors/VA008683/index.htm

教育関係者は、こっちの方がいいかも。

中間ファイルにコンパイルするようなので敬遠したが、言語仕様はデジュリスタンダードなので、格式を重要視する場合はいい選択だろう。

(Chipmunk Basic)
http://www.nicholson.com/rhn/basic/

最後になったが、本家のページ。

頁の真ん中あたりに、ウインドウズ用のダウンロードリンクがある。

「Chipmunk Basic for MS Windows2000/XP - (version 3.6.5b6)」

今回は、このバージョンを使った。

無論、ウインドウズ10でも、十分動く。

解凍すると、開発環境が2つ出てくるが、chipmunkbasic.exeは、日本語を通さなかったので、basic.exeで書いた。

ラインエディターなので、死ぬほど使い辛いが、書けないことはない。

長いプログラムの場合は、他のエディターで書いて、コピペした方がいいかもしれない。

今回は、エディターの問題以前の話が多かったので、別に不自由はなかった。

変数の見直しとかしようと思っていたが、とりあえず動いたので、これでいいや(軟弱・・・)。

JavaScriptの勉強は、結構大変そうだが、オブジェクト指向言語は最近の流行りだから、励みになるな。

今時、レトロなベーシックで書くというのも流行らないしな。

とりあえず、動いたというところで、今日はぐっすり眠れそうだ。