상태 추정과 수명 예측
SOC 추정, SOH 추정, 수명(RUL) 예측은 배터리 ML에서 가장 많이 연구된 과제다. 그만큼 같은 이름 아래 서로 다른 문제가 섞여 있다. 어떤 논문의 "SOH 추정"은 실험실에서 매번 측정하는 전체 용량 곡선을 입력으로 쓰고, 다른 논문의 "SOH 추정"은 차량에서 부분 충전 구간만 쓴다. 둘의 오차를 나란히 놓는 것은 의미가 없다. 문제의 정의, 즉 무엇을 언제 무엇으로 예측하며 어디까지 일반화한다고 주장하는지가 먼저다.
이 장은 앞의 방법들을 다시 가르치지 않는다. 칼만 필터는 24.6장, 생존분석은 16.8장, 예측 구간은 21장에서 다뤘다. 여기서는 그 방법들을 배터리 문제에 적용할 때의 판단을 다룬다. 쿨롱 카운팅의 오차가 어디서 쌓이고 필터가 무엇으로 그것을 되돌리는가, 초기 사이클 특징이 새 셀과 새 조건에서 얼마나 통하는가, 예측 구간이 어떤 조건에서 믿을 만한가. 이 장의 셀과 수치는 모두 합성 데이터다.
학습 목표
- SOC·SOH·RUL 문제를 입력 구간·정답·예측 시점·일반화 대상으로 정의한다
- 쿨롱 카운팅과 칼만 필터 SOC 추정의 오차 구조를 비교한다
- 초기 사이클 특징으로 수명을 예측하고 셀·조건 단위 검증과 예측 구간으로 평가한다
문제 정의
왜 필요한가. 같은 데이터에서도 문제 정의를 조금만 바꾸면 성능 수치가 몇 배 달라진다. 그리고 가장 흔한 실패는 모델이 아니라 정의에서 생긴다. 배치될 곳에서 얻을 수 없는 입력을 쓰거나, 정답의 정의가 데이터셋마다 다르거나, 일반화를 주장하는 대상과 평가의 분할 단위가 맞지 않는다.
네 가지를 적는다. 배터리 상태·수명 예측 문제는 다음 네 항목으로 정의한다.
| 항목 | 질문 | 예 |
|---|---|---|
| 입력 구간 | 예측에 쓰는 측정은 무엇이며, 배치 환경에서 실제로 얻을 수 있는가 | 충전 중 3.8–4.0 V 구간의 전하량, 처음 100 사이클의 방전 곡선, 최근 10분의 전류·전압 |
| 정답 | label은 어느 시험의 어떤 양이고, 어떤 기준으로 정의했는가 | RPT 용량 / 공칭 용량, 공칭 80%까지의 사이클 수(중도절단 표시 포함) |
| 예측 시점 | 언제 예측하며, 그 시점까지 어떤 정보가 있는가 | 100 사이클 시점에 전체 수명, 매 초 현재 SOC |
| 일반화 대상 | 무엇에 대해 성능을 주장하는가 | 같은 조건의 새 셀, 새 충전 프로토콜, 다른 셀 모델 |
세 과제의 차이. 세 과제는 시간 규모와 정답의 성격이 다르다.
- SOC 추정: 초 단위로 갱신하는 잠재 상태 추정이다. 정답(실험실에서 정밀한 전류 적산으로 얻은 SOC)은 학습에만 쓰이고, 배치 환경에는 없다. 그래서 순수 지도학습보다 상태공간 모델과 필터가 기본 틀이다.
- SOH 추정: 현재의 열화 상태를 일·주 단위로 추정한다. 정답(RPT 용량)은 실험실에서는 정기적으로 있지만 현장에서는 드물다. 현장에서 측정되는 부분 신호(부분 충전 곡선, 펄스 저항)로 정답을 회귀하는 문제가 된다.
- 수명·RUL 예측: 미래의 시점(EOL)을 예측한다. 정답이 수 개월 뒤에야 확정되고, 시험이 먼저 끝나면 중도절단된다(30.3장, 16.8장). 열화 기작이 바뀌는 knee(30.1장) 때문에 현재 상태에서 미래로의 외삽이 어렵다.
SOC·SOH 추정
쿨롱 카운팅. 가장 직접적인 SOC 추정은 전류의 적분이다(30.1장의 SOC 식). 이 방법은 단순하고 짧은 시간에는 정확하지만, 오차를 되돌리는 피드백이 없다. 오차의 원천마다 쌓이는 방식이 다르다. 실제 용량 2.7 Ah로 열화된 셀을 2시간 동안 가변 부하로 운전하며, 세 가지 오차를 하나씩 넣는다.
import numpy as np
rng = np.random.default_rng(0)
DT_S, Q_TRUE_AH = 1.0, 2.7 # 열화된 셀: 실제 용량 2.7 Ah (공칭 3.0)
seg = rng.uniform(-2.0, 3.6, 360) # 20 s마다 바뀌는 부하 [A], 방전 +
i_true = np.repeat(seg, 20) # (7200,) 2시간
soc_true = 0.9 - np.cumsum(i_true) * DT_S / 3600 / Q_TRUE_AH
def coulomb(i_meas, q_ah, soc0):
return soc0 - np.cumsum(i_meas) * DT_S / 3600 / q_ah # (T,) 영차 유지 적산
cases = {"초기 SOC 오차 +5%p": coulomb(i_true, Q_TRUE_AH, 0.95),
"전류 센서 offset +0.05 A": coulomb(i_true + 0.05, Q_TRUE_AH, 0.9),
"용량을 공칭 3.0 Ah로 가정": coulomb(i_true, 3.0, 0.9)}
print(f"실제 SOC: 0분 {soc_true[0]:.3f} → 120분 {soc_true[-1]:.3f}")
for name, soc in cases.items():
e = (soc - soc_true) * 100 # [%p]
print(f"{name:22s} 오차 [%p] 30분 {e[1799]:+5.2f} 60분 {e[3599]:+5.2f} 120분 {e[-1]:+5.2f}")실제 SOC: 0분 0.900 → 120분 0.165 초기 SOC 오차 +5%p 오차 [%p] 30분 +5.00 60분 +5.00 120분 +5.00 전류 센서 offset +0.05 A 오차 [%p] 30분 -0.93 60분 -1.85 120분 -3.70 용량을 공칭 3.0 Ah로 가정 오차 [%p] 30분 +1.74 60분 +3.82 120분 +7.35
세 오차의 시간 구조가 다르다.
- 초기 SOC 오차는 그대로 남는다. 줄지도 늘지도 않는다.
- 전류 센서 offset은 시간에 비례해 쌓인다. 0.05 A는 한 시간에 용량의 2%에 조금 못 미치는 전하량이지만 2시간이면 3.7 %p가 되고, 차량이 며칠씩 운전과 대기를 반복하면 끝없이 커진다.
- 용량 오차(열화된 셀에 공칭 용량을 쓰는 것)는 그동안 흐른 전하량에 비례한다. SOH 추정이 SOC 추정의 입력이 되는 이유다.
모델 기반 추정: 칼만 필터. 단자 전압은 SOC에 대한 정보를 담고 있다. 30.2장의 1-RC 모델을 상태공간 모델로 쓰면, 상태 , 입력 , 측정 다.
이고 는 전압 측정 잡음이다. 동역학은 선형이고 측정만 OCV 때문에 비선형이므로, 24.6장의 확장 칼만 필터(EKF)를 그대로 쓴다. 측정 Jacobian은 이다. 배터리 SOC 추정에 EKF를 쓰는 방법은 Plett(2004)의 연작이 BMS 맥락에서 체계적으로 정리했다.
센서 offset과 공칭 용량 가정을 그대로 둔 채, 초기 SOC를 30 %p 틀리게(참 90%, 추정 60%) 시작한다. 전압 측정에는 5 mV 잡음이 있다.
R0, R1, C1 = 0.020, 0.015, 2000.0 # 1-RC 파라미터 (가상의 예시 셀)
a1 = np.exp(-DT_S / (R1 * C1))
def ocv(s):
return 3.5 + 0.55 * s + 0.04 * np.log((s + 0.02) / (1.02 - s))
def docv(s):
return 0.55 + 0.04 * (1 / (s + 0.02) + 1 / (1.02 - s))
v1, v_meas = 0.0, np.empty_like(i_true) # 참 셀로 측정 전압 만들기
for k, i in enumerate(i_true):
v_meas[k] = ocv(soc_true[k]) - i * R0 - v1 + rng.normal(0, 0.005)
v1 = a1 * v1 + R1 * (1 - a1) * i
i_meas, q_model = i_true + 0.05, 3.0 # 센서 offset, 공칭 용량 가정
x, P = np.array([0.6, 0.0]), np.diag([0.1**2, 0.01**2]) # 초기 추정 SOC 60% (참 90%)
F, Qn, Rn = np.diag([1.0, a1]), np.diag([1e-7, 1e-8]), 0.005**2
soc_ekf = np.empty_like(i_true)
for k, i in enumerate(i_meas):
H = np.array([docv(x[0]), -1.0]) # 관측 Jacobian dV/d(SOC, V1)
S = H @ P @ H + Rn
K = P @ H / S # (2,) 칼만 이득
x = x + K * (v_meas[k] - (ocv(x[0]) - i * R0 - x[1]))
P = P - np.outer(K, H @ P)
soc_ekf[k] = x[0]
x = np.array([x[0] - i * DT_S / 3600 / q_model, a1 * x[1] + R1 * (1 - a1) * i]) # 예측
P = F @ P @ F.T + Qn
e_cc = (coulomb(i_meas, q_model, 0.6) - soc_true) * 100
e_ekf = (soc_ekf - soc_true) * 100
for t in [0, 60, 600, 3599, 7199]:
print(f"t = {t + 1:5d} s 쿨롱 카운팅 오차 {e_cc[t]:+6.2f} %p EKF 오차 {e_ekf[t]:+6.2f} %p")t = 1 s 쿨롱 카운팅 오차 -30.00 %p EKF 오차 +1.61 %p t = 61 s 쿨롱 카운팅 오차 -30.04 %p EKF 오차 +0.04 %p t = 601 s 쿨롱 카운팅 오차 -29.66 %p EKF 오차 +0.05 %p t = 3600 s 쿨롱 카운팅 오차 -27.85 %p EKF 오차 +0.32 %p t = 7200 s 쿨롱 카운팅 오차 -25.98 %p EKF 오차 +0.17 %p
쿨롱 카운팅은 처음의 30 %p 오차를 그대로 안고 가며(조금 줄어드는 것은 offset과 용량 오차가 반대 방향으로 쌓이기 때문이지 보정이 아니다), EKF는 1분 안에 오차를 0.1 %p 아래로 줄이고, 그 뒤 2시간 동안 1 %p 안쪽(이 실행에서 최대 0.65 %p)에 머문다. 남은 작은 오차는 센서 offset과 용량 가정이 예측 단계에서 계속 밀어내는 몫을 측정 갱신이 되돌리는 균형에서 생긴다. 차이는 측정 갱신의 피드백이다. 측정 전압과 모델 예측 전압의 차이(혁신)가 OCV 기울기를 통해 SOC 보정으로 바뀐다.
이 결과를 일반화할 때 주의할 점이 둘 있다.
- 모델이 맞았다. 이 예의 필터는 참 셀과 같은 , , , OCV 곡선을 썼다. 실제로는 파라미터가 온도·SOC·열화에 따라 바뀌고, 모델 전압 오차가 그대로 SOC 편향이 된다(30.2장에서 본 5 mV → 0.7 %p). 파라미터를 함께 추정하는 문제는 30.5장에서 다룬다.
- OCV 기울기가 충분했다. 평탄한 OCV 곡선의 중간 구간에서는 이득의 SOC 성분이 작아져 필터가 쿨롱 카운팅으로 되돌아간다(24.6장의 관측 가능성).
데이터 기반과 하이브리드. 전압·전류·온도의 최근 이력에서 SOC나 SOH를 바로 회귀하는 신경망도 많이 연구된다. 이런 모델은 실험실 정답으로 학습하므로, 학습 데이터에 없던 온도·부하 패턴·열화 상태에서 오차가 어떻게 되는지 따로 검증해야 한다. 실용적인 절충은 하이브리드다(24.5장). 예를 들어 필터의 틀은 유지하고 OCV 곡선이나 저항의 온도·열화 의존성을 학습 모델로 바꾸거나, 필터의 잔차를 학습 모델로 보정한다. SOH 추정에서도 같은 선택이 있다. 부분 충전 곡선에서 용량을 회귀하는 데이터 기반 모델, 전극 수준 모델로 리튬 손실과 활물질 손실을 추정하는 물리 기반 진단, 그 둘을 섞은 방식이다.
수명 예측
왜 필요한가. 수명 시험은 수 개월이 걸린다. 처음 몇십·몇백 사이클로 수명을 예측할 수 있다면, 셀 선별·충전 프로토콜 탐색·소재 개발의 실험 주기가 크게 줄어든다(30.6장).
조기 예측. 30.1장에서 본 대로, knee 이전의 용량 곡선은 거의 평평해 수명에 대한 정보가 적다. Severson 외(2019)는 상용 LFP/흑연 셀 124개의 데이터에서, 용량이 거의 줄지 않은 초기 사이클의 방전 전압 곡선의 변화가 수명과 강하게 관련된다는 것을 보였다. 사이클 10과 사이클 100의 방전 용량-전압 곡선 차이 에서 뽑은 통계량(분산 등)을 특징으로 써서, 처음 100 사이클로 수명을 예측하는 모델이 테스트 오차 9.1%를 냈다고 보고했다. 이 결과는 한 화학, 한 셀 모델, 한 시험 환경에서 충전 프로토콜을 바꾼 데이터에서 얻은 것이다(30.3장).
합성 예제로 보는 판단. 그 구조를 흉내 낸 합성 데이터로, 특징의 선택과 검증 단위가 결론을 어떻게 바꾸는지 본다. 8가지 충전 프로토콜마다 셀 10개, 수명은 프로토콜에 따라 400–1600 사이클이다. "전압 곡선 특징"은 log 수명과 강하게 관련되지만 프로토콜마다 조금씩 치우쳐 있고, "용량 감소"(사이클 10→100)는 수명과 관련되지만 측정 잡음에 비해 작다. log 수명에 선형 회귀를 맞춘다.
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import KFold, LeaveOneGroupOut, cross_val_predict
n_proto, per = 8, 10
proto = np.repeat(np.arange(n_proto), per) # (80,) 충전 프로토콜
log_life = np.log(np.repeat(rng.uniform(400, 1600, n_proto), per)) + rng.normal(0, 0.15, 80)
life = np.exp(log_life) # (80,) 수명 [사이클]
x_var = -1.0 * log_life + np.repeat(rng.normal(0, 0.15, n_proto), per) + rng.normal(0, 0.08, 80)
x_fade = 1e-4 * 100 * 900 / life + rng.normal(0, 0.006, 80) # 사이클 10→100 용량 감소 [Ah]
designs = {"용량 감소": x_fade[:, None], "전압 곡선 특징": x_var[:, None]}
cvs = {"셀 단위 5-fold": list(KFold(5, shuffle=True, random_state=0).split(x_var)),
"프로토콜 단위": list(LeaveOneGroupOut().split(x_var, groups=proto))} # (학습, 테스트) 목록
print(f"평균값 예측 MAPE {np.mean(np.abs(np.exp(log_life.mean()) - life) / life):.1%}")
for fname, X in designs.items():
row = []
for cname, cv in cvs.items():
p = np.exp(cross_val_predict(LinearRegression(), X, log_life, cv=cv))
row.append(f"{cname} MAPE {np.mean(np.abs(p - life) / life):5.1%}")
print(f"{fname:9s}: " + ", ".join(row))평균값 예측 MAPE 37.5% 용량 감소 : 셀 단위 5-fold MAPE 28.4%, 프로토콜 단위 MAPE 30.3% 전압 곡선 특징 : 셀 단위 5-fold MAPE 14.6%, 프로토콜 단위 MAPE 18.0%
두 가지를 읽는다. 첫째, 초기 용량 감소는 평균값 예측(37.5%)보다 조금 나을 뿐이고, 전압 곡선 특징은 오차를 절반 이하로 줄인다. knee 이전의 용량은 정보가 적다는 30.1장의 결론과 같다. 둘째, 같은 특징이라도 프로토콜 단위로 검증하면 오차가 14.6%에서 18.0%로 커진다. 처음 보는 프로토콜에서는 그 프로토콜 특유의 치우침을 학습에서 보지 못했기 때문이다. 셀 단위 수치는 "이미 본 프로토콜의 새 셀"에 대한 것이다.
RUL과 중도절단. 남은 수명(RUL)을 예측 시점마다 회귀하는 정식화에서는 학습 데이터의 각 시점에 "EOL까지 남은 사이클"이라는 label이 필요하므로, EOL에 닿지 못한 셀이 빠지거나 잘못 처리되기 쉽다. 16.8장에서 본 대로 고장 셀만으로 회귀하면 수명이 짧은 쪽으로 편향되고, 공변량의 효과도 약해진다. 수명 시험이 길고 중도절단이 많은 배터리 데이터에서는 생존분석의 likelihood를 쓰거나, 적어도 중도절단 셀을 "수명 ≥ 관측 시간"이라는 부등식 정보로 평가에 포함한다.
knee 예측. knee 시점 자체를 예측 대상으로 삼기도 한다. knee는 정의가 여러 가지(곡률 최대점, 두 직선 맞춤의 교점 등)라서, 정의를 명시하지 않은 knee 예측 성능은 비교할 수 없다. knee 이전에 그 시점을 예측하는 것은 수명 예측과 같은 어려움을 가진다.
불확실성
왜 필요한가. 수명 예측은 셀 선별이나 보증 기간 설정 같은 결정에 쓰인다. "812 사이클"이라는 점 예측보다 "90% 확률로 650–1000 사이클"이 결정에 필요하다(21.1장, 21.6장). 그리고 그 구간이 실제로 90%를 덮는지는, 셀 단위와 조건 단위로 따로 확인해야 한다.
split conformal 구간. 21.3장의 split conformal을 log 수명에 쓴다. 학습 셀을 반으로 나눠 한쪽으로 모델을 맞추고, 다른 쪽의 절대 잔차로 분위수 를 정한 뒤, 테스트 셀에 를 낸다(log 공간에서 대칭, 수명 공간에서는 비대칭). 목표 coverage 90%로, 셀 단위 검증과 프로토콜 단위 검증에서 실제 coverage를 전체와 프로토콜별로 잰다.
def conformal_coverage(splits, alpha=0.1):
hit = np.zeros(80, bool)
for tr, te in splits:
fit, cal = tr[::2], tr[1::2] # 학습 셀을 적합용·보정용으로 반씩
m = LinearRegression().fit(x_var[fit, None], log_life[fit])
r = np.sort(np.abs(log_life[cal] - m.predict(x_var[cal, None])))
q = r[int(np.ceil((len(cal) + 1) * (1 - alpha))) - 1] # 보정 잔차의 분위수
hit[te] = np.abs(log_life[te] - m.predict(x_var[te, None])) <= q
return hit
for cname, cv in cvs.items():
hit = conformal_coverage(cv)
by_proto = [hit[proto == g].mean() for g in range(n_proto)]
print(f"{cname:12s} 전체 coverage {hit.mean():.0%}, 프로토콜별 최소 {min(by_proto):.0%} 최대 {max(by_proto):.0%}")셀 단위 5-fold 전체 coverage 90%, 프로토콜별 최소 70% 최대 100% 프로토콜 단위 전체 coverage 82%, 프로토콜별 최소 60% 최대 100%
셀 단위 검증에서 전체 coverage는 목표대로 90%지만, 프로토콜별로는 70%에서 100%까지 퍼진다. conformal의 보장은 전체(주변) coverage에 대한 것이고, 조건별 coverage는 보장하지 않는다. 처음 보는 프로토콜(프로토콜 단위 검증)에서는 보정 셀과 테스트 셀이 교환 가능하다는 가정 자체가 깨져 전체 coverage도 82%로 떨어지고, 가장 나쁜 프로토콜에서는 60%다.
조건별 calibration. 보고할 때는 전체 coverage와 함께 조건(프로토콜·온도·데이터셋)별 coverage를 표로 낸다. 조건별 coverage가 목표에서 크게 벗어나면 (1) 조건별로 보정 집합을 따로 두거나(조건당 셀이 충분할 때), (2) 오차의 크기가 조건에 따라 달라지도록 정규화한 잔차(예: 앙상블 분산으로 나눈 잔차)를 쓰거나, (3) 새 조건에서는 구간을 넓히는 보수적 규칙을 둔다. 셀 수가 적은 배터리 데이터에서는 조건별 coverage 자체의 추정 오차가 크다는 점도 함께 적는다. 셀 10개로 잰 70%는 우연일 수도 있다.
평가
왜 필요한가. 배터리 수명 모델의 쓸모는 결국 "처음 보는 것"에서의 성능이다. 처음 보는 셀, 처음 보는 조건, 처음 보는 데이터셋. 이 셋은 난이도가 다르고, 논문은 셋 중 무엇을 주장하는지 분명히 해야 한다.
검증의 사다리. 아래로 갈수록 어렵고, 아래로 갈수록 주장이 강하다.
| 검증 | 분할 | 답하는 질문 |
|---|---|---|
| 새 셀 | 셀 단위(같은 조건의 셀이 학습에 있음) | 같은 조건으로 운전한 다음 셀의 수명을 맞히는가 |
| 새 조건 | 프로토콜·온도 단위 | 학습에 없던 운전 조건으로 외삽하는가 |
| 새 데이터셋 | 데이터셋 단위 | 다른 기관·장비·셀 모델로 옮겨 가는가 |
보고할 것. 이 장의 실습과 통과 기준이 요구하는 것을 정리하면 다음과 같다.
- 오차(MAPE·RMSE)를 위의 각 단계에서 따로, fold·조건별 분포와 함께 보고한다. 셀 수가 적으면 평균만으로는 부족하다.
- baseline을 함께 낸다. 평균값 예측, 초기 용량 감소 같은 단순 특징의 선형 모델. 복잡한 모델이 이 baseline을 얼마나 넘는지가 주장의 크기다.
- 예측 구간의 전체·조건별 coverage와 평균 폭을 함께 낸다. 폭이 무한히 넓은 구간은 coverage를 쉽게 맞춘다.
- 중도절단된 셀을 어떻게 처리했는지 밝힌다.
- 입력이 배치 환경에서 측정 가능한지, 예측 시점에 그 입력이 이미 존재하는지(미래 정보 누수가 없는지) 밝힌다.
실습
쿨롱 카운팅을 직접 구현하고 센서 offset이 만드는 오차의 누적을 계산한다. 불균일한 기록 간격과 충전 효율도 처리한다. 테스트가 바로 채점한다.
이어서 다음을 만든다. 공개 데이터(30.3장)나 이 장의 합성 생성기를 쓴다.
- 문제 정의서: 입력 구간, 정답의 정의, 예측 시점, 일반화 대상을 이 장의 표 형식으로 쓴다. 입력이 배치 환경에서 측정 가능한지 근거를 적는다.
- SOH(또는 수명) 모델과 예측 구간: 셀 단위와 조건 단위(프로토콜·온도·데이터셋 중 데이터가 허락하는 것) 검증으로 점 예측 오차를 보고하고, split conformal 구간의 전체·조건별 coverage와 폭을 보고한다.
- SOC 필터: 1-RC EKF에 OCV 곡선이나 저항 파라미터를 일부러 틀리게 넣고(예: 저항 +30%), SOC 오차가 어떻게 바뀌는지 OCV 기울기가 큰 구간과 작은 구간에서 비교한다.
실패 사례
- 실제로 측정할 수 없는 입력(예: 전체 용량 곡선)을 사용하는 것. 실험실의 RPT마다 얻는 0–100% 저율 곡선은 현장에서 존재하지 않는다. 배치 환경에서 그 입력이 언제, 얼마나 자주 측정되는지부터 확인한다.
- 예측 시점 이후의 정보가 입력에 섞이는 것. "100 사이클 시점의 예측"에 100 사이클 이후의 RPT 값이나, 전체 수명으로 정규화한 특징(예: 수명 대비 사이클 비율)이 들어가면 미래를 보고 예측한 것이다.
- 셀 단위 검증만으로 새 조건에 대한 일반화를 주장하는 것. 같은 프로토콜의 다른 셀이 학습에 있으면 조건에 대한 외삽을 검증하지 못한다.
- 전체 coverage만 보고하는 것. 전체 90%는 조건별 60%와 100%의 평균일 수 있다. 결정에 쓰이는 단위(조건, 셀 묶음)별 coverage를 보고한다.
- 쿨롱 카운팅 SOC를 정답처럼 쓰는 것. 실험실의 SOC label도 센서 offset과 용량 가정에 따라 쌓이는 오차를 가진다. label의 생성 방식과 재보정 시점을 기록한다.
통과 기준
- 맡은 과제의 입력 구간·정답·예측 시점·일반화 대상을 표로 정의하고, 모든 입력이 배치 환경에서 측정 가능하다는 근거를 적는다.
- 쿨롱 카운팅의 오차 원천별 누적을 계산하고(연습문제
coulomb-counting통과), EKF가 초기 오차를 줄이는 조건과 실패하는 조건(평탄한 OCV, 틀린 파라미터)을 설명한다. - 수명(또는 SOH) 예측의 오차를 셀 단위와 조건 단위 검증에서 baseline과 함께 보고하고, 예측 구간의 전체·조건별 coverage와 폭을 보고한다.
참고 문헌
- Plett, G. L. (2004). Extended Kalman filtering for battery management systems of LiPB-based HEV battery packs: Part 3. State and parameter estimation. Journal of Power Sources, 134(2), 277–292. — BMS에서 EKF로 SOC와 파라미터를 추정하는 방법(3부작의 셋째 편)
- Severson, K. A., Attia, P. M., Jin, N. 외 (2019). Data-driven prediction of battery cycle life before capacity degradation. Nature Energy, 4(5), 383–391. — 초기 사이클의 방전 전압 곡선 특징으로 수명을 조기 예측