From SW's laptop
parent
55aa83ba9c
commit
a85ca0bf79
203
Asaoka.py
203
Asaoka.py
|
|
@ -1,203 +0,0 @@
|
||||||
|
|
||||||
# =================
|
|
||||||
# Import 섹션
|
|
||||||
# =================
|
|
||||||
|
|
||||||
import os.path
|
|
||||||
import numpy as np
|
|
||||||
import pandas as pd
|
|
||||||
import matplotlib.pyplot as plt
|
|
||||||
from scipy.optimize import least_squares
|
|
||||||
from scipy.interpolate import interp1d
|
|
||||||
|
|
||||||
# =================
|
|
||||||
# Function 섹션
|
|
||||||
# =================
|
|
||||||
|
|
||||||
# 주어진 계수를 이용하여 아사오카법 기반 시간-침하 곡선 반환
|
|
||||||
def generate_data_asaoka(px, pt, dt):
|
|
||||||
return (px[1] / (1 - px[0])) * (1 - (px[0] ** (pt / dt)))
|
|
||||||
|
|
||||||
# 아사오카법 목표 함수
|
|
||||||
def fun_asaoka(px, ps_b, ps_a):
|
|
||||||
return px[0] * ps_b + px[1] - ps_a
|
|
||||||
|
|
||||||
|
|
||||||
# ====================
|
|
||||||
# 파일 읽기, 데이터 설정
|
|
||||||
# ====================
|
|
||||||
|
|
||||||
# CSV 파일 읽기
|
|
||||||
data = pd.read_csv("data/2-6_J-01.csv")
|
|
||||||
|
|
||||||
# 시간, 침하량, 성토고 배열 생성
|
|
||||||
time = data['Time'].to_numpy()
|
|
||||||
settle = data['Settlement'].to_numpy()
|
|
||||||
surcharge = data['Surcharge'].to_numpy()
|
|
||||||
|
|
||||||
# 만일 침하량의 단위가 m일 경우, 조정
|
|
||||||
settle = settle * 100
|
|
||||||
|
|
||||||
# 데이터 닫기
|
|
||||||
|
|
||||||
# 마지막 계측 데이터 index + 1 파악
|
|
||||||
final_index = time.size
|
|
||||||
|
|
||||||
# =================
|
|
||||||
# 성토 단계 구분
|
|
||||||
# =================
|
|
||||||
|
|
||||||
# 성토 단계 시작 index 리스트 초기화
|
|
||||||
step_start_index = [0]
|
|
||||||
|
|
||||||
# 성토 단계 끝 index 리스트 초기화
|
|
||||||
step_end_index = []
|
|
||||||
|
|
||||||
# 현재 성토고 설정
|
|
||||||
current_surcharge = surcharge[0]
|
|
||||||
|
|
||||||
# 단계 시작 시점 초기화
|
|
||||||
step_start_date = 0
|
|
||||||
|
|
||||||
# 모든 시간-성토고 데이터에서 순차적으로 확인
|
|
||||||
for index in range(len(surcharge)):
|
|
||||||
|
|
||||||
# 만일 성토고의 변화가 있을 경우,
|
|
||||||
if surcharge[index] != current_surcharge:
|
|
||||||
step_end_index.append(index)
|
|
||||||
step_start_index.append(index)
|
|
||||||
current_surcharge = surcharge[index]
|
|
||||||
|
|
||||||
# 마지막 성토 단계 끝 index 추가
|
|
||||||
step_end_index.append(len(surcharge) - 1)
|
|
||||||
|
|
||||||
# =================
|
|
||||||
# 성토 단계 조정
|
|
||||||
# =================
|
|
||||||
# 성토고 유지 기간이 매우 짧을 경우, 해석 단계에서 제외
|
|
||||||
|
|
||||||
# 조정 성토 시작 및 끝 인덱스 리스트 초기화
|
|
||||||
step_start_index_adjust = []
|
|
||||||
step_end_index_adjust = []
|
|
||||||
|
|
||||||
# 각 성토 단계 별로 분석
|
|
||||||
for i in range(0, len(step_start_index)):
|
|
||||||
|
|
||||||
# 현 단계 성토 시작일 / 끝일 파악
|
|
||||||
step_start_date = time[step_start_index[i]]
|
|
||||||
step_end_date = time[step_end_index[i]]
|
|
||||||
|
|
||||||
# 현 성토고 유지 일수 및 데이터 개수 파악
|
|
||||||
step_span = step_end_date - step_start_date
|
|
||||||
step_data_num = step_end_index[i] - step_start_index[i] + 1
|
|
||||||
|
|
||||||
# 성토고 유지일 및 데이터 개수 기준 적용
|
|
||||||
if step_span > 30 and step_data_num > 5:
|
|
||||||
step_start_index_adjust.append((step_start_index[i]))
|
|
||||||
step_end_index_adjust.append((step_end_index[i]))
|
|
||||||
|
|
||||||
# 성토 시작 및 끝 인덱스 리스트 업데이트
|
|
||||||
step_start_index = step_start_index_adjust
|
|
||||||
step_end_index = step_end_index_adjust
|
|
||||||
|
|
||||||
# 침하 예측을 수행할 단계 설정 (현재 끝에서 2단계 이용)
|
|
||||||
step_start_index = step_start_index[-2:]
|
|
||||||
step_end_index = step_end_index[-2:]
|
|
||||||
|
|
||||||
# 성토 단계 횟수 파악 및 저장
|
|
||||||
num_steps = len(step_start_index)
|
|
||||||
|
|
||||||
# ===========================
|
|
||||||
# 최종 단계 데이터 사용 범위 조정
|
|
||||||
# ===========================
|
|
||||||
|
|
||||||
# 데이터 사용 퍼센트에 해당하는 기간 계산
|
|
||||||
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 * 50 / 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 = 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 (Asaoka)
|
|
||||||
# ===============================
|
|
||||||
|
|
||||||
# 성토 마지막 데이터 추출
|
|
||||||
tm_asaoka = time[step_start_index[num_steps - 1]:step_end_index[num_steps - 1]]
|
|
||||||
sm_asaoka = settle[step_start_index[num_steps - 1]:step_end_index[num_steps - 1]]
|
|
||||||
|
|
||||||
# 초기 시점 및 침하량 산정
|
|
||||||
t0_asaoka = tm_asaoka[0]
|
|
||||||
s0_asaoka = sm_asaoka[0]
|
|
||||||
|
|
||||||
# 초기 시점에 대한 시간 조정
|
|
||||||
tm_asaoka = tm_asaoka - t0_asaoka
|
|
||||||
|
|
||||||
# 초기 침하량에 대한 침하량 조정
|
|
||||||
sm_asaoka = sm_asaoka - s0_asaoka
|
|
||||||
|
|
||||||
# Interpolation 함수 설정 (3차 보간)
|
|
||||||
inter_fn = interp1d(tm_asaoka, sm_asaoka, kind='cubic')
|
|
||||||
|
|
||||||
# 데이터 구축 간격 및 그에 해당하는 데이터 포인트 개수 설정
|
|
||||||
interval = 10
|
|
||||||
num_data = int(tm_asaoka[-1]/3)
|
|
||||||
|
|
||||||
# 등간격 시간 및 침하량 데이터 설정
|
|
||||||
tm_asaoka_inter = np.linspace(0, tm_asaoka[-1], num=num_data, endpoint=True)
|
|
||||||
sm_asaoka_inter = inter_fn(tm_asaoka_inter)
|
|
||||||
|
|
||||||
# 이전 이후 등간격 침하량 배열 구축
|
|
||||||
sm_asaoka_before = sm_asaoka_inter[0:-2]
|
|
||||||
sm_asaoka_after = sm_asaoka_inter[1:-1]
|
|
||||||
|
|
||||||
# Least square 변수 초기화
|
|
||||||
x0 = np.ones(2)
|
|
||||||
|
|
||||||
# Least square 분석을 통한 침하 곡선 계수 결정
|
|
||||||
res_lsq_asaoka = least_squares(fun_asaoka, x0, args=(sm_asaoka_before, sm_asaoka_after))
|
|
||||||
|
|
||||||
# 계측 및 예측 침하량 표시
|
|
||||||
plt.scatter(sm_asaoka_before, sm_asaoka_after, s=50,
|
|
||||||
facecolors='white', edgecolors='black', label='measured data')
|
|
||||||
|
|
||||||
# 그래프 표시
|
|
||||||
plt.show()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -12,7 +12,7 @@ output_dir = 'output'
|
||||||
output_error = 'error'
|
output_error = 'error'
|
||||||
|
|
||||||
# 침하 계측값의 단위 지정: 응동 m, 서컨 cm
|
# 침하 계측값의 단위 지정: 응동 m, 서컨 cm
|
||||||
settle_unit = 'm'
|
settle_unit = 'cm'
|
||||||
|
|
||||||
# 입력 파일의 이름을 저장할 리스트 초기화
|
# 입력 파일의 이름을 저장할 리스트 초기화
|
||||||
input_files = []
|
input_files = []
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
"""
|
||||||
|
Title: Controller
|
||||||
|
Developer:
|
||||||
|
Sang Inn Woo, Ph.D. @ Incheon National University
|
||||||
|
Starting Date: 2022-11-10
|
||||||
|
"""
|
||||||
|
import psycopg2 as pg2
|
||||||
|
import settle_prediction_steps_main
|
||||||
|
|
||||||
|
# connect the database
|
||||||
|
conn = pg2.connect("host=localhost dbname=postgres user=postgres password=lab36981 port=5432")
|
||||||
|
|
||||||
|
# set cursor
|
||||||
|
cur = conn.cursor()
|
||||||
|
|
||||||
|
# read data
|
||||||
|
|
||||||
|
|
||||||
|
# extract settlement prediction data using the prime key
|
||||||
|
|
||||||
|
# run settlement analysis
|
||||||
|
|
||||||
|
# save results in the database
|
||||||
|
|
@ -1,3 +1,10 @@
|
||||||
|
"""
|
||||||
|
Title: Error analysis of the settlement prediction curves
|
||||||
|
Developer:
|
||||||
|
Sang Inn Woo, Ph.D. @ Incheon National University
|
||||||
|
Starting Date: 2022-11-10
|
||||||
|
"""
|
||||||
|
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
"""
|
"""
|
||||||
Title: Soft ground settlement prediction considering the step loading
|
Title: Soft ground settlement prediction
|
||||||
Main Developer: Sang Inn Woo, Ph.D. @ Incheon National University
|
Developer:
|
||||||
|
Sang Inn Woo, Ph.D. @ Incheon National University
|
||||||
|
Kwak Taeyoung, Ph.D. @ KICT
|
||||||
|
|
||||||
Starting Date: 2022-08-11
|
Starting Date: 2022-08-11
|
||||||
Abstract:
|
Abstract:
|
||||||
This main objective of this code is to predict
|
This main objective of this code is to predict
|
||||||
time vs. (consolidation) settlement curves of soft clay ground
|
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.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# =================
|
# =================
|
||||||
|
|
@ -715,7 +715,7 @@ def run_settle_prediction(input_file, output_dir,
|
||||||
final_error_hyper_original, final_error_hyper_nonlinear, final_error_hyper_weight_nonlinear,
|
final_error_hyper_original, final_error_hyper_nonlinear, final_error_hyper_weight_nonlinear,
|
||||||
final_error_asaoka, final_error_step, is_multi_step]
|
final_error_asaoka, final_error_step, is_multi_step]
|
||||||
|
|
||||||
|
'''
|
||||||
run_settle_prediction(input_file='data/2-5_No.39.csv',
|
run_settle_prediction(input_file='data/2-5_No.39.csv',
|
||||||
output_dir='output',
|
output_dir='output',
|
||||||
final_step_predict_percent=50,
|
final_step_predict_percent=50,
|
||||||
|
|
@ -728,4 +728,5 @@ run_settle_prediction(input_file='data/2-5_No.39.csv',
|
||||||
run_asaoka=True,
|
run_asaoka=True,
|
||||||
run_step_prediction=True,
|
run_step_prediction=True,
|
||||||
asaoka_interval=3,
|
asaoka_interval=3,
|
||||||
settle_unit='cm')
|
settle_unit='cm')
|
||||||
|
'''
|
||||||
Loading…
Reference in New Issue