diff --git a/3_SP-68_Rev.4_Test.svg b/3_SP-68_Rev.4_Test.svg deleted file mode 100644 index 9701c30..0000000 --- a/3_SP-68_Rev.4_Test.svg +++ /dev/null @@ -1,2091 +0,0 @@ - - - - - - - - 2022-08-12T11:11:04.263402 - image/svg+xml - - - Matplotlib v3.5.2, https://matplotlib.org/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3_SP-68_Test.csv b/3_SP-68_Test.csv deleted file mode 100644 index b08d947..0000000 --- a/3_SP-68_Test.csv +++ /dev/null @@ -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 diff --git a/main.py b/main.py deleted file mode 100644 index 541d622..0000000 --- a/main.py +++ /dev/null @@ -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() \ No newline at end of file diff --git a/main_Rev.4.py b/main_Rev.4.py deleted file mode 100644 index 93456ab..0000000 --- a/main_Rev.4.py +++ /dev/null @@ -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() \ No newline at end of file diff --git a/main_Rev.4.svg b/main_Rev.4.svg deleted file mode 100644 index c96c296..0000000 --- a/main_Rev.4.svg +++ /dev/null @@ -1,2042 +0,0 @@ - - - - - - - - 2022-08-12T10:35:52.611400 - image/svg+xml - - - Matplotlib v3.5.2, https://matplotlib.org/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/output/1_S-12.csv 20 percent (PNG).png b/output/1_S-12.csv 20 percent (PNG).png index bade432..9e06f0d 100644 Binary files a/output/1_S-12.csv 20 percent (PNG).png and b/output/1_S-12.csv 20 percent (PNG).png differ diff --git a/output/1_S-12.csv 20 percent (SVG).svg b/output/1_S-12.csv 20 percent (SVG).svg index 660c487..30d5c5a 100644 --- a/output/1_S-12.csv 20 percent (SVG).svg +++ b/output/1_S-12.csv 20 percent (SVG).svg @@ -6,7 +6,7 @@ - 2022-08-13T16:42:52.724459 + 2022-10-08T17:48:49.142272 image/svg+xml @@ -42,16 +42,16 @@ z +" clip-path="url(#p32547601c9)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - - + @@ -88,11 +88,11 @@ z +" clip-path="url(#p32547601c9)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -124,11 +124,11 @@ z +" clip-path="url(#p32547601c9)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -170,11 +170,11 @@ z +" clip-path="url(#p32547601c9)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -224,11 +224,11 @@ z +" clip-path="url(#p32547601c9)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -265,11 +265,11 @@ z +" clip-path="url(#p32547601c9)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -312,11 +312,11 @@ z +" clip-path="url(#p32547601c9)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -364,11 +364,11 @@ z +" clip-path="url(#p32547601c9)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -396,11 +396,11 @@ z +" clip-path="url(#p32547601c9)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -459,16 +459,16 @@ z +" clip-path="url(#p32547601c9)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - - + @@ -482,11 +482,11 @@ L 3.5 0 +" clip-path="url(#p32547601c9)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -500,11 +500,11 @@ L 726.284375 78.500638 +" clip-path="url(#p32547601c9)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -843,7 +843,7 @@ L 179.08925 85.223958 L 182.111592 35.715874 L 694.398661 35.715874 L 694.398661 35.715874 -" clip-path="url(#p5f2d136376)" style="fill: none; stroke: #000000; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#p32547601c9)" style="fill: none; stroke: #000000; stroke-width: 1.5; stroke-linecap: square"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1041,7 +1041,7 @@ L 56.684375 189.321328 L 220.797577 189.321328 L 220.797577 529.521328 z -" clip-path="url(#p6179dd4652)" style="fill: url(#h7a2763fd04); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> +" clip-path="url(#p966a53241b)" style="fill: url(#h47399f6684); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> +" clip-path="url(#p966a53241b)" style="fill: url(#h96486c74f0); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> +" clip-path="url(#p966a53241b)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p966a53241b)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p966a53241b)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p966a53241b)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p966a53241b)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p966a53241b)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1140,11 +1140,11 @@ L 56.684375 189.321328 +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1160,11 +1160,11 @@ L 132.24294 189.321328 +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1180,11 +1180,11 @@ L 207.801504 189.321328 +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1200,11 +1200,11 @@ L 283.360069 189.321328 +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1220,11 +1220,11 @@ L 358.918634 189.321328 +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1240,11 +1240,11 @@ L 434.477198 189.321328 +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1260,11 +1260,11 @@ L 510.035763 189.321328 +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1280,11 +1280,11 @@ L 585.594328 189.321328 +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1373,11 +1373,11 @@ z +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1403,11 +1403,11 @@ z +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1424,11 +1424,11 @@ L 726.284375 448.225438 +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1445,11 +1445,11 @@ L 726.284375 383.49941 +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1466,11 +1466,11 @@ L 726.284375 318.773383 +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1486,11 +1486,11 @@ L 726.284375 254.047356 +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1551,28 +1551,28 @@ z +L 219.135289 370.444049 +L 224.424389 373.608401 +L 229.713488 376.52231 +L 237.269345 380.326199 +L 245.580787 384.110441 +L 253.892229 387.552089 +L 261.448085 390.43235 +L 269.003942 393.110063 +L 279.582141 396.566877 +L 290.16034 399.731981 +L 301.494124 402.847258 +L 311.316738 405.346977 +L 324.91728 408.542091 +L 337.762236 411.31246 +L 351.362777 414.018515 +L 367.230076 416.918289 +L 382.723398 419.516691 +L 398.789133 421.998873 +L 418.068015 424.728708 +L 437.346897 427.222204 +L 456.62578 429.509942 +L 479.117809 431.952406 +L 501.609838 434.182206 +L 527.315015 436.504887 +L 556.233338 438.869657 +L 585.151661 441.008545 +L 617.283132 443.158067 +L 652.627749 445.286439 +L 691.185514 447.368486 +L 694.398661 447.531917 +L 694.398661 447.531917 +" clip-path="url(#p966a53241b)" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #008000; stroke-width: 1.5"/> +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #ff0000; stroke-width: 1.5"/> +" clip-path="url(#p966a53241b)" style="fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #c0c0c0; stroke-width: 1.5"/> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2316,11 +2318,11 @@ z - + - + - + @@ -2346,7 +2348,7 @@ z - + @@ -2417,7 +2419,7 @@ z - + - + - - - + + + - + @@ -2488,11 +2490,11 @@ z - - - + + + - + @@ -2517,9 +2519,9 @@ z - - - + + + @@ -2679,7 +2681,7 @@ z - + @@ -2800,15 +2802,15 @@ L 579.914375 222.653203 - + - + - + - + - 2022-08-13T16:43:23.737532 + 2022-10-08T17:48:32.470325 image/svg+xml @@ -42,16 +42,16 @@ z +" clip-path="url(#pd20c6449e5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - - + @@ -88,11 +88,11 @@ z +" clip-path="url(#pd20c6449e5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -124,11 +124,11 @@ z +" clip-path="url(#pd20c6449e5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -170,11 +170,11 @@ z +" clip-path="url(#pd20c6449e5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -224,11 +224,11 @@ z +" clip-path="url(#pd20c6449e5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -265,11 +265,11 @@ z +" clip-path="url(#pd20c6449e5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -312,11 +312,11 @@ z +" clip-path="url(#pd20c6449e5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -364,11 +364,11 @@ z +" clip-path="url(#pd20c6449e5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -396,11 +396,11 @@ z +" clip-path="url(#pd20c6449e5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -459,16 +459,16 @@ z +" clip-path="url(#pd20c6449e5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - - + @@ -482,11 +482,11 @@ L 3.5 0 +" clip-path="url(#pd20c6449e5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -500,11 +500,11 @@ L 726.284375 78.500638 +" clip-path="url(#pd20c6449e5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -843,7 +843,7 @@ L 179.08925 85.223958 L 182.111592 35.715874 L 694.398661 35.715874 L 694.398661 35.715874 -" clip-path="url(#p83c9fa1c68)" style="fill: none; stroke: #000000; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#pd20c6449e5)" style="fill: none; stroke: #000000; stroke-width: 1.5; stroke-linecap: square"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1041,7 +1041,7 @@ L 56.684375 189.321328 L 336.855533 189.321328 L 336.855533 529.521328 z -" clip-path="url(#p685a436bc6)" style="fill: url(#hacfdcbd5f8); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> +" clip-path="url(#p6ceb44119b)" style="fill: url(#hf421842565); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> +" clip-path="url(#p6ceb44119b)" style="fill: url(#h95f795b249); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> +" clip-path="url(#p6ceb44119b)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p6ceb44119b)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p6ceb44119b)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p6ceb44119b)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p6ceb44119b)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p6ceb44119b)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1140,11 +1140,11 @@ L 56.684375 189.321328 +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1160,11 +1160,11 @@ L 132.24294 189.321328 +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1180,11 +1180,11 @@ L 207.801504 189.321328 +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1200,11 +1200,11 @@ L 283.360069 189.321328 +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1220,11 +1220,11 @@ L 358.918634 189.321328 +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1240,11 +1240,11 @@ L 434.477198 189.321328 +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1260,11 +1260,11 @@ L 510.035763 189.321328 +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1280,11 +1280,11 @@ L 585.594328 189.321328 +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1373,11 +1373,11 @@ z +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1403,11 +1403,11 @@ z +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1424,11 +1424,11 @@ L 726.284375 448.225438 +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1445,11 +1445,11 @@ L 726.284375 383.49941 +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1466,11 +1466,11 @@ L 726.284375 318.773383 +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1486,11 +1486,11 @@ L 726.284375 254.047356 +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1551,71 +1551,71 @@ z +L 219.135289 370.365432 +L 224.424389 373.583833 +L 229.713488 376.549364 +L 237.269345 380.421959 +L 242.558444 382.917805 +L 250.869886 386.540403 +L 258.425743 389.562841 +L 266.737185 392.635059 +L 272.026284 394.469491 +L 282.604483 397.893102 +L 293.182682 401.031675 +L 303.760881 403.925555 +L 314.33908 406.606677 +L 327.184036 409.613124 +L 340.784578 412.537143 +L 353.629534 415.085301 +L 369.496833 417.983604 +L 385.936545 420.732952 +L 402.00228 423.202674 +L 421.281162 425.919764 +L 440.560044 428.402472 +L 459.838927 430.681011 +L 482.330956 433.114387 +L 504.822985 435.336549 +L 530.528162 437.651946 +L 559.446485 440.010011 +L 588.364808 442.143461 +L 620.496279 444.288125 +L 655.840896 446.412297 +L 694.398661 448.490834 +L 694.398661 448.490834 +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #008000; stroke-width: 1.5"/> +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #ff0000; stroke-width: 1.5"/> +" clip-path="url(#p6ceb44119b)" style="fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #c0c0c0; stroke-width: 1.5"/> - + - - - + + + @@ -2293,7 +2293,7 @@ z - + @@ -2319,8 +2319,8 @@ z - - + + @@ -2390,7 +2390,7 @@ z - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2519,11 +2517,11 @@ z - + - - - + + + @@ -2683,7 +2681,7 @@ z - + @@ -2804,15 +2802,15 @@ L 579.914375 222.653203 - + - + - + - + - 2022-08-13T16:51:38.196337 + 2022-10-08T17:44:39.058006 image/svg+xml @@ -42,16 +42,16 @@ z +" 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"/> - - + @@ -88,11 +88,11 @@ z +" 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"/> - + @@ -134,11 +134,11 @@ z +" 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"/> - + @@ -175,11 +175,11 @@ z +" 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"/> - + @@ -227,11 +227,11 @@ z +" 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"/> - + @@ -290,16 +290,16 @@ z +" 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"/> - - + @@ -313,11 +313,11 @@ L 3.5 0 +" 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"/> - + @@ -365,11 +365,11 @@ z +" 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"/> - + @@ -383,11 +383,11 @@ L 726.284375 70.189298 +" 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"/> - + @@ -755,7 +755,7 @@ L 256.992067 67.581833 L 261.079979 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"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -934,7 +934,7 @@ L 56.684375 189.321328 L 283.972287 189.321328 L 283.972287 529.521328 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"/> +" clip-path="url(#pbc9021e9bd)" style="fill: url(#h6625523e7f); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> +" clip-path="url(#pbc9021e9bd)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pbc9021e9bd)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pbc9021e9bd)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pbc9021e9bd)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pbc9021e9bd)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pbc9021e9bd)" style="stroke: #000000; stroke-linejoin: miter"/> +" 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"/> - + @@ -1033,11 +1033,11 @@ L 56.684375 189.321328 +" 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"/> - + @@ -1053,11 +1053,11 @@ L 192.948111 189.321328 +" 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"/> - + @@ -1073,11 +1073,11 @@ L 329.211848 189.321328 +" 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"/> - + @@ -1093,11 +1093,11 @@ L 465.475584 189.321328 +" 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"/> - + @@ -1186,11 +1186,11 @@ z +" 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"/> - + @@ -1216,11 +1216,11 @@ z +" 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"/> - + @@ -1237,11 +1237,11 @@ L 726.284375 459.321328 +" 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"/> - + @@ -1258,11 +1258,11 @@ L 726.284375 405.321328 +" 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"/> - + @@ -1279,11 +1279,11 @@ L 726.284375 351.321328 +" 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"/> - + @@ -1300,11 +1300,11 @@ L 726.284375 297.321328 +" 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"/> - + @@ -1337,11 +1337,11 @@ z +" 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"/> - + @@ -1414,63 +1414,63 @@ L 89.387672 243.792605 L 92.794265 247.641328 L 94.838221 250.525417 L 98.926133 255.92897 -L 104.376683 262.465552 -L 109.145913 267.644303 -L 113.233826 271.734137 +L 104.376683 262.465551 +L 109.145913 267.644302 +L 113.233826 271.734136 L 118.684375 276.748233 L 123.453606 280.772883 L 128.222837 284.499409 -L 135.036023 289.369477 -L 137.079979 290.736925 +L 135.036023 289.369478 +L 137.079979 290.736926 L 139.805254 298.887328 -L 142.530529 302.983161 -L 147.29976 309.665129 -L 152.06899 315.797703 -L 156.838221 321.448884 -L 161.607452 326.675552 -L 166.376683 331.525698 -L 171.145913 336.040132 -L 175.915144 340.253804 -L 180.003056 343.649093 -L 189.541518 350.888289 -L 194.310749 354.191032 -L 199.079979 357.307215 -L 203.84921 360.252657 -L 208.618441 363.041395 -L 213.387672 365.685935 -L 222.926133 370.585994 -L 232.464595 375.029328 -L 242.684375 379.353742 -L 251.541518 382.783921 -L 256.992067 384.764083 +L 142.530529 302.983168 +L 147.29976 309.665145 +L 152.06899 315.797725 +L 156.838221 321.44891 +L 161.607452 326.675579 +L 166.376683 331.525725 +L 171.145913 336.040159 +L 175.915144 340.253829 +L 180.003056 343.649116 +L 189.541518 350.888306 +L 194.310749 354.191045 +L 199.079979 357.307225 +L 203.84921 360.252663 +L 208.618441 363.041396 +L 213.387672 365.685932 +L 222.926133 370.585983 +L 232.464595 375.029309 +L 242.684375 379.353714 +L 251.541518 382.783886 +L 256.992067 384.764044 L 261.079979 385.341328 -L 264.486573 387.078918 -L 268.574485 388.91495 +L 264.486573 387.078919 +L 268.574485 388.914951 L 270.618441 389.760951 -L 280.838221 393.520735 -L 290.376683 396.559713 -L 299.915144 399.293855 -L 309.453606 401.79341 -L 322.398661 404.883194 -L 333.29976 407.259485 -L 346.926133 409.98507 -L 361.233826 412.595709 -L 376.222837 415.093656 -L 392.292323 417.539191 -L 408.361809 419.776029 -L 427.645192 422.221889 -L 446.928575 424.442745 -L 469.425856 426.789544 -L 491.923136 428.910277 -L 517.634314 431.097418 -L 543.345492 433.068527 -L 572.270567 435.065893 -L 604.409539 437.052849 -L 639.762408 439.000318 -L 678.329175 440.886358 -L 694.398661 441.608607 -L 694.398661 441.608607 -" clip-path="url(#pdb9f71be6c)" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/> +L 280.838221 393.520733 +L 290.376683 396.559708 +L 299.915144 399.293845 +L 309.453606 401.793396 +L 322.398661 404.883174 +L 333.29976 407.259461 +L 346.926133 409.985039 +L 361.233826 412.595672 +L 376.222837 415.093614 +L 392.292323 417.539142 +L 408.361809 419.775975 +L 427.645192 422.221827 +L 446.928575 424.442678 +L 469.425856 426.78947 +L 491.923136 428.910198 +L 517.634314 431.097333 +L 543.345492 433.068435 +L 572.270567 435.065796 +L 604.409539 437.052747 +L 639.762408 439.00021 +L 678.329175 440.886244 +L 694.398661 441.608492 +L 694.398661 441.608492 +" clip-path="url(#pbc9021e9bd)" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#pbc9021e9bd)" 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: #ff0000; 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"/> - + - @@ -2113,11 +2083,11 @@ z - - - + + + - + - - - + + + - + @@ -2184,9 +2154,9 @@ z - - - + + + @@ -2256,7 +2226,7 @@ z - + @@ -2284,13 +2254,13 @@ z - + - - - + + + - + @@ -2315,13 +2285,13 @@ z - + - - - + + + - + - + - - - + + + @@ -2540,7 +2510,7 @@ z - + @@ -2661,15 +2631,15 @@ L 579.914375 222.653203 - + - + - + - + - 2022-08-13T16:54:23.311722 + 2022-10-08T17:45:05.264843 image/svg+xml @@ -42,16 +42,16 @@ z +" clip-path="url(#paa5e2f473b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - - + @@ -88,11 +88,11 @@ z +" clip-path="url(#paa5e2f473b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -159,11 +159,11 @@ z +" clip-path="url(#paa5e2f473b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -179,11 +179,11 @@ L 231.688295 30.561328 +" clip-path="url(#paa5e2f473b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -211,11 +211,11 @@ z +" clip-path="url(#paa5e2f473b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -248,11 +248,11 @@ z +" clip-path="url(#paa5e2f473b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -269,11 +269,11 @@ L 494.194176 30.561328 +" clip-path="url(#paa5e2f473b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -290,11 +290,11 @@ L 581.696136 30.561328 +" clip-path="url(#paa5e2f473b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -313,16 +313,16 @@ L 669.198096 30.561328 +" clip-path="url(#paa5e2f473b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - - + @@ -336,11 +336,11 @@ L 3.5 0 +" clip-path="url(#paa5e2f473b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -388,11 +388,11 @@ z +" clip-path="url(#paa5e2f473b)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -754,7 +754,7 @@ L 270.189158 73.897692 L 273.339228 35.715874 L 694.398661 35.715874 L 694.398661 35.715874 -" clip-path="url(#p6cd61f36af)" style="fill: none; stroke: #000000; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#paa5e2f473b)" style="fill: none; stroke: #000000; stroke-width: 1.5; stroke-linecap: square"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -972,7 +972,7 @@ L 56.684375 189.321328 L 293.779686 189.321328 L 293.779686 529.521328 z -" clip-path="url(#p75ac32dab8)" style="fill: url(#heac56bc0cf); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> +" clip-path="url(#pa785f6afa5)" style="fill: url(#h1e4f73e2a2); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> +" clip-path="url(#pa785f6afa5)" style="fill: url(#h2a2474a220); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> +" clip-path="url(#pa785f6afa5)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pa785f6afa5)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pa785f6afa5)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pa785f6afa5)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pa785f6afa5)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pa785f6afa5)" style="stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1071,11 +1071,11 @@ L 56.684375 189.321328 +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1091,11 +1091,11 @@ L 144.186335 189.321328 +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1111,11 +1111,11 @@ L 231.688295 189.321328 +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1131,11 +1131,11 @@ L 319.190256 189.321328 +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1152,11 +1152,11 @@ L 406.692216 189.321328 +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1173,11 +1173,11 @@ L 494.194176 189.321328 +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1194,11 +1194,11 @@ L 581.696136 189.321328 +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1288,11 +1288,11 @@ z +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1348,11 +1348,11 @@ z +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1369,11 +1369,11 @@ L 726.284375 451.821328 +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1390,11 +1390,11 @@ L 726.284375 399.321328 +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1411,11 +1411,11 @@ L 726.284375 346.821328 +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1432,11 +1432,11 @@ L 726.284375 294.321328 +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1453,11 +1453,11 @@ L 726.284375 241.821328 +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + @@ -1558,42 +1558,23 @@ L 249.888703 391.216076 L 262.838993 393.559598 L 270.189158 394.78451 L 273.339228 394.596328 -L 279.63937 396.105889 -L 285.239495 397.656865 -L 290.139605 399.353848 -L 292.239652 400.261049 -L 295.039715 401.76833 -L 297.489769 403.560923 -L 299.589816 405.751117 -L 304.839934 421.448374 -L 306.939981 460.792262 -L 309.740044 338.868662 -L 312.190099 375.671614 -L 314.290146 383.539544 -L 316.390193 387.460574 -L 319.190256 390.483384 -L 321.64031 392.195365 -L 324.090365 393.458477 -L 326.54042 394.451698 -L 328.990475 395.269375 -L 333.890585 396.575178 -L 338.440687 397.544294 -L 345.440844 398.769812 -L 355.591071 400.216199 -L 368.191353 401.703422 -L 382.326013 403.127939 -L 398.412232 404.54234 -L 417.715695 406.03277 -L 440.236401 407.558491 -L 465.974352 409.085851 -L 494.929546 410.587602 -L 527.101984 412.04265 -L 565.708909 413.553056 -L 607.533078 414.959322 -L 655.791735 416.347993 -L 694.398661 417.314113 -L 694.398661 417.314113 -" clip-path="url(#p75ac32dab8)" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/> +L 288.039558 398.680096 +L 299.589816 401.730306 +L 316.390193 405.953423 +L 335.640624 410.527236 +L 355.591071 415.017459 +L 375.891526 419.368222 +L 398.412232 423.979268 +L 424.150183 429.017753 +L 453.105377 434.442958 +L 485.277814 440.224671 +L 520.667496 446.342102 +L 559.274422 452.782331 +L 601.098591 459.538646 +L 649.357248 467.107009 +L 694.398661 473.994631 +L 694.398661 473.994631 +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #008000; stroke-width: 1.5"/> +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #ff0000; stroke-width: 1.5"/> +" clip-path="url(#pa785f6afa5)" style="fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #c0c0c0; stroke-width: 1.5"/> - @@ -2227,8 +2208,8 @@ z - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2350,14 +2360,14 @@ z - - + + - - - + + + - + @@ -2381,12 +2391,12 @@ z - + - + - + @@ -2456,8 +2466,17 @@ z - - + + + + + @@ -2484,14 +2503,14 @@ z - - - - - - + + + + + + - + @@ -2517,13 +2536,13 @@ z - + - - - + + + - + @@ -2547,12 +2566,12 @@ z - - + + - - - + + + @@ -2586,13 +2605,6 @@ L 1259 0 L 628 0 L 628 4666 z -" transform="scale(0.015625)"/> - - + @@ -2862,15 +2874,15 @@ L 579.914375 222.653203 - + - + - + - + - - + - + - 2022-08-26T18:00:08.576115 + 2022-10-08T17:44:29.502590 image/svg+xml - Matplotlib v3.3.4, https://matplotlib.org/ + Matplotlib v3.5.2, https://matplotlib.org/ - + @@ -27,7 +26,7 @@ L 733.484375 568.416641 L 733.484375 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> @@ -36,328 +35,331 @@ L 726.284375 143.961328 L 726.284375 30.561328 L 56.684375 30.561328 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - +" clip-path="url(#pf03d611d6f)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - +" style="stroke: #000000; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - + - +" clip-path="url(#pf03d611d6f)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - - - + + + - +" clip-path="url(#pf03d611d6f)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - - - + + + - +" clip-path="url(#pf03d611d6f)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - - - + + + - +" clip-path="url(#pf03d611d6f)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - - - + + + - +" clip-path="url(#pf03d611d6f)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - - - - + + + + - +" clip-path="url(#pf03d611d6f)" 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(#pf03d611d6f)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - - - - + + + + @@ -365,120 +367,121 @@ L 704.579876 30.561328 - +" clip-path="url(#pf03d611d6f)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - +" style="stroke: #000000; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - + - +" clip-path="url(#pf03d611d6f)" 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(#pf03d611d6f)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - + @@ -486,316 +489,325 @@ z - - + - + - + - + - + - + - + - - + + - + - + - + - + +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - +" clip-path="url(#pf03d611d6f)" style="fill: none; stroke: #000000; stroke-width: 1.5; stroke-linecap: square"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> @@ -836,11 +848,11 @@ L 726.284375 529.521328 L 726.284375 189.321328 L 56.684375 189.321328 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - +" style="stroke: #000000"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - +" clip-path="url(#p53935d1454)" style="fill: url(#hc1d13d0633); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> - +" clip-path="url(#p53935d1454)" style="fill: url(#h71e9b64098); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> - +" clip-path="url(#p53935d1454)" style="stroke: #000000; stroke-linejoin: miter"/> - +" clip-path="url(#p53935d1454)" style="stroke: #000000; stroke-linejoin: miter"/> - +" clip-path="url(#p53935d1454)" style="stroke: #000000; stroke-linejoin: miter"/> - +" clip-path="url(#p53935d1454)" style="stroke: #000000; stroke-linejoin: miter"/> - +" clip-path="url(#p53935d1454)" style="stroke: #000000; stroke-linejoin: miter"/> - +" clip-path="url(#p53935d1454)" style="stroke: #000000; stroke-linejoin: miter"/> - +" clip-path="url(#p53935d1454)" 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(#p53935d1454)" 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(#p53935d1454)" 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(#p53935d1454)" 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(#p53935d1454)" 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(#p53935d1454)" 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(#p53935d1454)" 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(#p53935d1454)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - - - - + + + + @@ -1260,252 +1272,256 @@ L 704.579876 189.321328 - - + - + +" transform="scale(0.015625)"/> - - - - - - - - - - + + + + + + + + + + - +" clip-path="url(#p53935d1454)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - - + +" transform="scale(0.015625)"/> - - - - + + + + - +" clip-path="url(#p53935d1454)" 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(#p53935d1454)" 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(#p53935d1454)" 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(#p53935d1454)" 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(#p53935d1454)" 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(#p53935d1454)" 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(#p53935d1454)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - + @@ -1513,52 +1529,53 @@ L 726.284375 189.321328 - - + +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - +L 264.010935 394.323189 +L 268.175978 395.417525 +L 276.968845 397.322741 +L 287.15006 399.29208 +L 299.182405 401.392694 +L 312.140315 403.42911 +L 325.561008 405.329785 +L 343.146743 407.550076 +L 361.19526 409.562054 +L 379.220405 411.346858 +L 398.517033 413.049208 +L 421.029765 414.807715 +L 446.758603 416.569284 +L 472.48744 418.113206 +L 501.432382 419.63694 +L 533.593428 421.11339 +L 568.970579 422.523691 +L 610.77994 423.958563 +L 655.805405 425.280147 +L 694.398661 426.264588 +L 694.398661 426.264588 +" clip-path="url(#p53935d1454)" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/> - +" clip-path="url(#p53935d1454)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #008000; stroke-width: 1.5"/> - +" clip-path="url(#p53935d1454)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #ff0000; stroke-width: 1.5"/> - +" clip-path="url(#p53935d1454)" style="fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #c0c0c0; stroke-width: 1.5"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - - + - + - + - + - + - + - + - + +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + - + +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - +" style="fill: #ffffff; opacity: 0.2; stroke: #000000; stroke-linejoin: miter"/> - + - +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + - +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2326,446 +2358,453 @@ Q 480.845536 333.141328 480.845536 336.741328 L 480.845536 388.667203 Q 480.845536 392.267203 484.445536 392.267203 z -" style="fill:#ffffff;opacity:0.2;stroke:#000000;stroke-linejoin:miter;"/> +" style="fill: #ffffff; opacity: 0.2; stroke: #000000; stroke-linejoin: miter"/> - + - +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + - + - + - + +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/> - + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + +" 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"/> diff --git a/output/4_S-11.csv 80 percent (PNG).png b/output/4_S-11.csv 80 percent (PNG).png index cd39fc6..6dae7e1 100644 Binary files a/output/4_S-11.csv 80 percent (PNG).png and b/output/4_S-11.csv 80 percent (PNG).png differ diff --git a/output/4_S-11.csv 80 percent (SVG).svg b/output/4_S-11.csv 80 percent (SVG).svg index c317c43..8a7631a 100644 --- a/output/4_S-11.csv 80 percent (SVG).svg +++ b/output/4_S-11.csv 80 percent (SVG).svg @@ -1,24 +1,23 @@ - - + - + - 2022-08-16T16:19:48.655775 + 2022-10-08T17:47:17.745254 image/svg+xml - Matplotlib v3.3.4, https://matplotlib.org/ + Matplotlib v3.5.2, https://matplotlib.org/ - + @@ -27,7 +26,7 @@ L 733.484375 568.416641 L 733.484375 0 L 0 0 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> @@ -36,328 +35,331 @@ L 726.284375 143.961328 L 726.284375 30.561328 L 56.684375 30.561328 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - +" clip-path="url(#p77dfa51f6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - +" style="stroke: #000000; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - + - +" clip-path="url(#p77dfa51f6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - - - + + + - +" clip-path="url(#p77dfa51f6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - - - + + + - +" clip-path="url(#p77dfa51f6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - - - + + + - +" clip-path="url(#p77dfa51f6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - - - + + + - +" clip-path="url(#p77dfa51f6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - - - - + + + + - +" clip-path="url(#p77dfa51f6c)" 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(#p77dfa51f6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - - - - + + + + @@ -365,120 +367,121 @@ L 704.579876 30.561328 - +" clip-path="url(#p77dfa51f6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - +" style="stroke: #000000; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - + - +" clip-path="url(#p77dfa51f6c)" 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(#p77dfa51f6c)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - +" transform="scale(0.015625)"/> - + @@ -486,316 +489,325 @@ z - - + - + - + - + - + - + - + - - + + - + - + - + - + +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - +" clip-path="url(#p77dfa51f6c)" style="fill: none; stroke: #000000; stroke-width: 1.5; stroke-linecap: square"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> @@ -836,11 +848,11 @@ L 726.284375 529.521328 L 726.284375 189.321328 L 56.684375 189.321328 z -" style="fill:#ffffff;"/> +" style="fill: #ffffff"/> - +" style="stroke: #000000"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - +" clip-path="url(#p223da99e21)" style="fill: url(#h7499ac9b09); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> - +" clip-path="url(#p223da99e21)" style="fill: url(#haa56b60bae); opacity: 0.1; stroke: #808080; stroke-linejoin: miter"/> - +" clip-path="url(#p223da99e21)" style="stroke: #000000; stroke-linejoin: miter"/> - +" clip-path="url(#p223da99e21)" style="stroke: #000000; stroke-linejoin: miter"/> - +" clip-path="url(#p223da99e21)" style="stroke: #000000; stroke-linejoin: miter"/> - +" clip-path="url(#p223da99e21)" style="stroke: #000000; stroke-linejoin: miter"/> - +" clip-path="url(#p223da99e21)" style="stroke: #000000; stroke-linejoin: miter"/> - +" clip-path="url(#p223da99e21)" style="stroke: #000000; stroke-linejoin: miter"/> - +" clip-path="url(#p223da99e21)" 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(#p223da99e21)" 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(#p223da99e21)" 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(#p223da99e21)" 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(#p223da99e21)" 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(#p223da99e21)" 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(#p223da99e21)" 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(#p223da99e21)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - - - - + + + + @@ -1260,252 +1272,256 @@ L 704.579876 189.321328 - - + - + +" transform="scale(0.015625)"/> - - - - - - - - - - + + + + + + + + + + - +" clip-path="url(#p223da99e21)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - - + +" transform="scale(0.015625)"/> - - - - + + + + - +" clip-path="url(#p223da99e21)" 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(#p223da99e21)" 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(#p223da99e21)" 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(#p223da99e21)" 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(#p223da99e21)" 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(#p223da99e21)" 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(#p223da99e21)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #808080; stroke-opacity: 0.5; stroke-width: 0.8"/> - + - + @@ -1513,52 +1529,53 @@ L 726.284375 189.321328 - - + +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - +L 268.175978 395.759957 +L 276.968845 398.706739 +L 283.910583 400.804007 +L 294.091798 403.57722 +L 302.421883 405.620184 +L 312.140315 407.787561 +L 323.247095 410.022824 +L 333.42831 411.879322 +L 345.923438 413.944244 +L 357.955783 415.742633 +L 371.376475 417.561189 +L 388.868719 419.680898 +L 408.165347 421.745422 +L 427.461975 423.572633 +L 449.974707 425.457052 +L 472.48744 427.120936 +L 498.216277 428.799954 +L 527.161219 430.455559 +L 559.322265 432.059121 +L 594.699417 433.590828 +L 633.292672 435.038214 +L 678.318137 436.49111 +L 694.398661 436.958522 +L 694.398661 436.958522 +" clip-path="url(#p223da99e21)" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/> - +" clip-path="url(#p223da99e21)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #008000; stroke-width: 1.5"/> - +" clip-path="url(#p223da99e21)" style="fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #ff0000; stroke-width: 1.5"/> - +" clip-path="url(#p223da99e21)" style="fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #c0c0c0; stroke-width: 1.5"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> +" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - - + - + - + - + - + - + - + - + +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + - + +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + @@ -2131,202 +2156,176 @@ Q 494.551786 242.421328 494.551786 246.021328 L 494.551786 297.947203 Q 494.551786 301.547203 498.151786 301.547203 z -" style="fill:#ffffff;opacity:0.2;stroke:#000000;stroke-linejoin:miter;"/> +" style="fill: #ffffff; opacity: 0.2; stroke: #000000; stroke-linejoin: miter"/> - + - +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + - +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2341,449 +2340,487 @@ Q 480.845536 333.141328 480.845536 336.741328 L 480.845536 388.667203 Q 480.845536 392.267203 484.445536 392.267203 z -" style="fill:#ffffff;opacity:0.2;stroke:#000000;stroke-linejoin:miter;"/> +" style="fill: #ffffff; opacity: 0.2; stroke: #000000; stroke-linejoin: miter"/> - + - +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + - + - + +" transform="scale(0.015625)"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/> - + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + +" 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"/> diff --git a/settle_prediction_steps.py b/settle_prediction_steps.py deleted file mode 100644 index f4214d2..0000000 --- a/settle_prediction_steps.py +++ /dev/null @@ -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() \ No newline at end of file diff --git a/settle_prediction_steps_Rev.1.py b/settle_prediction_steps_Rev.1.py deleted file mode 100644 index e10488c..0000000 --- a/settle_prediction_steps_Rev.1.py +++ /dev/null @@ -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() \ No newline at end of file diff --git a/settle_prediction_steps_no_touch.py b/settle_prediction_steps_no_touch.py deleted file mode 100644 index 31a39c1..0000000 --- a/settle_prediction_steps_no_touch.py +++ /dev/null @@ -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() \ No newline at end of file diff --git a/settle_prediction_steps_20220921(SS).py b/settle_prediction_steps_v0.5.py similarity index 92% rename from settle_prediction_steps_20220921(SS).py rename to settle_prediction_steps_v0.5.py index 181d012..2fe0314 100644 --- a/settle_prediction_steps_20220921(SS).py +++ b/settle_prediction_steps_v0.5.py @@ -57,14 +57,12 @@ data_folder_name = "data" output_foler_name = "output" # 파일명 설정 -#filename = "1_S-12.csv" +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" +#filename = "4_S-11.csv" # 최종 성토 단계의 데이터 사용 퍼센트 설정 : 사용자 입력값 final_step_predict_percent = 20 @@ -72,46 +70,14 @@ final_step_predict_percent = 20 # 추가 계측 구간 퍼센트 설정 : 사용자 입력값 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 + # ================= # 성토 단계 구분 # ================= -# 성토 단계 index 생성 -current_surcharge = surcharge[0] +# 성토 단계 시작 index 리스트 초기화 step_start_index = [0] -start_index_counter = 0 + +# 성토 단계 끝 index 리스트 초기화 step_end_index = [] -for index in range(len(surcharge)) : - if surcharge[index]!=current_surcharge : - current_surcharge = surcharge[index] - step_start_index.append(index) - step_end_index.append(index) - start_index_counter = start_index_counter + 1 +# 현재 성토고 설정 +current_surcharge = surcharge[0] - 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) +# 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] +''' + + + # =========================== # 최종 단계 데이터 사용 범위 조정 # ===========================