티스토리 뷰

[개요]

배터리 용량에 대한 충전 전압과 전류, 방전 전압과 전류 측정치를 이용하여

테스트 전압과 전류값에 대한 용량을 추정하는 문제

 

[Python Codes]

    import numpy as np
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.neural_network import MLPRegressor
    from sklearn.metrics import mean_squared_error, r2_score
    import matplotlib.pyplot as plt

    # 데이터 생성
    np.random.seed(42)
    n_samples = 500

    # 입력 데이터: 충전 전압/전류, 방전 전압/전류
    charge_voltage = np.random.uniform(4.8, 24.0, n_samples)
    charge_current = np.random.uniform(0.1, 5.0, n_samples)
    discharge_voltage = np.random.uniform(4.8, 24.0, n_samples)
    discharge_current = np.random.uniform(0.1, 5.0, n_samples)

    # 기준 용량 계산 (예제 데이터, 실제로는 측정 데이터 사용)
    true_capacity = (
        0.5 * charge_voltage +
        0.3 * charge_current +
        0.2 * discharge_voltage -
        0.1 * discharge_current +
        np.random.normal(0, 0.5, n_samples)  # 노이즈 추가
    )

    # 데이터프레임 생성
    data = pd.DataFrame({
        "charge_voltage": charge_voltage,
        "charge_current": charge_current,
        "discharge_voltage": discharge_voltage,
        "discharge_current": discharge_current,
        "capacity": true_capacity
    })

    # 독립 변수 (X)와 종속 변수 (y) 분리
    X = data[["charge_voltage", "charge_current", "discharge_voltage", "discharge_current"]]
    y = data["capacity"]

    # 데이터 분할 (훈련 데이터와 테스트 데이터)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

    # 데이터 정규화
    scaler = StandardScaler()
    X_train_scaled = scaler.fit_transform(X_train)
    X_test_scaled = scaler.transform(X_test)

    # 모델 생성 및 학습
    model = MLPRegressor(hidden_layer_sizes=(32, 16), activation='relu', solver='adam', max_iter=500, random_state=42)
    model.fit(X_train_scaled, y_train)

    # 예측
    y_train_pred = model.predict(X_train_scaled)
    y_test_pred = model.predict(X_test_scaled)

    # 모델 성능 평가
    mse_train = mean_squared_error(y_train, y_train_pred)
    mse_test = mean_squared_error(y_test, y_test_pred)
    r2_train = r2_score(y_train, y_train_pred)
    r2_test = r2_score(y_test, y_test_pred)

    # 결과 출력
    print("다층 신경망 회귀 모델 성능")
    print(f"훈련 데이터 MSE: {mse_train:.4f}, R^2: {r2_train:.4f}")
    print(f"테스트 데이터 MSE: {mse_test:.4f}, R^2: {r2_test:.4f}")

    # 시각화: 실제 값과 예측 값 비교
    plt.figure(figsize=(10, 5))
    plt.scatter(y_test, y_test_pred, alpha=0.7)
    plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color="red", linestyle="--", label="Ideal Fit")
    plt.title("Actual vs Predicted Capacity")
    plt.xlabel("Actual Capacity")
    plt.ylabel("Predicted Capacity")
    plt.legend()
    plt.show()

 

[결과]

다층 신경망 회귀 모델 성능
훈련 데이터 MSE: 0.3370, R^2: 0.9683
테스트 데이터 MSE: 0.5042, R^2: 0.9450

 

[테스트 배터리에 대한 용량 추정 코드]

# 새로운 측정값 입력 및 기준 용량 추정
# 실제 측정값 예제: 충전 전압, 충전 전류, 방전 전압, 방전 전류
new_data = pd.DataFrame({
    "charge_voltage": [12.0, 18.0, 6.5],   # 측정된 충전 전압
    "charge_current": [2.5, 3.0, 1.2],    # 측정된 충전 전류
    "discharge_voltage": [11.8, 17.5, 6.0], # 측정된 방전 전압
    "discharge_current": [1.8, 2.5, 0.8]  # 측정된 방전 전류
})

# 입력 데이터 정규화 (훈련 데이터와 동일한 스케일 사용)
new_data_scaled = scaler.transform(new_data)

# 기준 용량 추정
predicted_capacity = model.predict(new_data_scaled)

# 결과 출력
for i, capacity in enumerate(predicted_capacity):
    print(f"측정값 {i + 1} - 추정 기준 용량: {capacity:.2f}")
반응형