laba6.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. # -*- coding: utf-8 -*-
  2. """
  3. Лаба 6. Расчёт параметров буровзрывных работ (разработка на полное сечение).
  4. Расчёт по формулам (6.1)-(6.17) методички.
  5. Замечание: числовой пример методички содержит арифметические погрешности
  6. (например, w0 = 0,63 м вместо 0,93 м по формуле), поэтому проверка ниже
  7. сходится с примером только по схеме расчёта, но не по всем округлениям.
  8. Длины в м, массы в кг.
  9. """
  10. from math import sqrt, ceil, floor
  11. # ---------------------------------------------------------------- справочные данные
  12. # Табл. 6.3 + 6.4 + 6.5 + 6.9: патронированные ВВ по диапазону крепости.
  13. # ВВ: (название, e, rho_вв диапазон кг/м3, d патрона м, длина патрона м, масса патрона кг)
  14. VV_BY_F = (
  15. ((10, 20), ("Аммонит №1 скальный", 0.81, (1450, 1580), 0.036, 0.175, 0.250)),
  16. ((7, 10), ("Аммонал", 0.91, (950, 1150), 0.032, 0.250, 0.250)),
  17. ((4, 7), ("Аммонит №6ЖВ", 1.00, (1000, 1200), 0.032, 0.250, 0.200)),
  18. ((2, 4), ("Динафталит", 1.08, (1000, 1150), 0.032, 0.250, 0.200)),
  19. ((1, 2), ("Аммонит ПЖВ-20", 1.20, (1050, 1200), 0.036, 0.175, 0.200)),
  20. )
  21. # Табл. 6.6: коэффициент влияния плотности заряжания
  22. PSI_PATRON = 1.10 # обычные патроны
  23. PSI_ROSSYP = 1.00 # россыпные ВВ
  24. # Табл. 6.7: (f_min, f_max, omega_min, omega_max) — снизу вверх по крепости
  25. OMEGA_ROWS = (
  26. (2, 4, 0.6, 0.8),
  27. (4, 6, 0.8, 1.0),
  28. (6, 8, 1.0, 1.4),
  29. (8, 10, 1.4, 1.6),
  30. (10, 14, 1.6, 1.8),
  31. (14, 18, 1.8, 1.9),
  32. (18, 20, 1.9, 2.0),
  33. )
  34. # Табл. 6.8: коэффициент зажима по площади сечения
  35. def k_z(S):
  36. if S < 20:
  37. return 0.7
  38. if S <= 50:
  39. return 0.8
  40. return 0.9
  41. # Табл. 6.10: расчётная плотность породы по крепости (снизу вверх)
  42. RHO_ROWS = (
  43. (2, 3, 2100),
  44. (4, 6, 2500),
  45. (7, 9, 2750),
  46. (10, 14, 2900),
  47. (15, 10**9, 3000),
  48. )
  49. # Табл. 6.11: расстояния отбойных/подошвенных шпуров в долях л.н.с. w0
  50. A_OTB = (0.90, 0.95) # между шпурами в ряду (и рядами — принимаем одинаковыми)
  51. A_POD = (0.70, 0.90)
  52. # Табл. 6.12: расстояние между контурными шпурами, м; строки по f, колонки по трещиноватости
  53. A_K_ROWS = (
  54. (2, 3, 0.6, 0.7, 0.6),
  55. (4, 6, 0.5, 0.6, 0.7),
  56. (7, 9, 0.4, 0.5, 0.6),
  57. (10, 12, 0.3, 0.4, 0.5),
  58. )
  59. # Табл. 6.13: коэффициент сближения контурных зарядов
  60. M_ROWS = ((2, 3, 1.0), (4, 6, 0.9), (7, 9, 0.8), (10, 14, 0.7), (15, 20, 0.6))
  61. # Табл. 6.14: коэффициент заполнения шпура (снизу вверх)
  62. KZAP_ROWS = (
  63. (2, 3, 0.50, 0.55),
  64. (4, 6, 0.60, 0.65),
  65. (7, 9, 0.65, 0.70),
  66. (10, 14, 0.70, 0.75),
  67. (15, 20, 0.75, 0.80),
  68. )
  69. # Табл. 6.15: коэффициент концентрации контурных зарядов, кг/м
  70. KK_ROWS = ((2, 3, 0.25), (4, 6, 0.30), (7, 9, 0.35), (10, 14, 0.40), (15, 20, 0.45))
  71. # Табл. 6.1: вертикальный клиновой вруб (f_min, f_max, N_вр диапазон) — снизу вверх
  72. VRUB_ROWS = (
  73. (2, 6, 4, 6),
  74. (6, 8, 4, 6),
  75. (8, 10, 6, 8),
  76. (10, 15, 6, 8),
  77. (15, 20, 6, 8),
  78. )
  79. def rup(x, n=2):
  80. """Математическое округление (половина — вверх), в отличие от round()."""
  81. p = 10 ** n
  82. return floor(x * p + 0.5) / p
  83. def pick(rows, f):
  84. """Первая строка (снизу вверх), в диапазон f которой попадает f."""
  85. for row in rows:
  86. if row[0] <= f <= row[1]:
  87. return row
  88. return rows[-1]
  89. def pick_vv(f):
  90. for (fmin, fmax), vv in VV_BY_F:
  91. if fmin <= f <= fmax:
  92. return vv
  93. return VV_BY_F[0][1]
  94. # Варианты исходных данных: (f, S, В, Р, l_k, l_зах)
  95. VARIANTS = {
  96. 1: (5, 16.56, 4.60, 14.51, 2.7, 2.5),
  97. 2: (9, 19.20, 5.05, 15.56, 3.5, 3.0),
  98. 3: (10, 21.90, 5.81, 17.19, 4.0, 3.5),
  99. 4: (13, 6.40, 2.17, 7.05, 4.1, 4.0),
  100. 5: (6, 7.92, 2.77, 1.20, 3.0, 2.5),
  101. 6: (8, 14.17, 4.53, 12.55, 3.5, 3.0),
  102. 7: (4, 24.46, 5.81, 17.53, 2.7, 2.5),
  103. 8: (7, 5.60, 2.00, 8.26, 0.0, 3.0),
  104. 9: (8, 14.09, 4.20, 13.56, 3.5, 3.0),
  105. 10: (11, 20.40, 5.29, 15.60, 4.2, 4.0),
  106. 11: (5, 104.94, 10.60, 33.80, 3.5, 3.0),
  107. 12: (7, 106.44, 11.36, 34.00, 3.8, 3.5),
  108. 13: (3, 24.46, 5.81, 17.53, 2.5, 2.0),
  109. 14: (8, 19.20, 5.05, 15.56, 3.7, 3.5),
  110. 15: (5, 23.40, 5.10, 19.40, 3.5, 3.0),
  111. 16: (12, 21.18, 5.87, 17.20, 4.2, 4.0),
  112. 17: (4, 22.26, 5.30, 16.44, 2.7, 2.5),
  113. 18: (7, 14.40, 3.70, 11.68, 3.5, 3.0),
  114. 19: (5, 44.54, 6.30, 40.20, 3.5, 3.0),
  115. 20: (10, 16.56, 4.60, 14.60, 4.0, 3.5),
  116. }
  117. # ---------------------------------------------------------------- расчёт
  118. def compute(f, S, B, P, l_k, l_zah, crack_col=1, n_vr=None, S_vr=None,
  119. psi=PSI_PATRON, vv=None, rho_vv=None, omega=None, a_o=None, a_p=None,
  120. a_k=None, k_zap=None, round_patrons=True):
  121. """Формулы (6.1)-(6.17). Неизвестные коэффициенты подбираются из таблиц:
  122. диапазоны берутся со средним значением, k_зап и N_вр — с верхним.
  123. crack_col: 0 монолитные, 1 слаботрещиноватые, 2 сильнотрещиноватые."""
  124. out = {}
  125. # --- выбор ВВ и коэффициентов
  126. if vv is None:
  127. vv = pick_vv(f)
  128. name, e, rho_range, d, l_pat, m_pat = vv
  129. if rho_vv is None:
  130. rho_vv = sum(rho_range) / 2
  131. if omega is None:
  132. _, _, w_min, w_max = pick(OMEGA_ROWS, f)
  133. omega = (w_min + w_max) / 2
  134. rho = pick(RHO_ROWS, f)[2]
  135. m = pick(M_ROWS, f)[2]
  136. k_k = pick(KK_ROWS, f)[2]
  137. if k_zap is None:
  138. k_zap = pick(KZAP_ROWS, f)[3] # верх диапазона
  139. k_y = 1.0 # патронированные ВВ
  140. if a_k is None:
  141. a_k = pick(A_K_ROWS, f)[2 + crack_col]
  142. if n_vr is None:
  143. n_vr = pick(VRUB_ROWS, f)[3] # верх диапазона числа шпуров
  144. if S_vr is None:
  145. S_vr = 0.19 * n_vr # по схеме вруба (8 шпуров ~ 1,5 м2)
  146. # --- 1) средний удельный расход ВВ, формула (6.1)
  147. q_c = rup((0.3 * sqrt(f) + 2 / sqrt(S)) * e * psi * omega)
  148. # --- 2) л.н.с. отбойных шпуров, формула (6.2)
  149. w0 = rup(52 * k_z(S) * d * sqrt(rho_vv / (rho * e * omega)))
  150. # --- 3) расстояния между шпурами
  151. if a_o is None:
  152. a_o = rup(A_OTB[0] * w0) # ~0,9 w0
  153. if a_p is None:
  154. a_p = rup(0.8 * w0) # ~0,8 w0 из диапазона 0,7...0,9
  155. # --- 4) количество шпуров
  156. N_k = floor(P / a_k + 1 + 0.5) # округление до ближайшего
  157. W_k = rup(a_k / m)
  158. S_k = rup((N_k - 1) * a_k * W_k)
  159. N_p = floor(B / a_p + 1 + 0.5)
  160. S_p = rup(w0 * B)
  161. S_o = rup(S - (S_k + S_p + S_vr))
  162. N_o = ceil(1.27 * q_c * S_o / (d**2 * k_zap * rho_vv * k_y)) # вверх
  163. N = N_k + N_p + N_o + n_vr
  164. # --- 5) к.и.ш. и глубина шпуров
  165. eta = l_zah / l_k if l_k else None
  166. l_vr = 1.1 * l_k
  167. # --- 6) расход ВВ на цикл, формулы (6.10)-(6.17)
  168. Q = rup(q_c * S * l_zah)
  169. q_k = l_k * k_k
  170. if round_patrons:
  171. q_k = floor(q_k / m_pat + 0.5) * m_pat # целое число патронов
  172. Q_k = q_k * N_k
  173. q_vr = 1.2 * (Q - Q_k) / (N - N_k)
  174. if round_patrons:
  175. q_vr = floor(q_vr / m_pat + 0.5) * m_pat
  176. Q_vr = q_vr * n_vr
  177. q_op = (Q - (Q_k + Q_vr)) / (N - (N_k + n_vr))
  178. if round_patrons:
  179. q_op = floor(q_op / m_pat + 0.5) * m_pat
  180. Q_op = q_op * (N_o + N_p)
  181. Q_vv = Q_k + Q_op + Q_vr
  182. out["ВВ"] = f"{name} (e={e}, ρвв={rho_vv:.0f})"
  183. out.update({
  184. "коэф.": f"ψ={psi}, ω={omega:g}, ρ={rho}, m={m:g}, kк={k_k:g}, kзап={k_zap:g}",
  185. "1) qc": round(q_c, 3), "2) w0": round(w0, 3),
  186. "3) ао": a_o, "3) ап": a_p, "3) ак": a_k,
  187. "4) Nк": N_k, "4) Wк": round(W_k, 3), "4) Sк": round(S_k, 2),
  188. "4) Nп": N_p, "4) Sп": round(S_p, 2), "4) Nвр": n_vr, "4) Sвр": round(S_vr, 2),
  189. "4) Sо": round(S_o, 2), "4) Nо": N_o, "4) N": N,
  190. "5) η": "—" if eta is None else round(eta, 3), "5) lвр": round(l_vr, 2),
  191. "6) Q": round(Q, 2), "6) qк": round(q_k, 3), "6) Qк": round(Q_k, 2),
  192. "6) qвр": round(q_vr, 3), "6) Qвр": round(Q_vr, 2),
  193. "6) qоп": round(q_op, 3), "6) Qоп": round(Q_op, 2), "6) Qвв": round(Q_vv, 2),
  194. "патр.": f"по {round(q_k/m_pat)}-{round(q_vr/m_pat)}-{round(q_op/m_pat)} шт · {m_pat*1000:.0f} г",
  195. })
  196. return out
  197. def report(title, res):
  198. print(f"\n=== {title} ===")
  199. for k, val in res.items():
  200. print(f" {k:10} = {val}")
  201. if __name__ == "__main__":
  202. import sys
  203. if len(sys.argv) > 1 and sys.argv[1].isdigit():
  204. n = int(sys.argv[1])
  205. f, S, B, P, l_k, l_zah = VARIANTS[n]
  206. res = compute(f, S, B, P, l_k, l_zah)
  207. if n == 6:
  208. # принятые в отчёте решения: слаботрещиноватые породы,
  209. # усиленный вруб 8 шпуров (верх диапазона 8...10), Sвр = 1,5 м2,
  210. # округлённые расстояния ао = 0,6 м, ап = 0,55 м, ак = 0,5 м
  211. res = compute(f, S, B, P, l_k, l_zah, n_vr=8, S_vr=1.5,
  212. a_o=0.60, a_p=0.55)
  213. report(f"Вариант {n}: f={f}, S={S}, В={B}, Р={P}, lк={l_k}, lзах={l_zah}", res)
  214. elif len(sys.argv) > 1 and sys.argv[1] == "all":
  215. cols = ["1) qc", "2) w0", "4) Nк", "4) Nп", "4) Nо", "4) Nвр", "4) N", "6) Qвв"]
  216. hdr = "N " + " ".join(f"{c.split(') ')[1]:>8}" for c in cols)
  217. print(hdr)
  218. for n, (f, S, B, P, l_k, l_zah) in VARIANTS.items():
  219. res = compute(f, S, B, P, l_k, l_zah)
  220. print(f"{n:<3}" + " ".join(f"{res[c]:>8}" for c in cols))
  221. else:
  222. # Пример методички: f=5, S=23,4, В=5,1, Р=19,4, lк=3,5, lзах=3
  223. # (аммонит 6ЖВ, e=1, ρвв=1100, ω=0,9; Nвр=8, Sвр=1,5 по условию примера)
  224. report("Пример методички (по формулам)", compute(
  225. 5, 23.4, 5.1, 19.4, 3.5, 3.0, n_vr=8, S_vr=1.5,
  226. a_o=0.8, a_p=0.7, a_k=0.6, omega=0.9))