HCI/Arduino

[Arduino] Thermistor, Peltier module 을 활용해 Rising time과 Return Time 다항식 만들기 / 파이썬 / 아두이노

sillon 2025. 4. 16. 17:16
728x90
반응형

이전 포스팅에서 만든 최종 결과로, 다항식을 만들어볼 예정입니다.

일단 제 실험 결과는 아래처럼 나왔습니다.

더보기
Folder File Delta Rise_Time_s Return_Time_s
delta_-1.0 run_1.csv -1 1.029 1.027
delta_-1.0 run_2.csv -1 1.029 1.027
delta_-1.0 run_3.csv -1 1.03 0.822
delta_-1.0 run_4.csv -1 1.03 1.027
delta_-1.0 run_5.csv -1 1.029 1.028
delta_-2.0 run_1.csv -2 1.648 1.644
delta_-2.0 run_2.csv -2 1.75 1.644
delta_-2.0 run_3.csv -2 1.648 1.644
delta_-2.0 run_4.csv -2 1.75 1.028
delta_-2.0 run_5.csv -2 1.647 1.644
delta_-3.0 run_1.csv -3 2.369 2.159
delta_-3.0 run_2.csv -3 2.265 2.159
delta_-3.0 run_3.csv -3 2.265 2.055
delta_-3.0 run_4.csv -3 2.369 2.159
delta_-3.0 run_5.csv -3 2.367 2.158
delta_-4.0 run_1.csv -4 2.678 2.467
delta_-4.0 run_2.csv -4 2.883 2.467
delta_-4.0 run_3.csv -4 2.883 2.468
delta_-4.0 run_4.csv -4 2.781 2.467
delta_-4.0 run_5.csv -4 2.884 2.467
delta_-5.0 run_1.csv -5 3.296 2.673
delta_-5.0 run_2.csv -5 3.398 2.672
delta_-5.0 run_3.csv -5 3.398 2.672
delta_-5.0 run_4.csv -5 3.398 2.672
delta_-5.0 run_5.csv -5 3.296 2.467
delta_-6.0 run_1.csv -6 4.015 2.98
delta_-6.0 run_2.csv -6 3.811 2.981
delta_-6.0 run_3.csv -6 3.81 2.981
delta_-6.0 run_4.csv -6 3.809 2.877
delta_-6.0 run_5.csv -6 3.81 2.98
delta_0.0 run_1.csv 0    
delta_0.0 run_2.csv 0    
delta_0.0 run_3.csv 0    
delta_0.0 run_4.csv 0    
delta_0.0 run_5.csv 0    
delta_1.0 run_1.csv 1 1.132 1.028
delta_1.0 run_2.csv 1 1.028 1.027
delta_1.0 run_3.csv 1 1.028 1.13
delta_1.0 run_4.csv 1 1.131 1.028
delta_1.0 run_5.csv 1 1.132 1.027
delta_2.0 run_1.csv 2 1.749 1.748
delta_2.0 run_2.csv 2 1.543 1.541
delta_2.0 run_3.csv 2 1.647 1.645
delta_2.0 run_4.csv 2 1.749 1.644
delta_2.0 run_5.csv 2 1.749 1.644
delta_3.0 run_1.csv 3 2.47 2.262
delta_3.0 run_2.csv 3 2.263 2.261
delta_3.0 run_3.csv 3 2.367 2.159
delta_3.0 run_4.csv 3 2.264 2.261
delta_3.0 run_5.csv 3 2.263 2.261
delta_4.0 run_1.csv 4 2.675 2.673
delta_4.0 run_2.csv 4 2.779 2.569
delta_4.0 run_3.csv 4 2.676 2.364
delta_4.0 run_4.csv 4 2.779 2.467
delta_4.0 run_5.csv 4 2.882 2.569
delta_5.0 run_1.csv 5 3.191 2.776
delta_5.0 run_2.csv 5 3.088 2.878
delta_5.0 run_3.csv 5 3.088 2.775
delta_5.0 run_4.csv 5 2.984 2.775
delta_5.0 run_5.csv 5 3.19 2.57
delta_6.0 run_1.csv 6 3.602 2.877
delta_6.0 run_2.csv 6 3.603 2.878
delta_6.0 run_3.csv 6 3.705 2.877
delta_6.0 run_4.csv 6 3.602 2.981
delta_6.0 run_5.csv 6 3.499 2.878

이제, 이걸 다항식으로 만들어보겠습니다.

 

import numpy as np
import pandas as pd
from numpy.polynomial import Polynomial
import json

# ============================
# 1. Load and clean data
# ============================

# CSV 파일 로드
df = pd.read_csv("delta_summary_rise_return_times.csv")

# NaN 제거
clean_data = df.dropna(subset=["Rise_Time_s", "Return_Time_s"])

# ============================
# 2. Group by Delta and get mean
# ============================

# Delta별 평균 Rise/Return Time 계산
delta_avg = clean_data.groupby("Delta")[["Rise_Time_s", "Return_Time_s"]].mean().reset_index()

# 평균 Rise, Return도 함께 저장
delta_avg["Mean_Time"] = delta_avg[["Rise_Time_s", "Return_Time_s"]].mean(axis=1)

# 컬럼명 명확히
delta_avg.rename(columns={
    "Rise_Time_s": "Mean_Rise_Time_s",
    "Return_Time_s": "Mean_Return_Time_s"
}, inplace=True)
output_path = "delta_mean_times.csv"
round(delta_avg,2).to_csv(output_path, index=False)
# ============================
# 3. Polynomial Fit
# ============================

# Δ별 평균값 추출
deltas = delta_avg["Delta"].values
rise_times = delta_avg["Mean_Rise_Time_s"].values
return_times = delta_avg["Mean_Return_Time_s"].values

# 2차 다항식 피팅 후 standard basis로 변환
rise_poly = Polynomial.fit(deltas, rise_times, 2).convert()
return_poly = Polynomial.fit(deltas, return_times, 2).convert()

# ============================
# 4. Δ 입력 시 평균값 계산 함수
# ============================

def get_rise_return_time(delta_val):
    if delta_val == 0:
        return 0.0, 0.0
    rise = rise_poly(delta_val)
    ret = return_poly(delta_val)
    return round(rise, 2), round(ret, 2)

# 예시 출력
print(f"다항식: rising : {rise_poly} \n return: {return_poly}")
example_outputs = {delta: get_rise_return_time(delta) for delta in [-6, -4.3, -2, 0, 1.5, 3.2, 6]}
print(example_outputs)

# ============================
# 5. 다항식 계수 JSON 저장 (JS 연동용)
# ============================

# 계수 추출
rise_coeffs = rise_poly.coef.tolist()
return_coeffs = return_poly.coef.tolist()

# JSON 파일로 저장
with open("rise_coeffs.json", "w") as f:
    json.dump(rise_coeffs, f)

with open("return_coeffs.json", "w") as f:
    json.dump(return_coeffs, f)

 

최종적으로 저장되는 형태

Delta Mean_Rise_Time_s Mean_Return_Time_s Mean_Time
-6 3.85 2.96 3.41
-5 3.36 2.63 2.99
-4 2.82 2.47 2.64
-3 2.33 2.14 2.23
-2 1.69 1.52 1.6
-1 1.03 0.99 1.01
1 1.09 1.05 1.07
2 1.69 1.64 1.67
3 2.33 2.24 2.28
4 2.76 2.53 2.64
5 3.11 2.75 2.93
6 3.6 2.9 3.25
728x90
반응형