From SW's laptop

Reorientation of codes
master
sanginnwoo 2022-10-08 17:49:32 +09:00
parent bfb6932f9b
commit 36cbd6e3fd
21 changed files with 5339 additions and 11025 deletions

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 68 KiB

View File

@ -1,128 +0,0 @@
Time,Settle,Surcharge
0,0,1.887
3,41,1.887
6,61.5,1.887
10,73.1,1.887
13,81.6,1.887
17,86.9,1.887
20,91.9,1.887
23,96.7,1.887
26,101.6,1.887
30,107.7,2.94
33,113,2.94
37,119.4,2.94
40,122.8,2.94
44,128.4,2.94
47,131.9,2.94
52,139.5,2.94
54,140.5,2.94
59,148,2.94
62,151,2.94
65,153.8,2.94
68,156.6,2.94
72,160,2.94
75,162.5,2.94
79,166,2.94
83,169.1,2.94
86,172,2.94
89,174.7,2.94
94,180.3,2.94
96,182.1,2.94
100,185.5,2.94
103,188.4,2.94
110,195.8,2.94
114,198.7,2.94
118,201.1,2.94
122,205,2.94
125,206.9,2.94
128,209.3,2.94
131,211.8,2.94
135,214.2,2.94
138,216.2,2.94
143,217.4,2.94
146,218.3,2.94
150,219.1,2.94
153,219.9,2.94
156,220.9,2.94
159,222,2.94
164,227.7,2.94
167,230.7,2.94
171,234.8,3.48
173,236.5,3.48
177,239.7,3.48
180,241.8,3.48
184,243.9,3.48
187,246.3,3.48
191,249.6,3.48
194,252.1,3.48
198,255.5,3.48
201,258.9,3.48
205,261.2,3.48
208,263.4,3.48
212,265.8,3.48
215,267.1,3.48
219,268.9,3.48
222,270.2,3.48
227,273.4,3.48
229,275,3.48
234,277.3,3.48
237,278.1,3.48
241,280,3.48
244,281.2,3.48
248,283.2,3.48
251,284.6,3.48
254,286.1,3.48
257,287.5,3.48
262,289.5,3.48
265,290.7,3.48
268,292,3.48
271,293.2,3.48
275,294.7,3.48
278,295.3,3.48
282,296.3,3.48
285,296.7,3.48
289,297.6,3.48
292,298.5,3.48
296,299.8,3.48
299,300.6,3.48
303,302.2,3.48
306,303.5,3.48
310,312.8,5.608
313,318.1,5.608
317,322.8,6.794
320,328.9,6.794
324,335.3,6.794
328,340.5,6.794
331,342.9,6.794
334,345.5,6.794
339,348,6.794
342,350.6,6.794
345,353.1,6.794
348,355.6,6.794
352,358.9,6.794
355,361,6.794
362,365.6,6.794
367,369,6.794
370,370.5,6.794
373,372.2,6.794
376,373.8,6.794
381,376.4,6.794
384,378.5,6.794
387,380.4,6.794
390,382.4,6.794
394,385.8,6.794
397,388,6.794
402,389.9,6.794
405,390.9,6.794
409,392.6,6.794
412,394,6.794
415,396.7,6.794
418,397.5,6.794
422,398.7,6.794
425,399.1,6.794
429,399.8,6.794
432,400.9,6.794
436,403.6,6.794
439,405.6,6.794
443,408.2,6.794
446,409.4,6.794
1 Time Settle Surcharge
2 0 0 1.887
3 3 41 1.887
4 6 61.5 1.887
5 10 73.1 1.887
6 13 81.6 1.887
7 17 86.9 1.887
8 20 91.9 1.887
9 23 96.7 1.887
10 26 101.6 1.887
11 30 107.7 2.94
12 33 113 2.94
13 37 119.4 2.94
14 40 122.8 2.94
15 44 128.4 2.94
16 47 131.9 2.94
17 52 139.5 2.94
18 54 140.5 2.94
19 59 148 2.94
20 62 151 2.94
21 65 153.8 2.94
22 68 156.6 2.94
23 72 160 2.94
24 75 162.5 2.94
25 79 166 2.94
26 83 169.1 2.94
27 86 172 2.94
28 89 174.7 2.94
29 94 180.3 2.94
30 96 182.1 2.94
31 100 185.5 2.94
32 103 188.4 2.94
33 110 195.8 2.94
34 114 198.7 2.94
35 118 201.1 2.94
36 122 205 2.94
37 125 206.9 2.94
38 128 209.3 2.94
39 131 211.8 2.94
40 135 214.2 2.94
41 138 216.2 2.94
42 143 217.4 2.94
43 146 218.3 2.94
44 150 219.1 2.94
45 153 219.9 2.94
46 156 220.9 2.94
47 159 222 2.94
48 164 227.7 2.94
49 167 230.7 2.94
50 171 234.8 3.48
51 173 236.5 3.48
52 177 239.7 3.48
53 180 241.8 3.48
54 184 243.9 3.48
55 187 246.3 3.48
56 191 249.6 3.48
57 194 252.1 3.48
58 198 255.5 3.48
59 201 258.9 3.48
60 205 261.2 3.48
61 208 263.4 3.48
62 212 265.8 3.48
63 215 267.1 3.48
64 219 268.9 3.48
65 222 270.2 3.48
66 227 273.4 3.48
67 229 275 3.48
68 234 277.3 3.48
69 237 278.1 3.48
70 241 280 3.48
71 244 281.2 3.48
72 248 283.2 3.48
73 251 284.6 3.48
74 254 286.1 3.48
75 257 287.5 3.48
76 262 289.5 3.48
77 265 290.7 3.48
78 268 292 3.48
79 271 293.2 3.48
80 275 294.7 3.48
81 278 295.3 3.48
82 282 296.3 3.48
83 285 296.7 3.48
84 289 297.6 3.48
85 292 298.5 3.48
86 296 299.8 3.48
87 299 300.6 3.48
88 303 302.2 3.48
89 306 303.5 3.48
90 310 312.8 5.608
91 313 318.1 5.608
92 317 322.8 6.794
93 320 328.9 6.794
94 324 335.3 6.794
95 328 340.5 6.794
96 331 342.9 6.794
97 334 345.5 6.794
98 339 348 6.794
99 342 350.6 6.794
100 345 353.1 6.794
101 348 355.6 6.794
102 352 358.9 6.794
103 355 361 6.794
104 362 365.6 6.794
105 367 369 6.794
106 370 370.5 6.794
107 373 372.2 6.794
108 376 373.8 6.794
109 381 376.4 6.794
110 384 378.5 6.794
111 387 380.4 6.794
112 390 382.4 6.794
113 394 385.8 6.794
114 397 388 6.794
115 402 389.9 6.794
116 405 390.9 6.794
117 409 392.6 6.794
118 412 394 6.794
119 415 396.7 6.794
120 418 397.5 6.794
121 422 398.7 6.794
122 425 399.1 6.794
123 429 399.8 6.794
124 432 400.9 6.794
125 436 403.6 6.794
126 439 405.6 6.794
127 443 408.2 6.794
128 446 409.4 6.794

183
main.py
View File

@ -1,183 +0,0 @@
# 주요 수정 사항
# 주석 철저히: 한글로 작성해도 괜찮아요
# 입력 1: 시간-침하 데이터, 시간-성토고 데이터 --> 파일로 부터 읽는 것
# 입력 2: 사용자가 단계 지정 ---> 간 단계별 처음과 끝 INDEX
# 입력 3: 전체 성토 단계 횟수
# 라이브러리 import
import numpy as np
from scipy.optimize import least_squares
import matplotlib.pyplot as plt
from matplotlib import rcParams
import pandas as pd
# Functions
# generate a time-settlement curve for hyperbolic method
def generate_data_hyper(px, pt):
return pt / (px[0] * pt + px[1])
# error between regression and measurement
def fun_hyper_nonlinear(px, pt, py):
return pt / (px[0] * pt + px[1]) - py
# i단계 보정 침하량 산정
def fun_step_measured_correction(m, p):
return m - p
# i단계 t-ti 산정
def fun_step_time_correction(t, ti):
return t - ti
# i단계 침하곡선 작성
def settlement_prediction_curve(m1, p1):
return m1 + p1
# i단계 보정 예측 침하량 산정
def fun_step_prediction_correction(m2, p2):
return p2 + (m2[0] - p2[0])
# 파일 읽기, 리스트 설정
# Read .csv file using pandas
data = pd.read_csv("data/1_SP-11.csv")
# Set arrays for time and settlement
time = data['Time'].to_numpy()
settle = data['Settle'].to_numpy()
surcharge = data['Surcharge'].to_numpy()
#
# 성토 단계 시작, 끝 인덱스 입력 / 전체 성토 단계 입력
# 예: 1단계: (0, 9), 2단계: (10, 37), 3단계: (38, 80)
# 예: 전체 성토 단계: 3
#
# 각 단계별 예측을 반복문으로 처리
#
step_start_index = [0, 10, 38]
step_end_index = [9, 37, 80]
x0 = np.ones(2)
for i in range(0,3):
if i == 0 : # 1단계
# 1단계 실측 기간 및 침하량
globals()['tm_{}'.format(i)] = time[step_start_index[i]:step_end_index[i]]
globals()['ym_{}'.format(i)] = settle[step_start_index[i]:step_end_index[i]]
res_lsq_hyper_nonlinear_0 = least_squares(fun_hyper_nonlinear, x0, args=(tm_0, ym_0))
print(res_lsq_hyper_nonlinear_0.x)
globals()['settle_predicted_{}'.format(i)] = generate_data_hyper(res_lsq_hyper_nonlinear_0.x, time)
elif 0 < i < 2 : # 최종단계 3단계 이므로 2를 넘지 않도록 설정
# i단계 실측 기간 및 침하량
globals()['tm_{}'.format(i)] = time[step_start_index[i]:step_end_index[i]]
globals()['ym_{}'.format(i)] = settle[step_start_index[i]:step_end_index[i]]
# i단계~최종 실측 기간 및 침하량
globals()['tmm_{}'.format(i)] = time[step_start_index[i]:step_end_index[i+1]]
globals()['ymm_{}'.format(i)] = settle[step_start_index[i]:step_end_index[i+1]]
# i-1 단계 예측 침하량 (i단계에 해당하는)
globals()['yp_{}'.format(i)] = settle_predicted_0[step_start_index[i]:step_end_index[i]]
# i-1 단계 예측 침하량 (i단계~최종)
globals()['ypp_{}'.format(i)] = settle_predicted_0[step_start_index[i]:step_end_index[i + 1]]
# i단계 실측 보정 침하량 산정
globals()['step_{}_measured_correction'.format(i)] = fun_step_measured_correction(ym_1, yp_1)
# i단계 t-ti 산정
globals()['step_{}_time_correction'.format(i)] = fun_step_time_correction(tmm_1, tm_1[0])
# i 단계 보정 침하량에 대한 예측 침하량 산정
globals()['res_lsq_hyper_nonlinear_{}'.format(i)] = least_squares(fun_hyper_nonlinear, x0,
args=(step_1_time_correction[0:(step_end_index[i]-step_start_index[i])], step_1_measured_correction))
print(res_lsq_hyper_nonlinear_1.x)
globals()['settle_hyper_nonlinear_{}'.format(i)] = generate_data_hyper(res_lsq_hyper_nonlinear_1.x, step_1_time_correction)
# i단계 침하곡선 작성
globals()['step_{}_prediction_curve'.format(i)] = settlement_prediction_curve(settle_hyper_nonlinear_1, ypp_1)
# i단계 보정 예측 침하량 산정
globals()['settle_predicted_{}'.format(i)] = fun_step_prediction_correction(ymm_1, step_1_prediction_curve)
else: # 최종 성토 단계
# 최종 단계 실측 기간 및 침하량
globals()['tm_{}'.format(i)] = time[step_start_index[i]:step_end_index[i]]
globals()['ym_{}'.format(i)] = settle[step_start_index[i]:step_end_index[i]]
# i-1 단계 예측 침하량 (최종 단계에 해당하는)
globals()['yp_{}'.format(i)] = settle_predicted_1[(step_start_index[i]-step_start_index[i-1]):step_end_index[i]]
# 최종 단계 실측 보정 침하량 산정
globals()['step_{}_measured_correction'.format(i)] = fun_step_measured_correction(ym_2, yp_2)
# 최종 단계 t-ti 산정
globals()['step_{}_time_correction'.format(i)] = fun_step_time_correction(tm_2, tm_2[0])
# 최종 단계 보정 침하량에 대한 예측 침하량 산정
globals()['res_lsq_hyper_nonlinear_{}'.format(i)] = least_squares(fun_hyper_nonlinear, x0,
args=(step_2_time_correction, step_2_measured_correction))
print(res_lsq_hyper_nonlinear_2.x)
globals()['settle_hyper_nonlinear_{}'.format(i)] = generate_data_hyper(res_lsq_hyper_nonlinear_2.x,
step_2_time_correction)
# 최종 단계 침하곡선 작성
globals()['step_{}_prediction_curve'.format(i)] = settlement_prediction_curve(settle_hyper_nonlinear_2, yp_2)
# i단계 보정 예측 침하량 산정
globals()['settle_predicted_{}'.format(i)] = fun_step_prediction_correction(ym_2, step_2_prediction_curve)
break
'''
나중에: 그래프 작성
'''
# Set parameters for plotting
rcParams['figure.figsize'] = (10, 10)
# Subplot
f, axes = plt.subplots(2,1)
plt.subplots_adjust(hspace = 0.1)
# draw surcharge data
axes[0].plot(time, surcharge, color='black', label='surcharge height')
axes[0].set_ylabel("Surcharge height (m)", fontsize = 17)
axes[0].set_xlim(left = 0)
# draw measured data
axes[1].scatter(time, -settle, s = 50, facecolors='white', edgecolors='black', label = 'measured data')
# draw predicted data
axes[1].plot(time, -settle_predicted_0, linestyle='--', color='red', label='Predicted Curve_Step 1')
axes[1].plot(tmm_1, -settle_predicted_1, linestyle='--', color='blue', label='Predicted Curve_Step 2')
axes[1].plot(tm_2, -settle_predicted_2, linestyle='--', color='green', label='Predicted Curve_Step 3')
# Set axes title
axes[1].set_xlabel("Time (day)", fontsize = 17)
axes[1].set_ylabel("Settlement (mm)", fontsize = 17)
# Set min values of x and y axes
axes[1].set_ylim(top = 0)
axes[1].set_ylim(bottom = -1.5 * settle.max())
axes[1].set_xlim(left = 0)
# Set legend
axes[1].legend(bbox_to_anchor = (0, 0, 1, 0), loc =4, ncol = 3, mode="expand",
borderaxespad = 0, frameon = False, fontsize = 12)
plt.savefig('main_Rev.1.png', dpi=300)
plt.show()

View File

@ -1,184 +0,0 @@
# =================
# Import 섹션
# =================
import numpy as np
from scipy.optimize import least_squares
import matplotlib.pyplot as plt
from matplotlib import rcParams
import pandas as pd
# =================
# Function 섹션
# =================
# 주어진 계수를 이용하여 쌍곡선 시간-침하 곡선 반환
def generate_data_hyper(px, pt):
return pt / (px[0] * pt + px[1])
# 회귀식과 측정치와의 잔차 반환 (비선형 쌍곡선)
def fun_hyper_nonlinear(px, pt, py):
return pt / (px[0] * pt + px[1]) - py
# =================
# Step별 활용 Function
# =================
# i단계 보정 침하량 산정
def fun_step_measured_correction(m, p):
return m - p
# i단계 t-ti 산정
def fun_step_time_correction(t, ti):
return t - ti
# i단계 침하곡선 작성
def settlement_prediction_curve(m1, p1):
return m1 + p1
# i단계 보정 예측 침하량 산정
def fun_step_prediction_correction(m2, p2):
return p2 + (m2[0] - p2[0])
# =================
# 입력값 설정
# =================
# CSV 파일 읽기
data = pd.read_csv("3_SP-68_Test.csv")
# 시간, 침하량, 성토고 배열 생성
time = data['Time'].to_numpy()
settle = data['Settle'].to_numpy()
surcharge = data['Surcharge'].to_numpy()
# =================
# 성토 단계 구분
# =================
step_start_index = [0, 9, 49, 90] # 단계별 성토 시작 지점 입력(4단계 이므로 4개)
step_end_index = [8, 48, 89, 129] # 단계별 성토 종료 지점 입력(4단계 이므로 4개)
x0 = np.ones(2)
num_step = 4
for i in range(0, num_step): # 성토 단계에 따라 수정(4단계 이므로 0~4)
# i단계 실측 기간 및 침하량
globals()['tm_{}'.format(i)] = time[step_start_index[i]:step_end_index[i]]
globals()['ym_{}'.format(i)] = settle[step_start_index[i]:step_end_index[i]]
if i == 0 : # 1단계
res_lsq_hyper_nonlinear_0 = least_squares(fun_hyper_nonlinear, x0, args=(tm_0, ym_0))
print(res_lsq_hyper_nonlinear_0.x)
globals()['settle_predicted_{}'.format(i)] = generate_data_hyper(res_lsq_hyper_nonlinear_0.x, time)
elif 0 < i < (num_step - 1):
# i단계~최종 실측 기간 및 침하량
globals()['tmm_{}'.format(i)] = time[step_start_index[i]:step_end_index[-1]]
globals()['ymm_{}'.format(i)] = settle[step_start_index[i]:step_end_index[-1]]
# i-1단계 예측 침하량(i단계 기간에 해당하는)
globals()['yp_{}'.format(i)] = globals()['settle_predicted_{}'.format(i - 1)][(step_start_index[i]-step_start_index[i-1]):(step_end_index[i]-step_start_index[i-1])]
# i-1 단계 예측 침하량 (i단계~최종)
globals()['ypp_{}'.format(i)] = globals()['settle_predicted_{}'.format(i - 1)][(step_start_index[i]-step_start_index[i-1]):(step_end_index[-1]-step_start_index[i-1])]
# i단계 실측 보정 침하량 산정
globals()['step_{}_measured_correction'.format(i)] = fun_step_measured_correction(globals()['ym_{}'.format(i)],globals()['yp_{}'.format(i)])
# i단계 t-ti 산정
globals()['step_{}_time_correction'.format(i)] = fun_step_time_correction(globals()['tmm_{}'.format(i)],
globals()['tm_{}'.format(i)][0])
# i 단계 보정 침하량에 대한 예측 침하량 산정
globals()['res_lsq_hyper_nonlinear_{}'.format(i)] = least_squares(fun_hyper_nonlinear, x0,
args=(globals()['step_{}_time_correction'.format(i)][0:(step_end_index[i]-step_start_index[i])],
globals()['step_{}_measured_correction'.format(i)]))
print(globals()['res_lsq_hyper_nonlinear_{}'.format(i)].x)
globals()['settle_hyper_nonlinear_{}'.format(i)] = generate_data_hyper(globals()['res_lsq_hyper_nonlinear_{}'.format(i)].x,
globals()['step_{}_time_correction'.format(i)])
# i단계 침하곡선 작성
globals()['step_{}_prediction_curve'.format(i)] = settlement_prediction_curve(globals()['settle_hyper_nonlinear_{}'.format(i)],
globals()['ypp_{}'.format(i)])
# i단계 보정 예측 침하량 산정
globals()['settle_predicted_{}'.format(i)] = fun_step_prediction_correction(globals()['ymm_{}'.format(i)],
globals()['step_{}_prediction_curve'.format(i)])
else: # 최종 성토 단계
# i-1 단계 예측 침하량 (최종 단계에 해당하는)
globals()['yp_{}'.format(i)] = globals()['settle_predicted_{}'.format(i - 1)][(step_start_index[i]-step_start_index[i-1]):step_end_index[i]]
# 최종 단계 실측 보정 침하량 산정
globals()['step_{}_measured_correction'.format(i)] = fun_step_measured_correction(globals()['ym_{}'.format(i)],
globals()['yp_{}'.format(i)])
# 최종 단계 t-ti 산정
globals()['step_{}_time_correction'.format(i)] = fun_step_time_correction(globals()['tm_{}'.format(i)],
globals()['tm_{}'.format(i)][0])
# 최종 단계 보정 침하량에 대한 예측 침하량 산정
globals()['res_lsq_hyper_nonlinear_{}'.format(i)] = least_squares(fun_hyper_nonlinear, x0,
args=(globals()['step_{}_time_correction'.format(i)],
globals()['step_{}_measured_correction'.format(i)]))
print(globals()['res_lsq_hyper_nonlinear_{}'.format(i)].x)
globals()['settle_hyper_nonlinear_{}'.format(i)] = generate_data_hyper(globals()['res_lsq_hyper_nonlinear_{}'.format(i)].x,
globals()['step_{}_time_correction'.format(i)])
# 최종 단계 침하곡선 작성
globals()['step_{}_prediction_curve'.format(i)] = settlement_prediction_curve(globals()['settle_hyper_nonlinear_{}'.format(i)],
globals()['yp_{}'.format(i)])
# 최종단계 보정 예측 침하량 산정
globals()['settle_predicted_{}'.format(i)] = fun_step_prediction_correction(globals()['ym_{}'.format(i)],
globals()['step_{}_prediction_curve'.format(i)])
'''
나중에: 그래프 작성
'''
# 그래프 크기, 서브 그래프 개수 및 비율 설정
f, axes = plt.subplots(2,1, figsize=(10, 10),
gridspec_kw={'height_ratios':[1,2]})
# 성토고 그래프 표시
axes[0].plot(time, surcharge, color='black', label='surcharge height')
axes[0].set_ylabel("Surcharge height (m)", fontsize = 17)
axes[0].set_xlim(left = 0)
axes[0].grid(color="gray", alpha=.5, linestyle='--')
axes[0].tick_params(direction='in')
# 계측 침하량 표시
axes[1].scatter(time, -settle, s = 50, facecolors='white', edgecolors='black', label = 'measured data')
# 예측 침하량 표시
axes[1].plot(time, -settle_predicted_0, linestyle='--', color='red', label='Predicted Curve_Step 1')
axes[1].plot(tmm_1, -settle_predicted_1, linestyle='--', color='blue', label='Predicted Curve_Step 2')
axes[1].plot(tmm_2, -settle_predicted_2, linestyle='--', color='green', label='Predicted Curve_Step 3')
axes[1].plot(tm_3, -settle_predicted_3, linestyle='--', color='orange', label='Predicted Curve_Step 4')
# 예측 침하량 그래프 설정
axes[1].set_xlabel("Time (day)", fontsize = 17)
axes[1].set_ylabel("Settlement (mm)", fontsize = 17)
axes[1].set_ylim(top = 0)
axes[1].set_ylim(bottom = -1.5 * settle.max())
axes[1].set_xlim(left = 0)
# 범례 표시
axes[1].legend(loc=1, ncol=2, frameon=True, fontsize=12)
# 그래프 저장 및 출력
plt.savefig('3_SP-68_Rev.4_Test.svg', dpi=300)
plt.show()

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 156 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

After

Width:  |  Height:  |  Size: 168 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

After

Width:  |  Height:  |  Size: 150 KiB

View File

@ -6,7 +6,7 @@
<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<cc:Work> <cc:Work>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:date>2022-08-13T16:51:38.196337</dc:date> <dc:date>2022-10-08T17:44:39.058006</dc:date>
<dc:format>image/svg+xml</dc:format> <dc:format>image/svg+xml</dc:format>
<dc:creator> <dc:creator>
<cc:Agent> <cc:Agent>
@ -42,16 +42,16 @@ z
<g id="line2d_1"> <g id="line2d_1">
<path d="M 56.684375 143.961328 <path d="M 56.684375 143.961328
L 56.684375 30.561328 L 56.684375 30.561328
" clip-path="url(#p5e92c73fb3)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#p400380a3d8)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_2"> <g id="line2d_2">
<defs> <defs>
<path id="m2e2981a0fb" d="M 0 0 <path id="m49b08245b3" d="M 0 0
L 0 -3.5 L 0 -3.5
" style="stroke: #000000; stroke-width: 0.8"/> " style="stroke: #000000; stroke-width: 0.8"/>
</defs> </defs>
<g> <g>
<use xlink:href="#m2e2981a0fb" x="56.684375" y="143.961328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m49b08245b3" x="56.684375" y="143.961328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_1"> <g id="text_1">
@ -88,11 +88,11 @@ z
<g id="line2d_3"> <g id="line2d_3">
<path d="M 192.948111 143.961328 <path d="M 192.948111 143.961328
L 192.948111 30.561328 L 192.948111 30.561328
" clip-path="url(#p5e92c73fb3)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#p400380a3d8)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_4"> <g id="line2d_4">
<g> <g>
<use xlink:href="#m2e2981a0fb" x="192.948111" y="143.961328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m49b08245b3" x="192.948111" y="143.961328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_2"> <g id="text_2">
@ -134,11 +134,11 @@ z
<g id="line2d_5"> <g id="line2d_5">
<path d="M 329.211848 143.961328 <path d="M 329.211848 143.961328
L 329.211848 30.561328 L 329.211848 30.561328
" clip-path="url(#p5e92c73fb3)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#p400380a3d8)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_6"> <g id="line2d_6">
<g> <g>
<use xlink:href="#m2e2981a0fb" x="329.211848" y="143.961328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m49b08245b3" x="329.211848" y="143.961328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_3"> <g id="text_3">
@ -175,11 +175,11 @@ z
<g id="line2d_7"> <g id="line2d_7">
<path d="M 465.475584 143.961328 <path d="M 465.475584 143.961328
L 465.475584 30.561328 L 465.475584 30.561328
" clip-path="url(#p5e92c73fb3)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#p400380a3d8)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_8"> <g id="line2d_8">
<g> <g>
<use xlink:href="#m2e2981a0fb" x="465.475584" y="143.961328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m49b08245b3" x="465.475584" y="143.961328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_4"> <g id="text_4">
@ -227,11 +227,11 @@ z
<g id="line2d_9"> <g id="line2d_9">
<path d="M 601.73932 143.961328 <path d="M 601.73932 143.961328
L 601.73932 30.561328 L 601.73932 30.561328
" clip-path="url(#p5e92c73fb3)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#p400380a3d8)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_10"> <g id="line2d_10">
<g> <g>
<use xlink:href="#m2e2981a0fb" x="601.73932" y="143.961328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m49b08245b3" x="601.73932" y="143.961328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_5"> <g id="text_5">
@ -290,16 +290,16 @@ z
<g id="line2d_11"> <g id="line2d_11">
<path d="M 56.684375 125.083286 <path d="M 56.684375 125.083286
L 726.284375 125.083286 L 726.284375 125.083286
" clip-path="url(#p5e92c73fb3)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#p400380a3d8)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_12"> <g id="line2d_12">
<defs> <defs>
<path id="m3e2250e2fe" d="M 0 0 <path id="m5133ebe584" d="M 0 0
L 3.5 0 L 3.5 0
" style="stroke: #000000; stroke-width: 0.8"/> " style="stroke: #000000; stroke-width: 0.8"/>
</defs> </defs>
<g> <g>
<use xlink:href="#m3e2250e2fe" x="56.684375" y="125.083286" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m5133ebe584" x="56.684375" y="125.083286" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_6"> <g id="text_6">
@ -313,11 +313,11 @@ L 3.5 0
<g id="line2d_13"> <g id="line2d_13">
<path d="M 56.684375 97.636292 <path d="M 56.684375 97.636292
L 726.284375 97.636292 L 726.284375 97.636292
" clip-path="url(#p5e92c73fb3)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#p400380a3d8)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_14"> <g id="line2d_14">
<g> <g>
<use xlink:href="#m3e2250e2fe" x="56.684375" y="97.636292" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m5133ebe584" x="56.684375" y="97.636292" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_7"> <g id="text_7">
@ -365,11 +365,11 @@ z
<g id="line2d_15"> <g id="line2d_15">
<path d="M 56.684375 70.189298 <path d="M 56.684375 70.189298
L 726.284375 70.189298 L 726.284375 70.189298
" clip-path="url(#p5e92c73fb3)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#p400380a3d8)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_16"> <g id="line2d_16">
<g> <g>
<use xlink:href="#m3e2250e2fe" x="56.684375" y="70.189298" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m5133ebe584" x="56.684375" y="70.189298" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_8"> <g id="text_8">
@ -383,11 +383,11 @@ L 726.284375 70.189298
<g id="line2d_17"> <g id="line2d_17">
<path d="M 56.684375 42.742304 <path d="M 56.684375 42.742304
L 726.284375 42.742304 L 726.284375 42.742304
" clip-path="url(#p5e92c73fb3)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#p400380a3d8)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_18"> <g id="line2d_18">
<g> <g>
<use xlink:href="#m3e2250e2fe" x="56.684375" y="42.742304" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m5133ebe584" x="56.684375" y="42.742304" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_9"> <g id="text_9">
@ -755,7 +755,7 @@ L 256.992067 67.581833
L 261.079979 35.715874 L 261.079979 35.715874
L 694.398661 35.715874 L 694.398661 35.715874
L 694.398661 35.715874 L 694.398661 35.715874
" clip-path="url(#p5e92c73fb3)" style="fill: none; stroke: #000000; stroke-width: 1.5; stroke-linecap: square"/> " clip-path="url(#p400380a3d8)" style="fill: none; stroke: #000000; stroke-width: 1.5; stroke-linecap: square"/>
</g> </g>
<g id="patch_3"> <g id="patch_3">
<path d="M 56.684375 143.961328 <path d="M 56.684375 143.961328
@ -789,7 +789,7 @@ z
</g> </g>
<g id="PathCollection_1"> <g id="PathCollection_1">
<defs> <defs>
<path id="m587d138e69" d="M 0 3.535534 <path id="mb1583126d7" d="M 0 3.535534
C 0.937635 3.535534 1.836992 3.163008 2.5 2.5 C 0.937635 3.535534 1.836992 3.163008 2.5 2.5
C 3.163008 1.836992 3.535534 0.937635 3.535534 0 C 3.163008 1.836992 3.535534 0.937635 3.535534 0
C 3.535534 -0.937635 3.163008 -1.836992 2.5 -2.5 C 3.535534 -0.937635 3.163008 -1.836992 2.5 -2.5
@ -801,131 +801,131 @@ C -1.836992 3.163008 -0.937635 3.535534 0 3.535534
z z
" style="stroke: #000000"/> " style="stroke: #000000"/>
</defs> </defs>
<g clip-path="url(#pdb9f71be6c)"> <g clip-path="url(#pbc9021e9bd)">
<use xlink:href="#m587d138e69" x="56.684375" y="189.321328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="56.684375" y="189.321328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="60.090968" y="198.717328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="60.090968" y="198.717328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="61.453606" y="202.227328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="61.453606" y="202.227328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="64.17888" y="206.709328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="64.17888" y="206.709328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="66.222837" y="211.839328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="66.222837" y="211.839328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="70.992067" y="223.935328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="70.992067" y="223.935328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="75.761298" y="228.471328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="75.761298" y="228.471328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="80.530529" y="231.873328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="80.530529" y="231.873328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="85.29976" y="239.703328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="85.29976" y="239.703328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="89.387672" y="244.671328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="89.387672" y="244.671328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="92.794265" y="247.641328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="92.794265" y="247.641328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="93.475584" y="248.289328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="93.475584" y="248.289328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="94.156902" y="248.937328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="94.156902" y="248.937328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="94.838221" y="249.585328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="94.838221" y="249.585328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="96.882177" y="252.663328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="96.882177" y="252.663328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="97.563496" y="253.689328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="97.563496" y="253.689328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="98.244815" y="254.715328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="98.244815" y="254.715328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="98.926133" y="255.579328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="98.926133" y="255.579328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="102.332727" y="259.629328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="102.332727" y="259.629328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="103.014045" y="260.547328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="103.014045" y="260.547328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="103.695364" y="261.465328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="103.695364" y="261.465328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="104.376683" y="262.437328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="104.376683" y="262.437328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="107.101957" y="265.677328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="107.101957" y="265.677328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="107.783276" y="266.487328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="107.783276" y="266.487328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="108.464595" y="267.297328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="108.464595" y="267.297328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="109.145913" y="268.269328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="109.145913" y="268.269328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="111.18987" y="269.889328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="111.18987" y="269.889328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="111.871188" y="270.429328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="111.871188" y="270.429328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="112.552507" y="270.969328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="112.552507" y="270.969328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="113.233826" y="271.509328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="113.233826" y="271.509328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="118.684375" y="277.233328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="118.684375" y="277.233328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="123.453606" y="281.121328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="123.453606" y="281.121328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="128.222837" y="284.901328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="128.222837" y="284.901328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="132.992067" y="287.817328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="132.992067" y="287.817328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="135.036023" y="289.221328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="135.036023" y="289.221328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="136.398661" y="290.031328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="136.398661" y="290.031328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="137.079979" y="290.463328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="137.079979" y="290.463328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="139.805254" y="298.887328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="139.805254" y="298.887328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="141.167891" y="302.991328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="141.167891" y="302.991328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="141.84921" y="305.151328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="141.84921" y="305.151328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="142.530529" y="307.365328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="142.530529" y="307.365328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="144.574485" y="309.417328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="144.574485" y="309.417328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="145.255804" y="310.119328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="145.255804" y="310.119328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="145.937122" y="310.821328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="145.937122" y="310.821328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="146.618441" y="311.523328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="146.618441" y="311.523328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="147.29976" y="312.171328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="147.29976" y="312.171328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="149.343716" y="314.439328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="149.343716" y="314.439328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="150.025034" y="315.195328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="150.025034" y="315.195328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="150.706353" y="315.951328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="150.706353" y="315.951328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="151.387672" y="316.707328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="151.387672" y="316.707328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="152.06899" y="317.463328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="152.06899" y="317.463328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="154.112946" y="319.299328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="154.112946" y="319.299328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="156.838221" y="321.891328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="156.838221" y="321.891328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="159.563496" y="324.159328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="159.563496" y="324.159328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="161.607452" y="325.833328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="161.607452" y="325.833328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="164.332727" y="328.533328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="164.332727" y="328.533328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="166.376683" y="330.315328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="166.376683" y="330.315328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="168.420639" y="331.935328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="168.420639" y="331.935328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="171.145913" y="334.041328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="171.145913" y="334.041328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="173.871188" y="336.309328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="173.871188" y="336.309328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="175.915144" y="338.091328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="175.915144" y="338.091328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="180.003056" y="342.411328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="180.003056" y="342.411328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="187.497562" y="347.811328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="187.497562" y="347.811328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="189.541518" y="349.269328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="189.541518" y="349.269328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="192.266793" y="352.023328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="192.266793" y="352.023328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="194.310749" y="353.805328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="194.310749" y="353.805328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="199.079979" y="357.315328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="199.079979" y="357.315328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="203.84921" y="359.961328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="203.84921" y="359.961328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="208.618441" y="363.363328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="208.618441" y="363.363328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="213.387672" y="365.631328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="213.387672" y="365.631328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="218.156902" y="368.385328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="218.156902" y="368.385328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="222.926133" y="371.031328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="222.926133" y="371.031328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="227.695364" y="373.569328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="227.695364" y="373.569328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="232.464595" y="376.215328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="232.464595" y="376.215328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="237.915144" y="378.807328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="237.915144" y="378.807328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="242.684375" y="380.481328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="242.684375" y="380.481328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="247.453606" y="381.561328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="247.453606" y="381.561328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="251.541518" y="382.641328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="251.541518" y="382.641328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="256.992067" y="384.207328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="256.992067" y="384.207328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="261.079979" y="385.341328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="261.079979" y="385.341328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="261.761298" y="385.557328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="261.761298" y="385.557328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="263.805254" y="386.853328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="263.805254" y="386.853328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="264.486573" y="387.231328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="264.486573" y="387.231328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="265.167891" y="387.609328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="265.167891" y="387.609328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="265.84921" y="387.987328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="265.84921" y="387.987328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="266.530529" y="388.311328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="266.530529" y="388.311328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="268.574485" y="388.851328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="268.574485" y="388.851328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="269.255804" y="389.013328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="269.255804" y="389.013328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="269.937122" y="389.175328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="269.937122" y="389.175328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="270.618441" y="389.337328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="270.618441" y="389.337328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="279.475584" y="393.117328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="279.475584" y="393.117328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="280.838221" y="393.711328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="280.838221" y="393.711328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="285.607452" y="395.493328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="285.607452" y="395.493328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="290.376683" y="397.491328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="290.376683" y="397.491328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="295.145913" y="399.057328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="295.145913" y="399.057328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="299.915144" y="400.515328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="299.915144" y="400.515328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="304.684375" y="402.135328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="304.684375" y="402.135328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="309.453606" y="403.755328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="309.453606" y="403.755328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="313.541518" y="405.051328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="313.541518" y="405.051328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="318.992067" y="406.077328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="318.992067" y="406.077328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="321.036023" y="406.563328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="321.036023" y="406.563328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="321.717342" y="406.725328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="321.717342" y="406.725328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="322.398661" y="406.887328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="322.398661" y="406.887328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="323.079979" y="407.049328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="323.079979" y="407.049328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="323.761298" y="407.211328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="323.761298" y="407.211328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="325.805254" y="407.697328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="325.805254" y="407.697328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="327.167891" y="408.021328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="327.167891" y="408.021328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="327.84921" y="408.183328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="327.84921" y="408.183328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="330.574485" y="408.831328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="330.574485" y="408.831328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="331.937122" y="409.155328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="331.937122" y="409.155328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="332.618441" y="409.317328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="332.618441" y="409.317328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="333.29976" y="409.425328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="333.29976" y="409.425328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="335.343716" y="409.749328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="335.343716" y="409.749328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="336.706353" y="409.965328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="336.706353" y="409.965328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="342.156902" y="410.829328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="342.156902" y="410.829328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="342.838221" y="410.991328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="342.838221" y="410.991328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="346.244815" y="411.531328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="346.244815" y="411.531328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="346.926133" y="411.639328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="346.926133" y="411.639328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="352.376683" y="412.503328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="352.376683" y="412.503328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="356.464595" y="413.151328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="356.464595" y="413.151328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="361.233826" y="413.907328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="361.233826" y="413.907328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="366.684375" y="414.771328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="366.684375" y="414.771328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="370.772287" y="415.419328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="370.772287" y="415.419328" style="fill: #ffffff; stroke: #000000"/>
<use xlink:href="#m587d138e69" x="375.541518" y="416.121328" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="375.541518" y="416.121328" style="fill: #ffffff; stroke: #000000"/>
</g> </g>
</g> </g>
<g id="patch_8"> <g id="patch_8">
@ -934,7 +934,7 @@ L 56.684375 189.321328
L 283.972287 189.321328 L 283.972287 189.321328
L 283.972287 529.521328 L 283.972287 529.521328
z z
" clip-path="url(#pdb9f71be6c)" style="fill: url(#hb8e50bd2d2); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> " clip-path="url(#pbc9021e9bd)" style="fill: url(#hbe012171af); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/>
</g> </g>
<g id="patch_9"> <g id="patch_9">
<path d="M 261.079979 529.521328 <path d="M 261.079979 529.521328
@ -942,7 +942,7 @@ L 261.079979 189.321328
L 283.972287 189.321328 L 283.972287 189.321328
L 283.972287 529.521328 L 283.972287 529.521328
z z
" clip-path="url(#pdb9f71be6c)" style="fill: url(#h606eb00241); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> " clip-path="url(#pbc9021e9bd)" style="fill: url(#h6625523e7f); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/>
</g> </g>
<g id="patch_10"> <g id="patch_10">
<path d="M 283.972287 484.161328 <path d="M 283.972287 484.161328
@ -953,7 +953,7 @@ L 56.684375 484.161058
L 277.595144 484.161058 L 277.595144 484.161058
L 277.595144 480.759328 L 277.595144 480.759328
z z
" clip-path="url(#pdb9f71be6c)" style="stroke: #000000; stroke-linejoin: miter"/> " clip-path="url(#pbc9021e9bd)" style="stroke: #000000; stroke-linejoin: miter"/>
</g> </g>
<g id="patch_11"> <g id="patch_11">
<path d="M 56.684375 484.161328 <path d="M 56.684375 484.161328
@ -964,7 +964,7 @@ L 283.972287 484.161598
L 63.061518 484.161598 L 63.061518 484.161598
L 63.061518 487.563328 L 63.061518 487.563328
z z
" clip-path="url(#pdb9f71be6c)" style="stroke: #000000; stroke-linejoin: miter"/> " clip-path="url(#pbc9021e9bd)" style="stroke: #000000; stroke-linejoin: miter"/>
</g> </g>
<g id="patch_12"> <g id="patch_12">
<path d="M 283.972287 506.841328 <path d="M 283.972287 506.841328
@ -975,7 +975,7 @@ L 261.079979 506.841058
L 277.595144 506.841058 L 277.595144 506.841058
L 277.595144 503.439328 L 277.595144 503.439328
z z
" clip-path="url(#pdb9f71be6c)" style="stroke: #000000; stroke-linejoin: miter"/> " clip-path="url(#pbc9021e9bd)" style="stroke: #000000; stroke-linejoin: miter"/>
</g> </g>
<g id="patch_13"> <g id="patch_13">
<path d="M 261.079979 506.841328 <path d="M 261.079979 506.841328
@ -986,7 +986,7 @@ L 283.972287 506.841598
L 267.457122 506.841598 L 267.457122 506.841598
L 267.457122 510.243328 L 267.457122 510.243328
z z
" clip-path="url(#pdb9f71be6c)" style="stroke: #000000; stroke-linejoin: miter"/> " clip-path="url(#pbc9021e9bd)" style="stroke: #000000; stroke-linejoin: miter"/>
</g> </g>
<g id="patch_14"> <g id="patch_14">
<path d="M 375.541518 314.061328 <path d="M 375.541518 314.061328
@ -997,7 +997,7 @@ L 283.972287 314.061058
L 369.164375 314.061058 L 369.164375 314.061058
L 369.164375 310.659328 L 369.164375 310.659328
z z
" clip-path="url(#pdb9f71be6c)" style="stroke: #000000; stroke-linejoin: miter"/> " clip-path="url(#pbc9021e9bd)" style="stroke: #000000; stroke-linejoin: miter"/>
</g> </g>
<g id="patch_15"> <g id="patch_15">
<path d="M 283.972287 314.061328 <path d="M 283.972287 314.061328
@ -1008,18 +1008,18 @@ L 375.541518 314.061598
L 290.34943 314.061598 L 290.34943 314.061598
L 290.34943 317.463328 L 290.34943 317.463328
z z
" clip-path="url(#pdb9f71be6c)" style="stroke: #000000; stroke-linejoin: miter"/> " clip-path="url(#pbc9021e9bd)" style="stroke: #000000; stroke-linejoin: miter"/>
</g> </g>
<g id="matplotlib.axis_3"> <g id="matplotlib.axis_3">
<g id="xtick_6"> <g id="xtick_6">
<g id="line2d_20"> <g id="line2d_20">
<path d="M 56.684375 529.521328 <path d="M 56.684375 529.521328
L 56.684375 189.321328 L 56.684375 189.321328
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_21"> <g id="line2d_21">
<g> <g>
<use xlink:href="#m2e2981a0fb" x="56.684375" y="529.521328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m49b08245b3" x="56.684375" y="529.521328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_11"> <g id="text_11">
@ -1033,11 +1033,11 @@ L 56.684375 189.321328
<g id="line2d_22"> <g id="line2d_22">
<path d="M 192.948111 529.521328 <path d="M 192.948111 529.521328
L 192.948111 189.321328 L 192.948111 189.321328
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_23"> <g id="line2d_23">
<g> <g>
<use xlink:href="#m2e2981a0fb" x="192.948111" y="529.521328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m49b08245b3" x="192.948111" y="529.521328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_12"> <g id="text_12">
@ -1053,11 +1053,11 @@ L 192.948111 189.321328
<g id="line2d_24"> <g id="line2d_24">
<path d="M 329.211848 529.521328 <path d="M 329.211848 529.521328
L 329.211848 189.321328 L 329.211848 189.321328
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_25"> <g id="line2d_25">
<g> <g>
<use xlink:href="#m2e2981a0fb" x="329.211848" y="529.521328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m49b08245b3" x="329.211848" y="529.521328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_13"> <g id="text_13">
@ -1073,11 +1073,11 @@ L 329.211848 189.321328
<g id="line2d_26"> <g id="line2d_26">
<path d="M 465.475584 529.521328 <path d="M 465.475584 529.521328
L 465.475584 189.321328 L 465.475584 189.321328
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_27"> <g id="line2d_27">
<g> <g>
<use xlink:href="#m2e2981a0fb" x="465.475584" y="529.521328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m49b08245b3" x="465.475584" y="529.521328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_14"> <g id="text_14">
@ -1093,11 +1093,11 @@ L 465.475584 189.321328
<g id="line2d_28"> <g id="line2d_28">
<path d="M 601.73932 529.521328 <path d="M 601.73932 529.521328
L 601.73932 189.321328 L 601.73932 189.321328
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_29"> <g id="line2d_29">
<g> <g>
<use xlink:href="#m2e2981a0fb" x="601.73932" y="529.521328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m49b08245b3" x="601.73932" y="529.521328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_15"> <g id="text_15">
@ -1186,11 +1186,11 @@ z
<g id="line2d_30"> <g id="line2d_30">
<path d="M 56.684375 513.321328 <path d="M 56.684375 513.321328
L 726.284375 513.321328 L 726.284375 513.321328
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_31"> <g id="line2d_31">
<g> <g>
<use xlink:href="#m3e2250e2fe" x="56.684375" y="513.321328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m5133ebe584" x="56.684375" y="513.321328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_17"> <g id="text_17">
@ -1216,11 +1216,11 @@ z
<g id="line2d_32"> <g id="line2d_32">
<path d="M 56.684375 459.321328 <path d="M 56.684375 459.321328
L 726.284375 459.321328 L 726.284375 459.321328
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_33"> <g id="line2d_33">
<g> <g>
<use xlink:href="#m3e2250e2fe" x="56.684375" y="459.321328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m5133ebe584" x="56.684375" y="459.321328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_18"> <g id="text_18">
@ -1237,11 +1237,11 @@ L 726.284375 459.321328
<g id="line2d_34"> <g id="line2d_34">
<path d="M 56.684375 405.321328 <path d="M 56.684375 405.321328
L 726.284375 405.321328 L 726.284375 405.321328
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_35"> <g id="line2d_35">
<g> <g>
<use xlink:href="#m3e2250e2fe" x="56.684375" y="405.321328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m5133ebe584" x="56.684375" y="405.321328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_19"> <g id="text_19">
@ -1258,11 +1258,11 @@ L 726.284375 405.321328
<g id="line2d_36"> <g id="line2d_36">
<path d="M 56.684375 351.321328 <path d="M 56.684375 351.321328
L 726.284375 351.321328 L 726.284375 351.321328
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_37"> <g id="line2d_37">
<g> <g>
<use xlink:href="#m3e2250e2fe" x="56.684375" y="351.321328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m5133ebe584" x="56.684375" y="351.321328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_20"> <g id="text_20">
@ -1279,11 +1279,11 @@ L 726.284375 351.321328
<g id="line2d_38"> <g id="line2d_38">
<path d="M 56.684375 297.321328 <path d="M 56.684375 297.321328
L 726.284375 297.321328 L 726.284375 297.321328
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_39"> <g id="line2d_39">
<g> <g>
<use xlink:href="#m3e2250e2fe" x="56.684375" y="297.321328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m5133ebe584" x="56.684375" y="297.321328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_21"> <g id="text_21">
@ -1300,11 +1300,11 @@ L 726.284375 297.321328
<g id="line2d_40"> <g id="line2d_40">
<path d="M 56.684375 243.321328 <path d="M 56.684375 243.321328
L 726.284375 243.321328 L 726.284375 243.321328
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_41"> <g id="line2d_41">
<g> <g>
<use xlink:href="#m3e2250e2fe" x="56.684375" y="243.321328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m5133ebe584" x="56.684375" y="243.321328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_22"> <g id="text_22">
@ -1337,11 +1337,11 @@ z
<g id="line2d_42"> <g id="line2d_42">
<path d="M 56.684375 189.321328 <path d="M 56.684375 189.321328
L 726.284375 189.321328 L 726.284375 189.321328
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/>
</g> </g>
<g id="line2d_43"> <g id="line2d_43">
<g> <g>
<use xlink:href="#m3e2250e2fe" x="56.684375" y="189.321328" style="stroke: #000000; stroke-width: 0.8"/> <use xlink:href="#m5133ebe584" x="56.684375" y="189.321328" style="stroke: #000000; stroke-width: 0.8"/>
</g> </g>
</g> </g>
<g id="text_23"> <g id="text_23">
@ -1414,63 +1414,63 @@ L 89.387672 243.792605
L 92.794265 247.641328 L 92.794265 247.641328
L 94.838221 250.525417 L 94.838221 250.525417
L 98.926133 255.92897 L 98.926133 255.92897
L 104.376683 262.465552 L 104.376683 262.465551
L 109.145913 267.644303 L 109.145913 267.644302
L 113.233826 271.734137 L 113.233826 271.734136
L 118.684375 276.748233 L 118.684375 276.748233
L 123.453606 280.772883 L 123.453606 280.772883
L 128.222837 284.499409 L 128.222837 284.499409
L 135.036023 289.369477 L 135.036023 289.369478
L 137.079979 290.736925 L 137.079979 290.736926
L 139.805254 298.887328 L 139.805254 298.887328
L 142.530529 302.983161 L 142.530529 302.983168
L 147.29976 309.665129 L 147.29976 309.665145
L 152.06899 315.797703 L 152.06899 315.797725
L 156.838221 321.448884 L 156.838221 321.44891
L 161.607452 326.675552 L 161.607452 326.675579
L 166.376683 331.525698 L 166.376683 331.525725
L 171.145913 336.040132 L 171.145913 336.040159
L 175.915144 340.253804 L 175.915144 340.253829
L 180.003056 343.649093 L 180.003056 343.649116
L 189.541518 350.888289 L 189.541518 350.888306
L 194.310749 354.191032 L 194.310749 354.191045
L 199.079979 357.307215 L 199.079979 357.307225
L 203.84921 360.252657 L 203.84921 360.252663
L 208.618441 363.041395 L 208.618441 363.041396
L 213.387672 365.685935 L 213.387672 365.685932
L 222.926133 370.585994 L 222.926133 370.585983
L 232.464595 375.029328 L 232.464595 375.029309
L 242.684375 379.353742 L 242.684375 379.353714
L 251.541518 382.783921 L 251.541518 382.783886
L 256.992067 384.764083 L 256.992067 384.764044
L 261.079979 385.341328 L 261.079979 385.341328
L 264.486573 387.078918 L 264.486573 387.078919
L 268.574485 388.91495 L 268.574485 388.914951
L 270.618441 389.760951 L 270.618441 389.760951
L 280.838221 393.520735 L 280.838221 393.520733
L 290.376683 396.559713 L 290.376683 396.559708
L 299.915144 399.293855 L 299.915144 399.293845
L 309.453606 401.79341 L 309.453606 401.793396
L 322.398661 404.883194 L 322.398661 404.883174
L 333.29976 407.259485 L 333.29976 407.259461
L 346.926133 409.98507 L 346.926133 409.985039
L 361.233826 412.595709 L 361.233826 412.595672
L 376.222837 415.093656 L 376.222837 415.093614
L 392.292323 417.539191 L 392.292323 417.539142
L 408.361809 419.776029 L 408.361809 419.775975
L 427.645192 422.221889 L 427.645192 422.221827
L 446.928575 424.442745 L 446.928575 424.442678
L 469.425856 426.789544 L 469.425856 426.78947
L 491.923136 428.910277 L 491.923136 428.910198
L 517.634314 431.097418 L 517.634314 431.097333
L 543.345492 433.068527 L 543.345492 433.068435
L 572.270567 435.065893 L 572.270567 435.065796
L 604.409539 437.052849 L 604.409539 437.052747
L 639.762408 439.000318 L 639.762408 439.00021
L 678.329175 440.886358 L 678.329175 440.886244
L 694.398661 441.608607 L 694.398661 441.608492
L 694.398661 441.608607 L 694.398661 441.608492
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/>
</g> </g>
<g id="line2d_45"> <g id="line2d_45">
<path d="M 261.079979 385.341328 <path d="M 261.079979 385.341328
@ -1497,7 +1497,7 @@ L 604.409539 419.473462
L 659.045791 420.398907 L 659.045791 420.398907
L 694.398661 420.893099 L 694.398661 420.893099
L 694.398661 420.893099 L 694.398661 420.893099
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #008000; stroke-width: 1.5"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #008000; stroke-width: 1.5"/>
</g> </g>
<g id="line2d_46"> <g id="line2d_46">
<path d="M 261.079979 385.341328 <path d="M 261.079979 385.341328
@ -1527,12 +1527,12 @@ L 620.479025 441.299597
L 655.831894 442.963769 L 655.831894 442.963769
L 694.398661 444.557189 L 694.398661 444.557189
L 694.398661 444.557189 L 694.398661 444.557189
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #ff0000; stroke-width: 1.5"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #ff0000; stroke-width: 1.5"/>
</g> </g>
<g id="line2d_47"> <g id="line2d_47">
<path d="M 375.541518 529.521328 <path d="M 375.541518 529.521328
L 375.541518 189.321328 L 375.541518 189.321328
" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #c0c0c0; stroke-width: 1.5"/> " clip-path="url(#pbc9021e9bd)" style="fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #c0c0c0; stroke-width: 1.5"/>
</g> </g>
<g id="patch_16"> <g id="patch_16">
<path d="M 56.684375 529.521328 <path d="M 56.684375 529.521328
@ -2031,7 +2031,7 @@ z
<use xlink:href="#DejaVuSans-6f" x="1151.261719"/> <use xlink:href="#DejaVuSans-6f" x="1151.261719"/>
<use xlink:href="#DejaVuSans-72" x="1212.443359"/> <use xlink:href="#DejaVuSans-72" x="1212.443359"/>
</g> </g>
<!-- Nonlinear + Step Loading: 3.294 --> <!-- Nonlinear + Step Loading: 3.326 -->
<g style="fill: #ff0000" transform="translate(498.151786 268.576828)scale(0.12 -0.12)"> <g style="fill: #ff0000" transform="translate(498.151786 268.576828)scale(0.12 -0.12)">
<defs> <defs>
<path id="DejaVuSans-3a" d="M 750 794 <path id="DejaVuSans-3a" d="M 750 794
@ -2053,36 +2053,6 @@ L 1344 0
L 684 0 L 684 0
L 684 794 L 684 794
z z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-39" d="M 703 97
L 703 672
Q 941 559 1184 500
Q 1428 441 1663 441
Q 2288 441 2617 861
Q 2947 1281 2994 2138
Q 2813 1869 2534 1725
Q 2256 1581 1919 1581
Q 1219 1581 811 2004
Q 403 2428 403 3163
Q 403 3881 828 4315
Q 1253 4750 1959 4750
Q 2769 4750 3195 4129
Q 3622 3509 3622 2328
Q 3622 1225 3098 567
Q 2575 -91 1691 -91
Q 1453 -91 1209 -44
Q 966 3 703 97
z
M 1959 2075
Q 2384 2075 2632 2365
Q 2881 2656 2881 3163
Q 2881 3666 2632 3958
Q 2384 4250 1959 4250
Q 1534 4250 1286 3958
Q 1038 3666 1038 3163
Q 1038 2656 1286 2365
Q 1534 2075 1959 2075
z
" transform="scale(0.015625)"/> " transform="scale(0.015625)"/>
</defs> </defs>
<use xlink:href="#DejaVuSans-4e"/> <use xlink:href="#DejaVuSans-4e"/>
@ -2113,11 +2083,11 @@ z
<use xlink:href="#DejaVuSans-20" x="1317.292969"/> <use xlink:href="#DejaVuSans-20" x="1317.292969"/>
<use xlink:href="#DejaVuSans-33" x="1349.080078"/> <use xlink:href="#DejaVuSans-33" x="1349.080078"/>
<use xlink:href="#DejaVuSans-2e" x="1412.703125"/> <use xlink:href="#DejaVuSans-2e" x="1412.703125"/>
<use xlink:href="#DejaVuSans-32" x="1444.490234"/> <use xlink:href="#DejaVuSans-33" x="1444.490234"/>
<use xlink:href="#DejaVuSans-39" x="1508.113281"/> <use xlink:href="#DejaVuSans-32" x="1508.113281"/>
<use xlink:href="#DejaVuSans-34" x="1571.736328"/> <use xlink:href="#DejaVuSans-36" x="1571.736328"/>
</g> </g>
<!-- Nonlinear Hyperbolic: 7.395 --> <!-- Nonlinear Hyperbolic: 7.231 -->
<g style="fill: #ff0000" transform="translate(526.218661 282.014203)scale(0.12 -0.12)"> <g style="fill: #ff0000" transform="translate(526.218661 282.014203)scale(0.12 -0.12)">
<defs> <defs>
<path id="DejaVuSans-37" d="M 525 4666 <path id="DejaVuSans-37" d="M 525 4666
@ -2155,11 +2125,11 @@ z
<use xlink:href="#DejaVuSans-20" x="1083.398438"/> <use xlink:href="#DejaVuSans-20" x="1083.398438"/>
<use xlink:href="#DejaVuSans-37" x="1115.185547"/> <use xlink:href="#DejaVuSans-37" x="1115.185547"/>
<use xlink:href="#DejaVuSans-2e" x="1178.808594"/> <use xlink:href="#DejaVuSans-2e" x="1178.808594"/>
<use xlink:href="#DejaVuSans-33" x="1210.595703"/> <use xlink:href="#DejaVuSans-32" x="1210.595703"/>
<use xlink:href="#DejaVuSans-39" x="1274.21875"/> <use xlink:href="#DejaVuSans-33" x="1274.21875"/>
<use xlink:href="#DejaVuSans-35" x="1337.841797"/> <use xlink:href="#DejaVuSans-31" x="1337.841797"/>
</g> </g>
<!-- Original Hyperbolic: 1.846 --> <!-- Original Hyperbolic: 1.708 -->
<g style="fill: #ff0000" transform="translate(537.129286 295.451578)scale(0.12 -0.12)"> <g style="fill: #ff0000" transform="translate(537.129286 295.451578)scale(0.12 -0.12)">
<use xlink:href="#DejaVuSans-4f"/> <use xlink:href="#DejaVuSans-4f"/>
<use xlink:href="#DejaVuSans-72" x="78.710938"/> <use xlink:href="#DejaVuSans-72" x="78.710938"/>
@ -2184,9 +2154,9 @@ z
<use xlink:href="#DejaVuSans-20" x="992.480469"/> <use xlink:href="#DejaVuSans-20" x="992.480469"/>
<use xlink:href="#DejaVuSans-31" x="1024.267578"/> <use xlink:href="#DejaVuSans-31" x="1024.267578"/>
<use xlink:href="#DejaVuSans-2e" x="1087.890625"/> <use xlink:href="#DejaVuSans-2e" x="1087.890625"/>
<use xlink:href="#DejaVuSans-38" x="1119.677734"/> <use xlink:href="#DejaVuSans-37" x="1119.677734"/>
<use xlink:href="#DejaVuSans-34" x="1183.300781"/> <use xlink:href="#DejaVuSans-30" x="1183.300781"/>
<use xlink:href="#DejaVuSans-36" x="1246.923828"/> <use xlink:href="#DejaVuSans-38" x="1246.923828"/>
</g> </g>
</g> </g>
<g id="text_29"> <g id="text_29">
@ -2256,7 +2226,7 @@ z
<use xlink:href="#DejaVuSans-6e" x="1647.046875"/> <use xlink:href="#DejaVuSans-6e" x="1647.046875"/>
<use xlink:href="#DejaVuSans-74" x="1710.425781"/> <use xlink:href="#DejaVuSans-74" x="1710.425781"/>
</g> </g>
<!-- Nonlinear + Step Loading: 2.105 --> <!-- Nonlinear + Step Loading: 3.537 -->
<g style="fill: #ff0000" transform="translate(498.151786 359.296828)scale(0.12 -0.12)"> <g style="fill: #ff0000" transform="translate(498.151786 359.296828)scale(0.12 -0.12)">
<use xlink:href="#DejaVuSans-4e"/> <use xlink:href="#DejaVuSans-4e"/>
<use xlink:href="#DejaVuSans-6f" x="74.804688"/> <use xlink:href="#DejaVuSans-6f" x="74.804688"/>
@ -2284,13 +2254,13 @@ z
<use xlink:href="#DejaVuSans-67" x="1220.125"/> <use xlink:href="#DejaVuSans-67" x="1220.125"/>
<use xlink:href="#DejaVuSans-3a" x="1283.601562"/> <use xlink:href="#DejaVuSans-3a" x="1283.601562"/>
<use xlink:href="#DejaVuSans-20" x="1317.292969"/> <use xlink:href="#DejaVuSans-20" x="1317.292969"/>
<use xlink:href="#DejaVuSans-32" x="1349.080078"/> <use xlink:href="#DejaVuSans-33" x="1349.080078"/>
<use xlink:href="#DejaVuSans-2e" x="1412.703125"/> <use xlink:href="#DejaVuSans-2e" x="1412.703125"/>
<use xlink:href="#DejaVuSans-31" x="1444.490234"/> <use xlink:href="#DejaVuSans-35" x="1444.490234"/>
<use xlink:href="#DejaVuSans-30" x="1508.113281"/> <use xlink:href="#DejaVuSans-33" x="1508.113281"/>
<use xlink:href="#DejaVuSans-35" x="1571.736328"/> <use xlink:href="#DejaVuSans-37" x="1571.736328"/>
</g> </g>
<!-- Nonlinear Hyperbolic: 11.345 --> <!-- Nonlinear Hyperbolic: 12.157 -->
<g style="fill: #ff0000" transform="translate(518.583661 372.734203)scale(0.12 -0.12)"> <g style="fill: #ff0000" transform="translate(518.583661 372.734203)scale(0.12 -0.12)">
<use xlink:href="#DejaVuSans-4e"/> <use xlink:href="#DejaVuSans-4e"/>
<use xlink:href="#DejaVuSans-6f" x="74.804688"/> <use xlink:href="#DejaVuSans-6f" x="74.804688"/>
@ -2315,13 +2285,13 @@ z
<use xlink:href="#DejaVuSans-3a" x="1049.707031"/> <use xlink:href="#DejaVuSans-3a" x="1049.707031"/>
<use xlink:href="#DejaVuSans-20" x="1083.398438"/> <use xlink:href="#DejaVuSans-20" x="1083.398438"/>
<use xlink:href="#DejaVuSans-31" x="1115.185547"/> <use xlink:href="#DejaVuSans-31" x="1115.185547"/>
<use xlink:href="#DejaVuSans-31" x="1178.808594"/> <use xlink:href="#DejaVuSans-32" x="1178.808594"/>
<use xlink:href="#DejaVuSans-2e" x="1242.431641"/> <use xlink:href="#DejaVuSans-2e" x="1242.431641"/>
<use xlink:href="#DejaVuSans-33" x="1274.21875"/> <use xlink:href="#DejaVuSans-31" x="1274.21875"/>
<use xlink:href="#DejaVuSans-34" x="1337.841797"/> <use xlink:href="#DejaVuSans-35" x="1337.841797"/>
<use xlink:href="#DejaVuSans-35" x="1401.464844"/> <use xlink:href="#DejaVuSans-37" x="1401.464844"/>
</g> </g>
<!-- Original Hyperbolic: -4.314 --> <!-- Original Hyperbolic: -2.758 -->
<g style="fill: #ff0000" transform="translate(532.799911 386.171578)scale(0.12 -0.12)"> <g style="fill: #ff0000" transform="translate(532.799911 386.171578)scale(0.12 -0.12)">
<defs> <defs>
<path id="DejaVuSans-2d" d="M 313 2009 <path id="DejaVuSans-2d" d="M 313 2009
@ -2354,11 +2324,11 @@ z
<use xlink:href="#DejaVuSans-3a" x="958.789062"/> <use xlink:href="#DejaVuSans-3a" x="958.789062"/>
<use xlink:href="#DejaVuSans-20" x="992.480469"/> <use xlink:href="#DejaVuSans-20" x="992.480469"/>
<use xlink:href="#DejaVuSans-2d" x="1024.267578"/> <use xlink:href="#DejaVuSans-2d" x="1024.267578"/>
<use xlink:href="#DejaVuSans-34" x="1060.351562"/> <use xlink:href="#DejaVuSans-32" x="1060.351562"/>
<use xlink:href="#DejaVuSans-2e" x="1123.974609"/> <use xlink:href="#DejaVuSans-2e" x="1123.974609"/>
<use xlink:href="#DejaVuSans-33" x="1155.761719"/> <use xlink:href="#DejaVuSans-37" x="1155.761719"/>
<use xlink:href="#DejaVuSans-31" x="1219.384766"/> <use xlink:href="#DejaVuSans-35" x="1219.384766"/>
<use xlink:href="#DejaVuSans-34" x="1283.007812"/> <use xlink:href="#DejaVuSans-38" x="1283.007812"/>
</g> </g>
</g> </g>
<g id="text_30"> <g id="text_30">
@ -2540,7 +2510,7 @@ z
</g> </g>
<g id="PathCollection_2"> <g id="PathCollection_2">
<g> <g>
<use xlink:href="#m587d138e69" x="356.2775" y="206.089453" style="fill: #ffffff; stroke: #000000"/> <use xlink:href="#mb1583126d7" x="356.2775" y="206.089453" style="fill: #ffffff; stroke: #000000"/>
</g> </g>
</g> </g>
<g id="text_31"> <g id="text_31">
@ -2661,15 +2631,15 @@ L 579.914375 222.653203
</g> </g>
</g> </g>
<defs> <defs>
<clipPath id="p5e92c73fb3"> <clipPath id="p400380a3d8">
<rect x="56.684375" y="30.561328" width="669.6" height="113.4"/> <rect x="56.684375" y="30.561328" width="669.6" height="113.4"/>
</clipPath> </clipPath>
<clipPath id="pdb9f71be6c"> <clipPath id="pbc9021e9bd">
<rect x="56.684375" y="189.321328" width="669.6" height="340.2"/> <rect x="56.684375" y="189.321328" width="669.6" height="340.2"/>
</clipPath> </clipPath>
</defs> </defs>
<defs> <defs>
<pattern id="hb8e50bd2d2" patternUnits="userSpaceOnUse" x="0" y="0" width="72" height="72"> <pattern id="hbe012171af" patternUnits="userSpaceOnUse" x="0" y="0" width="72" height="72">
<rect x="0" y="0" width="73" height="73" fill="#808080"/> <rect x="0" y="0" width="73" height="73" fill="#808080"/>
<path d="M -36 36 <path d="M -36 36
L 36 -36 L 36 -36
@ -2699,7 +2669,7 @@ M 36 108
L 108 36 L 108 36
" style="fill: #808080; stroke: #808080; stroke-width: 1.0; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 0.1"/> " style="fill: #808080; stroke: #808080; stroke-width: 1.0; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 0.1"/>
</pattern> </pattern>
<pattern id="h606eb00241" patternUnits="userSpaceOnUse" x="0" y="0" width="72" height="72"> <pattern id="h6625523e7f" patternUnits="userSpaceOnUse" x="0" y="0" width="72" height="72">
<rect x="0" y="0" width="73" height="73" fill="#808080"/> <rect x="0" y="0" width="73" height="73" fill="#808080"/>
<path d="M -36 36 <path d="M -36 36
L 36 108 L 36 108

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

After

Width:  |  Height:  |  Size: 174 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 157 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

After

Width:  |  Height:  |  Size: 172 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 100 KiB

View File

@ -1,397 +0,0 @@
"""
Title: Soft ground settlement prediction considering the step loading
Main Developer: Sang Inn Woo, Ph.D. @ Incheon National University
Starting Date: 2022-08-11
Abstract:
This main objective of this code is to predict
time vs. (consolidation) settlement of soft clay ground
under step loading conditions.
The methodologies used are 1) superposition of time-settlement curves
and 2) nonlinear regression for hyperbolic curves.
"""
# =================
# Import 섹션
# =================
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import least_squares
# =================
# Function 섹션
# =================
# 주어진 계수를 이용하여 쌍곡선 시간-침하 곡선 반환
def generate_data_hyper(px, pt):
return pt / (px[0] * pt + px[1])
# 회귀식과 측정치와의 잔차 반환 (비선형 쌍곡선)
def fun_hyper_nonlinear(px, pt, py):
return pt / (px[0] * pt + px[1]) - py
# 회귀식과 측정치와의 잔차 반환 (기존 쌍곡선)
def fun_hyper_original(px, pt, py):
return px[0] * pt + px[1] - pt / py
# RMSE 산정
def fun_rmse(py1, py2):
mse = np.square(np.subtract(py1, py2)).mean()
return np.sqrt(mse)
# ================================
# 파일 설정 / Pre-processing (임시)
# ================================
# 파일명 설정
#filename = "1_S-12.csv"
#filename = "1_SP-11.csv"
#filename = "1_SP-17.csv"
#filename = "1_SP-23.csv"
#filename = "3_SP3-65.csv"
#filename = "3_SP3-68.csv"
filename = "data/4_S-11.csv"
# 성토 단계 시작 index 리스트 초기화
step_start_index = []
# 성토 단계 끝 index + 1 리스트 초기화
step_end_index = []
# 파일명에 따라서, 성토 단계 index 설정
if filename == "1_S-12.csv":
step_start_index = [0, 56]
step_end_index = [56, 143]
elif filename == "1_SP-11.csv":
step_start_index = [0, 10, 37, 79]
step_end_index = [10, 37, 79, 124]
elif filename == "1_SP-17.csv":
step_start_index = [0, 122]
step_end_index = [122, 163]
elif filename == "1_SP-23.csv":
step_start_index = [0, 18, 40, 90]
step_end_index = [18, 40, 90, 124]
elif filename == "3_SP3-65.csv":
step_start_index = [0, 94, 136]
step_end_index = [ 94, 136, 182]
elif filename == "3_SP3-68.csv":
step_start_index = [0, 9, 48, 88]
step_end_index = [9, 48, 88, 127]
elif filename == "4_S-11.csv":
step_start_index = [0, 10, 46, 51, 120]
step_end_index = [10, 46, 51, 120, 157]
# 성토 단계 횟수 파악 및 저장
num_steps = len(step_start_index)
# ====================
# 파일 읽기, 데이터 설정
# ====================
# CSV 파일 읽기
data = pd.read_csv(filename)
# 시간, 침하량, 성토고 배열 생성
time = data['Time'].to_numpy()
settle = data['Settle'].to_numpy()
surcharge = data['Surcharge'].to_numpy()
# 마지막 계측 데이터 index + 1 파악
final_index = time.size
# =================
# 성토 단계 구분
# =================
# todo: 성토고 데이터를 분석하여, 각 단계 계측 시작 및 끝일에 해당하는 인덱스 파악 필요
# 꼭 이전 단계 마지막 인덱스와 현재 단계 처음 인덱스가 이어질 필요는 없음
# (각 단계별 시간, 침하를 초기화 한후 예측을 수행하므로...)
# ===========================
# 최종 단계 데이터 사용 범위 조정
# ===========================
# 최종 성토 단계의 데이터 사용 퍼센트 설정 : 사용자 입력값
final_step_predict_percent = 60
# 데이터 사용 퍼센트에 해당하는 기간 계산
final_step_end_date = time[-1]
final_step_start_date = time[step_start_index[num_steps - 1]]
final_step_period = final_step_end_date - final_step_start_date
final_step_predict_end_date = final_step_start_date + final_step_period * final_step_predict_percent / 100
# 데이터 사용 끝 시점 인덱스 초기화
final_step_predict_end_index = -1
# 데이터 사용 끝 시점 인덱스 검색
count = 0
for day in time:
count = count + 1
if day > final_step_predict_end_date:
final_step_predict_end_index = count - 1
break
# 마지막 성토 단계, 마지막 계측 시점 인덱스 업데이트
step_end_index[num_steps - 1] = final_step_predict_end_index
# =================
# 추가 예측 구간 반영
# =================
# 추가 예측 일 입력
add_days = time[-1]
# 마지막 성토고 및 마지막 계측일 저장
final_surcharge = surcharge[final_index - 1]
final_time = time[final_index - 1]
# 추가 시간 및 성토고 배열 설정 (100개의 시점 설정)
time_add = np.linspace(final_time + 1, final_time + add_days, 100)
surcharge_add = np.ones(100) * final_surcharge
# 기존 시간 및 성토고 배열에 붙이기
time = np.append(time, time_add)
surcharge = np.append(surcharge, surcharge_add)
# 마지막 인덱스값 재조정
final_index = time.size
# =============================
# Settlement Prediction (Step)
# =============================
# 예측 침하량 초기화
sp_step = np.zeros(time.size)
# 만일 계수 중에 하나가 음수가 나오면 에러 출력
error_step = 0
# 각 단계별로 진행
for i in range(0, num_steps):
# 각 단계별 계측 시점과 계측 침하량 배열 생성
tm_this_step = time[step_start_index[i]:step_end_index[i]]
sm_this_step = settle[step_start_index[i]:step_end_index[i]]
# 이전 단계까지 예측 침하량 중 현재 단계에 해당하는 부분 추출
sp_this_step = sp_step[step_start_index[i]:step_end_index[i]]
# 현재 단계 시작 부터 끝까지 시간 데이터 추출
tm_to_end = time[step_start_index[i]:final_index]
# 기존 예측 침하량에 대한 보정
sm_this_step = sm_this_step - sp_this_step
# 초기 시점 및 침하량 산정
t0_this_step = tm_this_step[0]
s0_this_step = sm_this_step[0]
# 초기 시점에 대한 시간 조정
tm_this_step = tm_this_step - t0_this_step
tm_to_end = tm_to_end - t0_this_step
# 초기 침하량에 대한 침하량 조정
sm_this_step = sm_this_step - s0_this_step
# 침하 곡선 계수 초기화
x0 = np.ones(2)
# 회귀분석 시행
res_lsq_hyper_nonlinear \
= least_squares(fun_hyper_nonlinear, x0, args=(tm_this_step, sm_this_step))
# 쌍곡선 계수 저장 및 출력
x_step = res_lsq_hyper_nonlinear.x
print(x_step)
# 만일 계수 중에 하나가 음수일 경우, 에러 메세지 출력하고 Break
#if x_step[0] < 0 or x_step[0] < 0 :
# print("More than one parameter is negative!")
# error_step = 1
# break
# 현재 단계 예측 침하량 산정 (침하 예측 끝까지)
sp_to_end_update = generate_data_hyper(x_step, tm_to_end)
# 예측 침하량 업데이트
sp_step[step_start_index[i]:final_index] = \
sp_step[step_start_index[i]:final_index] + sp_to_end_update + s0_this_step
# =========================================================
# Settlement prediction (nonliner and original hyperbolic)
# =========================================================
# 성토 마지막 데이터 추출
tm_hyper = time[step_start_index[num_steps-1]:step_end_index[num_steps-1]]
sm_hyper = settle[step_start_index[num_steps-1]:step_end_index[num_steps-1]]
# 현재 단계 시작 부터 끝까지 시간 데이터 추출
time_hyper = time[step_start_index[num_steps-1]:final_index]
# 초기 시점 및 침하량 산정
t0_hyper = tm_hyper[0]
s0_hyper = sm_hyper[0]
# 초기 시점에 대한 시간 조정
tm_hyper = tm_hyper - t0_hyper
time_hyper = time_hyper - t0_hyper
# 초기 침하량에 대한 침하량 조정
sm_hyper = sm_hyper - s0_hyper
# 회귀분석 시행 (비선형 쌍곡선)
x0 = np.ones(2)
res_lsq_hyper_nonlinear = least_squares(fun_hyper_nonlinear, x0,
args=(tm_hyper, sm_hyper))
# 비선형 쌍곡선 법 계수 저장 및 출력
x_hyper_nonlinear = res_lsq_hyper_nonlinear.x
print(x_hyper_nonlinear)
# 회귀분석 시행 (기존 쌍곡선법) - (0, 0)에 해당하는 초기 데이터를 제외하고 회귀분석 실시
x0 = np.ones(2)
res_lsq_hyper_original = least_squares(fun_hyper_original, x0,
args=(tm_hyper[1:], sm_hyper[1:]))
# 기존 쌍곡선 법 계수 저장 및 출력
x_hyper_original = res_lsq_hyper_original.x
print(x_hyper_original)
# 현재 단계 예측 침하량 산정 (침하 예측 끝까지)
sp_hyper_nonlinear = generate_data_hyper(x_hyper_nonlinear, time_hyper)
sp_hyper_original = generate_data_hyper(x_hyper_original, time_hyper)
# 예측 침하량 산정
sp_hyper_nonlinear = sp_hyper_nonlinear + s0_hyper
sp_hyper_original = sp_hyper_original + s0_hyper
time_hyper = time_hyper + t0_hyper
# ==========
# RSME 산정
# ==========
# RMSE 계산 데이터 구간 설정 (계측, 단계, 비선형 쌍곡선, 기존 쌍곡선)
sm_rmse = settle[step_start_index[num_steps - 1]:final_step_predict_end_index]
sp_step_rmse = sp_step[step_start_index[num_steps - 1]:final_step_predict_end_index]
sp_hyper_nonlinear_rmse = sp_hyper_nonlinear[:final_step_predict_end_index - step_start_index[num_steps - 1]]
sp_hyper_original_rmse = sp_hyper_original[:final_step_predict_end_index - step_start_index[num_steps - 1]]
# RMSE 산정 (단계, 비선형 쌍곡선, 기존 쌍곡선)
RMSE_step = fun_rmse(sm_rmse, sp_step_rmse)
RMSE_hyper_nonlinear = fun_rmse(sm_rmse, sp_hyper_nonlinear_rmse)
RMSE_hyper_original = fun_rmse(sm_rmse, sp_hyper_original_rmse)
# RMSE 출력 (단계, 비선형 쌍곡선, 기존 쌍곡선)
print("RMSE(Nonlinear Hyper + Step): %0.3f" %RMSE_step)
print("RMSE(Nonlinear Hyperbolic): %0.3f" %RMSE_hyper_nonlinear)
print("RMSE(Original Hyperbolic): %0.3f" %RMSE_hyper_original)
# =====================
# Post-Processing
# =====================
# 그래프 크기, 서브 그래프 개수 및 비율 설정
fig, axes = plt.subplots(2, 1, figsize=(10, 10),
gridspec_kw={'height_ratios':[1,2]})
# 성토고 그래프 표시
axes[0].plot(time, surcharge, color='black', label='surcharge height')
# 성토고 그래프 설정
axes[0].set_ylabel("Surcharge height (m)", fontsize=15)
axes[0].set_xlim(left=0)
axes[0].grid(color="gray", alpha=.5, linestyle='--')
axes[0].tick_params(direction='in')
# 계측 및 예측 침하량 표시
axes[1].scatter(time[0:settle.size], -settle, s=50, facecolors='white', edgecolors='black', label='measured data')
axes[1].plot(time, -sp_step, linestyle='-', color='blue', label='Nonlinear + Step Loading')
axes[1].plot(time_hyper, -sp_hyper_nonlinear,
linestyle='--', color='green', label='Nonlinear Hyperbolic')
axes[1].plot(time_hyper, -sp_hyper_original,
linestyle='--', color='red', label='Original Hyperbolic')
# 침하량 그래프 설정
axes[1].set_xlabel("Time (day)", fontsize=15)
axes[1].set_ylabel("Settlement (mm)", fontsize=15)
axes[1].set_ylim(top=0)
axes[1].set_ylim(bottom=-1.5 * settle.max())
axes[1].set_xlim(left=0)
axes[1].grid(color="gray", alpha=.5, linestyle='--')
axes[1].tick_params(direction='in')
# 범례 표시
axes[1].legend(loc=1, ncol=2, frameon=True, fontsize=12)
# 예측 데이터 사용 범위 음영 처리 - 단계성토
plt.axvspan(0, final_step_predict_end_date,
alpha=0.2, color='grey', hatch='///')
# 예측 데이터 사용 범위 음영 처리 - 기존 및 비선형 쌍곡선
plt.axvspan(final_step_start_date, final_step_predict_end_date,
alpha=0.2, color='grey', hatch='///')
# 예측 데이터 사용 범위 표시 화살표 세로 위치 설정
arrow1_y_loc = 1.3 * min(-settle)
arrow2_y_loc = 1.4 * min(-settle)
# 예측 데이터 사용 범위 화살표 처리 - 단계성토
axes[1].arrow(0, arrow1_y_loc, final_step_predict_end_date, 0,
head_width=10, color='black', length_includes_head='True')
axes[1].arrow(final_step_predict_end_date, arrow1_y_loc, -final_step_predict_end_date, 0,
head_width=10, color='black', length_includes_head='True')
# 예측 데이터 사용 범위 화살표 처리 - 기존 및 비선형 쌍곡선
axes[1].arrow(final_step_start_date, arrow2_y_loc,
final_step_predict_end_date - final_step_start_date, 0,
head_width=10, color='black', length_includes_head='True')
axes[1].arrow(final_step_predict_end_date, arrow2_y_loc,
final_step_start_date - final_step_predict_end_date, 0,
head_width=10, color='black', length_includes_head='True')
# Annotation 표시용 공간 설정
space = max(time) * 0.01
# 예측 데이터 사용 범위 범례 표시 - 단계성토
plt.annotate('Data Range Used (Nonlinear + Step Loading)', xy=(final_step_predict_end_date, arrow1_y_loc),
xytext=(final_step_predict_end_date + space, arrow1_y_loc),
horizontalalignment='left', verticalalignment='center')
# 예측 데이터 사용 범위 범례 표시 - 기존 및 비선형 쌍곡선
plt.annotate('Data Range Used (Nonlinear and Original Hyperbolic)', xy=(final_step_predict_end_date, arrow1_y_loc),
xytext=(final_step_predict_end_date + space, arrow2_y_loc),
horizontalalignment='left', verticalalignment='center')
# RMSE 출력
mybox = {'facecolor': 'white', 'edgecolor': 'black', 'boxstyle': 'round', 'alpha': 0.4}
plt.text(max(time), 0.25 * min(-settle),
" RMSE (Nonlinear + Step Loading) = %0.3f" % RMSE_step
+ "\n" + " RMSE (Nonlinear Hyperbolic) = %0.3f" % RMSE_hyper_nonlinear
+ "\n" + " RMSE (Original Hyperbolic) = %0.3f" % RMSE_hyper_original,
color='r', horizontalalignment='right',
verticalalignment='top', fontsize='12', bbox=mybox)
# 그래프 저장
plt.savefig('output.svg')
# 그래프 출력
plt.show()

View File

@ -1,244 +0,0 @@
# =================
# Import 섹션
# =================
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams
from scipy.optimize import least_squares
# =================
# Function 섹션
# =================
# 주어진 계수를 이용하여 쌍곡선 시간-침하 곡선 반환
def generate_data_hyper(px, pt):
return pt / (px[0] * pt + px[1])
# 회귀식과 측정치와의 잔차 반환 (비선형 쌍곡선)
def fun_hyper_nonlinear(px, pt, py):
return pt / (px[0] * pt + px[1]) - py
# 회귀식과 측정치와의 잔차 반환 (기존 쌍곡선)
def fun_hyper_original(px, pt, py):
return px[0] * pt + px[1] - pt / py
# RMSE 계산
def fun_rmse(py1, py2):
mse = np.square(np.subtract(py1, py2)). mean()
return np.sqrt(mse)
# =================
# 입력값 설정
# =================
# CSV 파일 읽기
data = pd.read_csv("4. S-11.csv")
# 시간, 침하량, 성토고 배열 생성
time = data['Time'].to_numpy()
settle = data['Settle'].to_numpy()
surcharge = data['Surcharge'].to_numpy()
# =================
# 성토 단계 구분
# =================
step_start_index = [0, 10, 46, 51, 120] # 성토 단계 시작 index
step_end_index = [10, 46, 51, 120, 139] # 실제 최종 성토 종료 index : 157
final_index = time.size # 마지만 계측 데이터 index + 1
num_steps = 5 # 성토 단계 횟수
# =================
# 추가 예측 구간 반영
# =================
# 추가 예측 일 입력
add_days = 500
# 마지막 성토고 및 마지막 계측일 저장
final_surcharge = surcharge[final_index - 1]
final_time = time[final_index -1]
# 추가 시간 및 성토고 배열 설정 (100개의 시점 설정)
time_add = np.linspace(final_time + 1, final_time + add_days, 100)
surcharge_add = np.ones(100) * final_surcharge
# 기존 시간 및 성토고 배열에 붙이기
time = np.append(time, time_add)
surcharge = np.append(surcharge, surcharge_add)
# 마지막 인덱스값 재조정
final_index = time.size
# =============================
# Settlement Prediction (Step)
# =============================
# 예측 침하량 초기화
sp = np.zeros(time.size)
# 각 단계별로 진행
for i in range(0, num_steps):
# 각 단계별 계측 시점과 계측 침하량 배열 생성
tm_this_step = time[step_start_index[i]:step_end_index[i]]
sm_this_step = settle[step_start_index[i]:step_end_index[i]]
# 이전 단계까지 예측 침하량 중 현재 단계에 해당하는 부분 추출
sp_this_step = sp[step_start_index[i]:step_end_index[i]]
# 현재 단계 시작 부터 끝까지 시간 데이터 추출
tm_to_end = time[step_start_index[i]:final_index]
# 기존 예측 침하량에 대한 보정
sm_this_step = sm_this_step - sp_this_step
# 초기 시점 및 침하량 산정
t0_this_step = tm_this_step[0]
s0_this_step = sm_this_step[0]
# 초기 시점에 대한 시간 조정
tm_this_step = tm_this_step - t0_this_step
tm_to_end = tm_to_end - t0_this_step
# 초기 침하량에 대한 침하량 조정
sm_this_step = sm_this_step - s0_this_step
# 침하 곡선 계수 초기화
x0 = np.ones(2)
# 회귀분석 시행
res_lsq_hyper_nonlinear \
= least_squares(fun_hyper_nonlinear, x0, args=(tm_this_step, sm_this_step))
# 쌍곡선 계수 저장 및 출력
x_step = res_lsq_hyper_nonlinear.x
print(x_step)
# 현재 단계 예측 침하량 산정 (침하 예측 끝까지)
sp_to_end_update = generate_data_hyper(x_step, tm_to_end)
# 예측 침하량 업데이트
sp[step_start_index[i]:final_index] = \
sp[step_start_index[i]:final_index] + sp_to_end_update + s0_this_step
# =========================================================
# Settlement prediction (nonliner and original hyperbolic)
# =========================================================
# 성토 마지막 데이터 추출
tm_hyper = time[step_start_index[num_steps-1]:step_end_index[num_steps-1]]
sm_hyper = settle[step_start_index[num_steps-1]:step_end_index[num_steps-1]]
# 현재 단계 시작 부터 끝까지 시간 데이터 추출
time_hyper = time[step_start_index[num_steps-1]:final_index]
# 초기 시점 및 침하량 산정
t0_hyper = tm_hyper[0]
s0_hyper = sm_hyper[0]
# 초기 시점에 대한 시간 조정
tm_hyper = tm_hyper - t0_hyper
time_hyper = time_hyper - t0_hyper
# 초기 침하량에 대한 침하량 조정
sm_hyper = sm_hyper - s0_hyper
# 회귀분석 시행 (비선형 쌍곡선)
x0 = np.ones(2)
res_lsq_hyper_nonlinear = least_squares(fun_hyper_nonlinear, x0,
args=(tm_hyper, sm_hyper))
# 비선형 쌍곡선 법 계수 저장 및 출력
x_hyper_nonlinear = res_lsq_hyper_nonlinear.x
print(x_hyper_nonlinear)
# 회귀분석 시행 (기존 쌍곡선법) - (0, 0)에 해당하는 초기 데이터를 제외하고 회귀분석 실시
x0 = np.ones(2)
res_lsq_hyper_original = least_squares(fun_hyper_original, x0,
args=(tm_hyper[1:], sm_hyper[1:]))
# 기존 쌍곡선 법 계수 저장 및 출력
x_hyper_original = res_lsq_hyper_original.x
print(x_hyper_original)
# 현재 단계 예측 침하량 산정 (침하 예측 끝까지)
sp_hyper_nonlinear = generate_data_hyper(x_hyper_nonlinear, time_hyper)
sp_hyper_original = generate_data_hyper(x_hyper_original, time_hyper)
# 예측 침하량 산정
sp_hyper_nonlinear = sp_hyper_nonlinear + s0_hyper
sp_hyper_original = sp_hyper_original + s0_hyper
time_hyper = time_hyper + t0_hyper
# 각 방법에 대한 RMSE 계산
RMSE_hyper_nonlinear_Step = fun_rmse(settle[step_start_index[-1]:step_end_index[-1]], sp_this_step)
RMSE_hyper_original = fun_rmse(settle[step_start_index[-1]:step_end_index[-1]], sp_hyper_original[0:(step_end_index[-1]-step_start_index[-1])])
RMSE_hyper_nonlinear = fun_rmse(settle[step_start_index[-1]:step_end_index[-1]], sp_hyper_nonlinear[0:(step_end_index[-1]-step_start_index[-1])])
# =====================
# Post-Processing
# =====================
# 그래프 크기, 서브 그래프 개수 및 비율 설정
fig, axes = plt.subplots(2, 1, figsize=(10, 10),
gridspec_kw={'height_ratios':[1,2]})
# 성토고 그래프 표시
axes[0].plot(time, surcharge, color='black', label='surcharge height')
# 성토고 그래프 설정
axes[0].set_ylabel("Surcharge height (m)", fontsize=17)
axes[0].set_xlim(left=0)
axes[0].grid(color="gray", alpha=.5, linestyle='--')
axes[0].tick_params(direction='in')
# 계측 및 예측 침하량 표시
axes[1].scatter(time[0:settle.size], -settle, s=50, facecolors='white', edgecolors='black', label='measured data')
axes[1].plot(time, -sp, linestyle='-', color='blue', label='Nonlinear + Step Loading')
axes[1].plot(time_hyper, -sp_hyper_nonlinear,
linestyle='--', color='green', label='Nonlinear Hyperbolic')
axes[1].plot(time_hyper, -sp_hyper_original,
linestyle='--', color='red', label='Original Hyperbolic')
# 침하량 그래프 설정
axes[1].set_xlabel("Time (day)", fontsize=15)
axes[1].set_ylabel("Settlement (mm)", fontsize=15)
axes[1].set_ylim(top=0)
axes[1].set_ylim(bottom=-1.5 * settle.max())
axes[1].set_xlim(left=0)
axes[1].grid(color="gray", alpha=.5, linestyle='--')
axes[1].tick_params(direction='in')
# 범례 표시
axes[1].legend(loc=1, ncol=2, frameon=True, fontsize=12)
# 침하예측 활용 구간 표시
axes[1].axvspan(time[step_start_index[-1]], time[step_end_index[-1]], alpha = 0.2, color = 'gray', hatch = '///')
axes[1].annotate('Date range used', xy=(time[step_end_index[-1]], min(-settle) * 0.5),
xytext=(time[step_end_index[-1]] + 20, min(-settle) * 0.8),
arrowprops=dict(facecolor='black', shrink=0.05),
horizontalalignment='left', verticalalignment='bottom')
# RMSE 박스 생성
mybox = {'facecolor':'red', 'edgecolor':'black', 'boxstyle':'round', 'alpha':0.4}
axes[1].text(0.015 * max(time), -1.4 * max(settle),
" RMSE(Hyperbolic(Nonlinear_Step)) = %0.3f " % RMSE_hyper_nonlinear_Step
+ "\n" + " RMSE(Hyperbolic(original)) = %0.3f " % RMSE_hyper_original
+ "\n" + " RMSE(Hyperbolic(Nonlinear)) = %0.3f " % RMSE_hyper_nonlinear,
color = 'r', horizontalalignment='left', verticalalignment='bottom',
fontsize='14', bbox=mybox)
# 그래프 저장
plt.savefig('4_S-11.svg')
# 그래프 출력
plt.show()

View File

@ -1,484 +0,0 @@
"""
Title: Soft ground settlement prediction considering the step loading
Main Developer: Sang Inn Woo, Ph.D. @ Incheon National University
Starting Date: 2022-08-11
Abstract:
This main objective of this code is to predict
time vs. (consolidation) settlement curves of soft clay ground
under step loading conditions.
The methodologies used are 1) superposition of time-settlement curves
and 2) nonlinear regression for hyperbolic curves.
"""
# TODO: Asaoka 법 코드 삽입
# =================
# Import 섹션
# =================
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import least_squares
# =================
# Function 섹션
# =================
# 주어진 계수를 이용하여 쌍곡선 시간-침하 곡선 반환
def generate_data_hyper(px, pt):
return pt / (px[0] * pt + px[1])
# 회귀식과 측정치와의 잔차 반환 (비선형 쌍곡선)
def fun_hyper_nonlinear(px, pt, py):
return pt / (px[0] * pt + px[1]) - py
# 회귀식과 측정치와의 잔차 반환 (기존 쌍곡선)
def fun_hyper_original(px, pt, py):
return px[0] * pt + px[1] - pt / py
# RMSE 산정
def fun_rmse(py1, py2):
mse = np.square(np.subtract(py1, py2)).mean()
return np.sqrt(mse)
# =================
# 파일 설정 / 입력값
# =================
# TODO: Argument를 이용해서 데이터 파일명을 입력 받도록 수정 필요
# 데이터 보관 폴더 및 결과 파일 저장 폴더 설정
data_folder_name = "data"
output_foler_name = "output"
# 파일명 설정
#filename = "1_S-12.csv"
#filename = "1_SP-11.csv"
#filename = "1_SP-17.csv"
#filename = "1_SP-23.csv"
#filename = "3_SP3-65.csv"
#filename = "3_SP3-68.csv"
filename = "4_S-11.csv"
#filename = "west_test_2_5_No_54.csv"
# 최종 성토 단계의 데이터 사용 퍼센트 설정 : 사용자 입력값
final_step_predict_percent = 20
# 추가 계측 구간 퍼센트 설정 : 사용자 입력값
additional_predict_percent = 100
# 성토 단계 시작 index 리스트 초기화
step_start_index = []
# 성토 단계 끝 index + 1 리스트 초기화
step_end_index = []
# TODO: 성토 단계를 분석해서 Step을 설정할 수 있도록 수정할 것
# 고려사항 1: 안정된 분석을 위해서는 성토 시작일로부터 얼마 후 데이터를 활용할 것인가? --> Buffer 설정
# 고려사항 2: 데이터 개수가 충분한가? --> 최소 데이터량 결정
# 고려사항 3: 시간-침하 곡선 형태가 직선이나 음의 곡률을 가질 경우, 어떻게 할 것인가 --> 회귀분석 불가 구역
# 고려사항 4: 상기 사항을 만족하지 않은 Step을 제외하고 분석을 수행할 수 있는가?
# 파일명에 따라서, 성토 단계 index 설정
if filename == "1_S-12.csv":
step_start_index = [0, 56]
step_end_index = [56, 143]
elif filename == "1_SP-11.csv":
step_start_index = [0, 10, 37, 79]
step_end_index = [10, 37, 79, 124]
elif filename == "1_SP-17.csv":
step_start_index = [0, 122]
step_end_index = [122, 163]
elif filename == "1_SP-23.csv":
step_start_index = [0, 18, 40, 90]
step_end_index = [18, 40, 90, 124]
elif filename == "3_SP3-65.csv":
step_start_index = [0, 94, 136]
step_end_index = [ 94, 136, 182]
elif filename == "3_SP3-68.csv":
step_start_index = [0, 9, 48, 88]
step_end_index = [9, 48, 88, 127]
elif filename == "4_S-11.csv":
step_start_index = [0, 10, 46, 51, 120]
step_end_index = [10, 46, 51, 120, 157]
elif filename == "west_test_2_5_No_54.csv":
step_start_index = [111, 195, 269, 287]
step_end_index = [195, 269, 287, 409]
# 성토 단계 횟수 파악 및 저장
num_steps = len(step_start_index)
# ====================
# 파일 읽기, 데이터 설정
# ====================
# CSV 파일 읽기
data = pd.read_csv(data_folder_name + '/' + filename)
# 시간, 침하량, 성토고 배열 생성
time = data['Time'].to_numpy()
settle = data['Settle'].to_numpy()
surcharge = data['Surcharge'].to_numpy()
# 마지막 계측 데이터 index + 1 파악
final_index = time.size
# =================
# 성토 단계 구분
# =================
# todo: 성토고 데이터를 분석하여, 각 단계 계측 시작 및 끝일에 해당하는 인덱스 파악 필요
# 꼭 이전 단계 마지막 인덱스와 현재 단계 처음 인덱스가 이어질 필요는 없음
# (각 단계별 시간, 침하를 초기화 한후 예측을 수행하므로...)
# ===========================
# 최종 단계 데이터 사용 범위 조정
# ===========================
# 데이터 사용 퍼센트에 해당하는 기간 계산
final_step_end_date = time[-1]
final_step_start_date = time[step_start_index[num_steps - 1]]
final_step_period = final_step_end_date - final_step_start_date
final_step_predict_end_date = final_step_start_date + final_step_period * final_step_predict_percent / 100
# 데이터 사용 끝 시점 인덱스 초기화
final_step_predict_end_index = -1
# 데이터 사용 끝 시점 인덱스 검색
count = 0
for day in time:
count = count + 1
if day > final_step_predict_end_date:
final_step_predict_end_index = count - 1
break
# 마지막 성토 단계, 마지막 계측 시점 인덱스 업데이트
final_step_monitor_end_index = step_end_index[num_steps - 1]
step_end_index[num_steps - 1] = final_step_predict_end_index
# =================
# 추가 예측 구간 반영
# =================
# 추가 예측 일 입력 (현재 전체 계측일 * 계수)
add_days = (additional_predict_percent / 100) * time[-1]
# 마지막 성토고 및 마지막 계측일 저장
final_surcharge = surcharge[final_index - 1]
final_time = time[final_index - 1]
# 추가 시간 및 성토고 배열 설정 (100개의 시점 설정)
time_add = np.linspace(final_time + 1, final_time + add_days, 100)
surcharge_add = np.ones(100) * final_surcharge
# 기존 시간 및 성토고 배열에 붙이기
time = np.append(time, time_add)
surcharge = np.append(surcharge, surcharge_add)
# 마지막 인덱스값 재조정
final_index = time.size
# =============================
# Settlement Prediction (Step)
# =============================
# 예측 침하량 초기화
sp_step = np.zeros(time.size)
# 만일 계수 중에 하나가 음수가 나오면 에러 출력
error_step = 0
# 각 단계별로 진행
for i in range(0, num_steps):
# 각 단계별 계측 시점과 계측 침하량 배열 생성
tm_this_step = time[step_start_index[i]:step_end_index[i]]
sm_this_step = settle[step_start_index[i]:step_end_index[i]]
# 이전 단계까지 예측 침하량 중 현재 단계에 해당하는 부분 추출
sp_this_step = sp_step[step_start_index[i]:step_end_index[i]]
# 현재 단계 시작 부터 끝까지 시간 데이터 추출
tm_to_end = time[step_start_index[i]:final_index]
# 기존 예측 침하량에 대한 보정
sm_this_step = sm_this_step - sp_this_step
# 초기 시점 및 침하량 산정
t0_this_step = tm_this_step[0]
s0_this_step = sm_this_step[0]
# 초기 시점에 대한 시간 조정
tm_this_step = tm_this_step - t0_this_step
tm_to_end = tm_to_end - t0_this_step
# 초기 침하량에 대한 침하량 조정
sm_this_step = sm_this_step - s0_this_step
# 침하 곡선 계수 초기화
x0 = np.ones(2)
# 회귀분석 시행
res_lsq_hyper_nonlinear \
= least_squares(fun_hyper_nonlinear, x0,
bounds=((0, 0),(np.inf, np.inf)),
args=(tm_this_step, sm_this_step))
# 쌍곡선 계수 저장 및 출력
x_step = res_lsq_hyper_nonlinear.x
print(x_step)
# 만일 계수 중에 하나가 음수일 경우, 에러 메세지 출력하고 Break
#if x_step[0] < 0 or x_step[0] < 0 :
# print("More than one parameter is negative!")
# error_step = 1
# break
# 현재 단계 예측 침하량 산정 (침하 예측 끝까지)
sp_to_end_update = generate_data_hyper(x_step, tm_to_end)
# 예측 침하량 업데이트
sp_step[step_start_index[i]:final_index] = \
sp_step[step_start_index[i]:final_index] + sp_to_end_update + s0_this_step
# =========================================================
# Settlement prediction (nonliner and original hyperbolic)
# =========================================================
# 성토 마지막 데이터 추출
tm_hyper = time[step_start_index[num_steps-1]:step_end_index[num_steps-1]]
sm_hyper = settle[step_start_index[num_steps-1]:step_end_index[num_steps-1]]
# 현재 단계 시작 부터 끝까지 시간 데이터 추출
time_hyper = time[step_start_index[num_steps-1]:final_index]
# 초기 시점 및 침하량 산정
t0_hyper = tm_hyper[0]
s0_hyper = sm_hyper[0]
# 초기 시점에 대한 시간 조정
tm_hyper = tm_hyper - t0_hyper
time_hyper = time_hyper - t0_hyper
# 초기 침하량에 대한 침하량 조정
sm_hyper = sm_hyper - s0_hyper
# 회귀분석 시행 (비선형 쌍곡선)
x0 = np.ones(2)
res_lsq_hyper_nonlinear = least_squares(fun_hyper_nonlinear, x0,
args=(tm_hyper, sm_hyper))
# 비선형 쌍곡선 법 계수 저장 및 출력
x_hyper_nonlinear = res_lsq_hyper_nonlinear.x
print(x_hyper_nonlinear)
# 회귀분석 시행 (기존 쌍곡선법) - (0, 0)에 해당하는 초기 데이터를 제외하고 회귀분석 실시
x0 = np.ones(2)
res_lsq_hyper_original = least_squares(fun_hyper_original, x0,
args=(tm_hyper[1:], sm_hyper[1:]))
# 기존 쌍곡선 법 계수 저장 및 출력
x_hyper_original = res_lsq_hyper_original.x
print(x_hyper_original)
# 현재 단계 예측 침하량 산정 (침하 예측 끝까지)
sp_hyper_nonlinear = generate_data_hyper(x_hyper_nonlinear, time_hyper)
sp_hyper_original = generate_data_hyper(x_hyper_original, time_hyper)
# 예측 침하량 산정
sp_hyper_nonlinear = sp_hyper_nonlinear + s0_hyper
sp_hyper_original = sp_hyper_original + s0_hyper
time_hyper = time_hyper + t0_hyper
# ==========
# 에러 산정
# ==========
# RMSE 계산 데이터 구간 설정 (계측)
sm_rmse = settle[final_step_predict_end_index:final_step_monitor_end_index]
# RMSE 계산 데이터 구간 설정 (단계)
sp_step_rmse = sp_step[final_step_predict_end_index:final_step_monitor_end_index]
# RMSE 계산 데이터 구간 설정 (쌍곡선)
sp_hyper_nonlinear_rmse = sp_hyper_nonlinear[final_step_predict_end_index - step_start_index[num_steps - 1]:
final_step_predict_end_index - step_start_index[num_steps - 1] +
final_step_monitor_end_index - final_step_predict_end_index]
sp_hyper_original_rmse = sp_hyper_original[final_step_predict_end_index - step_start_index[num_steps - 1]:
final_step_predict_end_index - step_start_index[num_steps - 1] +
final_step_monitor_end_index - final_step_predict_end_index]
# RMSE 산정 (단계, 비선형 쌍곡선, 기존 쌍곡선)
RMSE_step = fun_rmse(sm_rmse, sp_step_rmse)
RMSE_hyper_nonlinear = fun_rmse(sm_rmse, sp_hyper_nonlinear_rmse)
RMSE_hyper_original = fun_rmse(sm_rmse, sp_hyper_original_rmse)
# RMSE 출력 (단계, 비선형 쌍곡선, 기존 쌍곡선)
print("RMSE (Nonlinear Hyper + Step): %0.3f" %RMSE_step)
print("RMSE (Nonlinear Hyperbolic): %0.3f" %RMSE_hyper_nonlinear)
print("RMSE (Original Hyperbolic): %0.3f" %RMSE_hyper_original)
# (최종 계측 침하량 - 예측 침하량) 계산
final_error_step = settle[-1] - sp_step_rmse[-1]
final_error_hyper_nonlinear = settle[-1] - sp_hyper_nonlinear_rmse[-1]
final_error_hyper_original = settle[-1] - sp_hyper_original_rmse[-1]
# (최종 계측 침하량 - 예측 침하량) 출력 (단계, 비선형 쌍곡선, 기존 쌍곡선)
print("Error in Final Settlement (Nonlinear Hyper + Step): %0.3f" %final_error_step)
print("Error in Final Settlement (Nonlinear Hyperbolic): %0.3f" %final_error_hyper_nonlinear)
print("Error in Final Settlement (Original Hyperbolic): %0.3f" %final_error_hyper_original)
# =====================
# Post-Processing
# =====================
# 그래프 크기, 서브 그래프 개수 및 비율 설정
fig, axes = plt.subplots(2, 1, figsize=(12, 9),
gridspec_kw={'height_ratios':[1,3]})
# 성토고 그래프 표시
axes[0].plot(time, surcharge, color='black', label='surcharge height')
# 성토고 그래프 설정
axes[0].set_ylabel("Surcharge height (m)", fontsize=15)
axes[0].set_xlim(left=0)
axes[0].grid(color="gray", alpha=.5, linestyle='--')
axes[0].tick_params(direction='in')
# 계측 및 예측 침하량 표시
axes[1].scatter(time[0:settle.size], -settle, s=50, facecolors='white', edgecolors='black', label='measured data')
axes[1].plot(time[step_start_index[0]:], -sp_step[step_start_index[0]:], linestyle='-', color='blue', label='Nonlinear + Step Loading')
axes[1].plot(time_hyper, -sp_hyper_nonlinear,
linestyle='--', color='green', label='Nonlinear Hyperbolic')
axes[1].plot(time_hyper, -sp_hyper_original,
linestyle='--', color='red', label='Original Hyperbolic')
# 침하량 그래프 설정
axes[1].set_xlabel("Time (day)", fontsize=15)
axes[1].set_ylabel("Settlement (cm)", fontsize=15)
axes[1].set_ylim(top=0)
axes[1].set_ylim(bottom=-1.5 * settle.max())
axes[1].set_xlim(left=0)
axes[1].grid(color="gray", alpha=.5, linestyle='--')
axes[1].tick_params(direction='in')
# 범례 표시
axes[1].legend(loc=1, ncol=2, frameon=True, fontsize=12)
# 예측 데이터 사용 범위 음영 처리 - 단계성토
plt.axvspan(time[step_start_index[0]], final_step_predict_end_date,
alpha=0.1, color='grey', hatch='//')
# 예측 데이터 사용 범위 음영 처리 - 기존 및 비선형 쌍곡선
plt.axvspan(final_step_start_date, final_step_predict_end_date,
alpha=0.1, color='grey', hatch='\\')
# 예측 데이터 사용 범위 표시 화살표 세로 위치 설정
arrow1_y_loc = 1.3 * min(-settle)
arrow2_y_loc = 1.4 * min(-settle)
# 화살표 크기 설정
arrow_head_width = 0.03 * max(settle)
arrow_head_length = 0.01 * max(time)
# 예측 데이터 사용 범위 화살표 처리 - 단계성토
axes[1].arrow(time[step_start_index[0]], arrow1_y_loc,
final_step_predict_end_date - time[step_start_index[0]], 0,
head_width=arrow_head_width, head_length=arrow_head_length,
color='black', length_includes_head='True')
axes[1].arrow(final_step_predict_end_date, arrow1_y_loc,
time[step_start_index[0]] - final_step_predict_end_date, 0,
head_width=arrow_head_width, head_length=arrow_head_length,
color='black', length_includes_head='True')
# 예측 데이터 사용 범위 화살표 처리 - 기존 및 비선형 쌍곡선
axes[1].arrow(final_step_start_date, arrow2_y_loc,
final_step_predict_end_date - final_step_start_date, 0,
head_width=arrow_head_width, head_length=arrow_head_length,
color='black', length_includes_head='True')
axes[1].arrow(final_step_predict_end_date, arrow2_y_loc,
final_step_start_date - final_step_predict_end_date, 0,
head_width=arrow_head_width, head_length=arrow_head_length,
color='black', length_includes_head='True')
# Annotation 표시용 공간 설정
space = max(time) * 0.01
# 예측 데이터 사용 범위 범례 표시 - 단계성토
plt.annotate('Data Range Used (Nonlinear + Step Loading)', xy=(final_step_predict_end_date, arrow1_y_loc),
xytext=(final_step_predict_end_date + space, arrow1_y_loc),
horizontalalignment='left', verticalalignment='center')
# 예측 데이터 사용 범위 범례 표시 - 기존 및 비선형 쌍곡선
plt.annotate('Data Range Used (Nonlinear and Original Hyperbolic)', xy=(final_step_predict_end_date, arrow1_y_loc),
xytext=(final_step_predict_end_date + space, arrow2_y_loc),
horizontalalignment='left', verticalalignment='center')
# RMSE 산정 범위 표시 화살표 세로 위치 설정
arrow3_y_loc = 0.55 * min(-settle)
# RMSE 산정 범위 화살표 표시
axes[1].arrow(final_step_predict_end_date, arrow3_y_loc,
final_step_end_date - final_step_predict_end_date, 0,
head_width=arrow_head_width, head_length=arrow_head_length,
color='black', length_includes_head='True')
axes[1].arrow(final_step_end_date, arrow3_y_loc,
final_step_predict_end_date - final_step_end_date, 0,
head_width=arrow_head_width, head_length=arrow_head_length,
color='black', length_includes_head='True')
# RMSE 산정 범위 세로선 설정
axes[1].axvline(x=final_step_end_date, color='silver', linestyle=':')
# RMSE 산정 범위 범례 표시
plt.annotate('RMSE Estimation Section', xy=(final_step_end_date, arrow3_y_loc),
xytext=(final_step_end_date + space, arrow3_y_loc),
horizontalalignment='left', verticalalignment='center')
# RMSE 출력
mybox = {'facecolor': 'white', 'edgecolor': 'black', 'boxstyle': 'round', 'alpha': 0.2}
plt.text(max(time), 0.25 * min(-settle),
"Root Mean Squared Error"
+ "\n" + "Nonlinear + Step Loading: %0.3f" % RMSE_step
+ "\n" + "Nonlinear Hyperbolic: %0.3f" % RMSE_hyper_nonlinear
+ "\n" + "Original Hyperbolic: %0.3f" % RMSE_hyper_original,
color='r', horizontalalignment='right',
verticalalignment='top', fontsize='12', bbox=mybox)
# (최종 계측 침하량 - 예측값) 출력
plt.text(max(time), 0.65 * min(-settle),
"Error in Final Monitored Settlement"
+ "\n" + "Nonlinear + Step Loading: %0.3f" % final_error_step
+ "\n" + "Nonlinear Hyperbolic: %0.3f" % final_error_hyper_nonlinear
+ "\n" + "Original Hyperbolic: %0.3f" % final_error_hyper_original,
color='r', horizontalalignment='right',
verticalalignment='top', fontsize='12', bbox=mybox)
# 그래프 제목 표시
plt.title(filename + ": up to %i%% data used in the final step" % final_step_predict_percent)
# 그래프 저장 (SVG 및 PNG)
plt.savefig(output_foler_name + '/' + filename +' %i percent (SVG).svg' %final_step_predict_percent, bbox_inches='tight')
plt.savefig(output_foler_name + '/' + filename +' %i percent (PNG).png' %final_step_predict_percent, bbox_inches='tight')
# 그래프 출력
plt.show()

View File

@ -57,14 +57,12 @@ data_folder_name = "data"
output_foler_name = "output" output_foler_name = "output"
# 파일명 설정 # 파일명 설정
#filename = "1_S-12.csv" filename = "1_S-12.csv"
#filename = "1_SP-11.csv" #filename = "1_SP-11.csv"
#filename = "1_SP-17.csv"
#filename = "1_SP-23.csv" #filename = "1_SP-23.csv"
#filename = "3_SP3-65.csv" #filename = "3_SP3-65.csv"
#filename = "3_SP3-68.csv" #filename = "3_SP3-68.csv"
filename = "4_S-11.csv" #filename = "4_S-11.csv"
#filename = "west_test_2_5_No_54.csv"
# 최종 성토 단계의 데이터 사용 퍼센트 설정 : 사용자 입력값 # 최종 성토 단계의 데이터 사용 퍼센트 설정 : 사용자 입력값
final_step_predict_percent = 20 final_step_predict_percent = 20
@ -72,46 +70,14 @@ final_step_predict_percent = 20
# 추가 계측 구간 퍼센트 설정 : 사용자 입력값 # 추가 계측 구간 퍼센트 설정 : 사용자 입력값
additional_predict_percent = 100 additional_predict_percent = 100
# 성토 단계 시작 index 리스트 초기화 # 성토고 구분 버퍼값 : 사용자 입력값
step_start_index = [] step_date_buffer = 35
# 성토 단계 끝 index + 1 리스트 초기화 # 안정된 분석을 위해서는 충분히 많은 데이터가 필요함
step_end_index = [] # 성토 단계가 너무 짧을 경우, 데이터 개수가 충분치 않아 해석이 힘듦
# Buffer 설정: 최소 30일 이상의 방치 기간 필요 설정
# TODO: 성토 단계를 분석해서 Step을 설정할 수 있도록 수정할 것
# 고려사항 1: 안정된 분석을 위해서는 성토 시작일로부터 얼마 후 데이터를 활용할 것인가? --> Buffer 설정
# 고려사항 2: 데이터 개수가 충분한가? --> 최소 데이터량 결정
# 고려사항 3: 시간-침하 곡선 형태가 직선이나 음의 곡률을 가질 경우, 어떻게 할 것인가 --> 회귀분석 불가 구역
# 고려사항 4: 상기 사항을 만족하지 않은 Step을 제외하고 분석을 수행할 수 있는가?
# 파일명에 따라서, 성토 단계 index 설정
'''
if filename == "1_S-12.csv":
step_start_index = [0, 56]
step_end_index = [56, 143]
elif filename == "1_SP-11.csv":
step_start_index = [0, 10, 37, 79]
step_end_index = [10, 37, 79, 124]
elif filename == "1_SP-17.csv":
step_start_index = [0, 122]
step_end_index = [122, 163]
elif filename == "1_SP-23.csv":
step_start_index = [0, 18, 40, 90]
step_end_index = [18, 40, 90, 124]
elif filename == "3_SP3-65.csv":
step_start_index = [0, 94, 136]
step_end_index = [ 94, 136, 182]
elif filename == "3_SP3-68.csv":
step_start_index = [0, 9, 48, 88]
step_end_index = [9, 48, 88, 127]
elif filename == "4_S-11.csv":
step_start_index = [0, 10, 46, 51, 120]
step_end_index = [10, 46, 51, 120, 157]
elif filename == "west_test_2_5_No_54.csv":
step_start_index = [111, 195, 269, 287]
step_end_index = [195, 269, 287, 409]
'''
# ==================== # ====================
# 파일 읽기, 데이터 설정 # 파일 읽기, 데이터 설정
@ -129,29 +95,72 @@ surcharge = data['Surcharge'].to_numpy()
final_index = time.size final_index = time.size
# ================= # =================
# 성토 단계 구분 # 성토 단계 구분
# ================= # =================
# 성토 단계 index 생성 # 성토 단계 시작 index 리스트 초기화
current_surcharge = surcharge[0]
step_start_index = [0] step_start_index = [0]
start_index_counter = 0
# 성토 단계 끝 index 리스트 초기화
step_end_index = [] step_end_index = []
for index in range(len(surcharge)) : # 현재 성토고 설정
if surcharge[index]!=current_surcharge : current_surcharge = surcharge[0]
current_surcharge = surcharge[index]
step_start_index.append(index)
step_end_index.append(index)
start_index_counter = start_index_counter + 1
if index == len(surcharge) - 1: # 단계 시작 시점 초기화
step_end_index.append(index) step_start_date = 0
# 모든 시간-성토고 데이터에서 순차적으로 확인
for index in range(len(surcharge)):
# 만일 성토고의 변화가 있을 경우,
if surcharge[index] != current_surcharge:
# 현재 시간과 성토로를 설정
current_date = time[index]
current_surcharge = surcharge[index]
# 시간 SPAN이 30일 이상일 경우,
if current_date - step_start_date > step_date_buffer:
# Index를 추가함
step_end_index.append(index)
step_start_index.append(index)
# 단계 시작일 업데이트
step_start_date = current_date
# 마지막 성토 단계 끝 index 추가
step_end_index.append(len(surcharge) - 1)
# 성토 단계 횟수 파악 및 저장 # 성토 단계 횟수 파악 및 저장
num_steps = len(step_start_index) num_steps = len(step_start_index)
# TODO: 직접 파악한 성토 단계 index와 코드로 파악한 성토 단계 index 비교 필요
''' 직접 파악한 성토 단계 index
if filename == "1_S-12.csv":
step_start_index = [0, 56]
step_end_index = [56, 143]
elif filename == "1_SP-11.csv":
step_start_index = [0, 10, 37, 79]
step_end_index = [10, 37, 79, 124]
elif filename == "1_SP-23.csv":
step_start_index = [0, 18, 40, 90]
step_end_index = [18, 40, 90, 124]
elif filename == "3_SP3-65.csv":
step_start_index = [0, 94, 136]
step_end_index = [ 94, 136, 182]
elif filename == "3_SP3-68.csv":
step_start_index = [0, 9, 48, 88]
step_end_index = [9, 48, 88, 127]
elif filename == "4_S-11.csv":
step_start_index = [0, 10, 46, 51, 120]
step_end_index = [10, 46, 51, 120, 157]
'''
# =========================== # ===========================
# 최종 단계 데이터 사용 범위 조정 # 최종 단계 데이터 사용 범위 조정
# =========================== # ===========================