用 python 解釋 PADI RDP 潛水計劃表 - 潛水運動討論

Queena avatar
By Queena
at 2020-11-02T23:45

Table of Contents

PADI RDP表
https://elearning.padi.com/company0/tools/RDP_Table%20Met.pdf

因為自然語言講起來比較囉嗦,如果用程式語言根據RDP的數據和演算法來實作
其實看的懂得人 反而會覺得更清楚

在此利用 python 來示範怎麼實作 RDP 和其應用(解習題)
==
利用線上的 python interpreter 去跑,只需要開瀏覽器,什麼都不用安裝
https://www.programiz.com/python-programming/online-compiler/
想要看什麼資料就直接print出來就好
連GUI都不用去設計,很快就可以讓程式運作起來得到我們想要的答案
==
程式 = 資料 + 演算法
我們先思考怎麼去將RDP上的資料表示
因為RDP就是一種 look-up table,所以自然而然在 python 會用dictionary
去實作
而我們可以列出幾個dic:
padi_table1
surface_table
padi_table2
max_bottom_times
然後再根據RDP上面的數據去輸入key:value
==
接下來我們來思考需要 def 哪些運算

get_depth_group的挑戰是
輸入一個深度
找出集合中和他最接近但是不小於的數字

def get_depth_group(depth):
depths = sorted(padi_table_1.keys())
last_dep = 0
for d in depths:
if last_dep < depth <= d:
return d
last_dep = d
print(last_dep)

print("depth group is " + str(get_depth_group(30)))

也就是如果想知道如果我一開始想下 30 公尺,那應該要查表上的哪個深度
我們把中間比較的過程也print出來,則output會是
10
12
14
16
18
20
22
25
depth group is 30

==
max_bottom_times = {10: 219, 12: 147, 14: 98, 16: 72, 18: 56, 20: 45, 22: 37, 25: 29, 30: 20, 35: 14, 40: 9}

def max_bottom_time(depth):
dep_group = get_depth_group(depth)
return max_bottom_times[dep_group]

max_bottom_times => 我們想要知道每一個深度的最大滯底時間
超過這個時間就要進deco了
(在表格上是塗黑)

先建立起 max_bottom_times的 dictionary

print(max_bottom_time(28))
結果是 20

==
def get_nearest_time_frame(dive_time, depth):
times = sorted([int(x) for x in padi_table_1[depth].keys()])
last_time = 0
for t in times:
if last_time < dive_time <= t:
return t
last_time = t

確定深度,往下找那一列的時間,然後一樣找不小於的時間
print( get_nearest_time_frame(18, 30))
output: 19

==
def get_end_pres(time, depth):
depth = get_depth_group(depth)
time = str(get_nearest_time_frame(time, depth))
pressure = padi_table_1[depth][time]
return pressure

print(get_end_pres(18, 30))
output: M
得到結束時的壓力等級是M
==

# 給定下潛前後的壓力等級,計算需要的 SI 區間
def get_interval(pressure_i, pressure_e):
interval = surface_table[pressure_i][pressure_e]
return interval

print(get_interval(‘M’,’B’))

output: ['01:26', '02:14’]
所以我就知道如果要從壓力等級 M 變成 B
SI 要介於 01:26 - 02:13 (時:分)
==
# 把時間區間的時:分格式轉成秒,方便電腦比較時間長短
def time2secs(str_time):
hour_seconds = int(str_time.split(':')[0])*60*60
min_seconds = int(str_time.split(':')[1])*60
return hour_seconds + min_seconds

print(time2secs("02:13”))
output: 7980 也就是說 2小時13分 = 7980 秒

就是利用 split的method去利用中間的冒號把小時跟分鐘分開
然後小時乘上 60*60
分鐘乘上 60
最後加總就變成秒
==

# 如果知道起始的壓力等級和水面休息時間,計算休息後的新壓力等級
def pressure_after_time(start_p, surf_time):
surf_time *= 60
if surf_time >= 3*60*60:
return 'A'
intervals = surface_table[start_p]
for x in intervals.keys():
interval = intervals[x]
if time2secs(interval[0]) <= surf_time <= time2secs(interval[1]):
return x

print(pressure_after_time(“M", 60))
output: D
也就是原本是M,休息60分鐘後,壓力等級變成D
==
如果下一潛想要下某個深度待某個時間,則壓力等級至少要是多少才不會超過 NDL
這時候你就要去看該深度的 ABT (actual bottom time) 剛好大過這個時間

def min_d2_start_pressure(d2_depth, d2_time):
closest_depth = get_depth_group(d2_depth)
max_times = padi_table_2[closest_depth]
for x in sorted(max_times.keys(), reverse=True):
abt = max_times[x][1]
if d2_time > abt:
continue
else:
return x

print(min_d2_start_pressure(14, 50))
output: M
==
#如果知道下潛之前的壓力等級,然後預計下一潛要潛的深度和時間,那麼SI至少要多久?

def min_surface(d1_end_p, d2_depth, d2_time):
d2_start_p = min_d2_start_pressure(d2_depth, d2_time)
if d1_end_p < d2_start_p:
return 0
else:
surface_interval = get_interval(d1_end_p, d2_start_p)
get_min_minutes = time2secs(surface_interval[0]) / 60
return get_min_minutes

print(min_surface(“M”,14, 60)
output: 15.0
也就是休息15分鐘後,壓力等級會從M變成J,而J的壓力等級下14m的 ABT最多可以61,剛好超過60
==
#如果知道SI過後的新壓力等級,然後下一潛想下的深度和時間,求下一潛結束後的新壓力等級

def repeat_dive_end_pressure(si_p_end, d2_depth, d2_time):
closest_depth = get_depth_group(d2_depth)
bottom_time_adjustment = padi_table_2[closest_depth][si_p_end][0]
adjusted_time = d2_time + bottom_time_adjustment
return get_end_pres(adjusted_time, closest_depth)

print(repeat_dive_end_pressure(“J", 20, 15))
output: R
也就是SI後壓力等級J,下20公尺15分鐘,這時候加上RNT 25分鐘變成40分鐘的TBT
然後切換回表1
查看下20公尺 40分鐘後,壓力等級會是R

--
Tags: 潛水

All Comments

Brianna avatar
By Brianna
at 2020-11-07T03:22
先...先推不然人家以為我看不懂
Margaret avatar
By Margaret
at 2020-11-11T07:00
推推! 剛好正在學python
Hardy avatar
By Hardy
at 2020-11-15T10:37
我以為我走錯版惹...
Frederica avatar
By Frederica
at 2020-11-19T14:14
懂了
Una avatar
By Una
at 2020-11-23T17:52
等等來自己寫寫看

閃電颱風小琉球行程

David avatar
By David
at 2020-11-02T19:59
這周五11/6-11/9 安排了小琉球AOW考照行程 一直在密切觀察閃電颱風路徑 目前氣象預測會掃到南台灣 大家會建議延期嗎? 謝謝 - ...

自潛長蛙抉擇

Lydia avatar
By Lydia
at 2020-11-01T01:03
※ 引述《walterDing (小丁)》之銘言: : 上過幾次課之後 發覺自己真的滿喜歡潛水的 : 於是決定入手一雙蛙鞋 : 目前有主要有兩雙蛙鞋在考慮 : 分別是CETMA-PRANA 跟 台灣的meetdeep : 一開始本來想從Leaderfins 跟 普魯士藍 下手 : 但沒有自己喜歡的樣式 ...

自潛長蛙抉擇

Dora avatar
By Dora
at 2020-10-31T21:20
上過幾次課之後 發覺自己真的滿喜歡潛水的 於是決定入手一雙蛙鞋 目前有主要有兩雙蛙鞋在考慮 分別是CETMA-PRANA 跟 台灣的meetdeep 一開始本來想從Leaderfins 跟 普魯士藍 下手 但沒有自己喜歡的樣式 我是黃色控XD 所以稍微逛過幾間拍賣之後選定這上面那兩雙 有 ...

徵求綠島10/31or11/1fun dive

Megan avatar
By Megan
at 2020-10-30T17:28
1. 徵伴類型:fun dive 2. 日期時間:10/31整天或11/1上午 3. 費用:看能徵到幾位…… 4. 潛店/教練名稱:石朗附近為主(今天問店家,這幾天柴口受東北季風影響無法潛) 5. 徵伴內容:幫男友徵OW fun dive潛伴,預計潛兩支,男女不限~ 6. 聯絡方式:站內信 7. ...

請教輕量化BCD的推薦

Callum avatar
By Callum
at 2020-10-30T00:01
各位潛友前輩們好,小弟最近OW也累積快30隻氣瓶, 開始有了購買重裝的念頭,在最近一次去小琉球潛旅後, 對於背著裝備跑交通的過程感覺疲累, 故針對重裝想挑輕量化的款式去採購,目前主要在BCD這塊有看中三款: 1. Aqualung Zuma 重量不到2KG,價格$17000 2. HOLLIS LT ...