경사하강법을 이용한 배터리 전압곡선 피팅2

오주환·2023년 6월 9일
0

지난 포스터에서 1차 테브난 등가회로기반의 배터리 개방회로전압(ocv) 추정은 오차가 크다는 것을 확인했다. 이어서 이번에는 다른 곡선(V(t)=atb+cV(t)=at^{b}+c)으로 전압곡선을 피팅해보았다.
다른건 다 같으나 피팅함수랑 학습률을 바꾸었다.
(피팅함수마다 최적의 하이퍼파라미터는 다르기떄문)
전압곡선 함수 출처

# %%
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# %%
def V_func(a, b, c, t):
    return a*(1/t)**(-b)+c #https://vbn.aau.dk/ws/portalfiles/portal/293046723/A_Novel_Multiple_Correction_Approach_for_Fast_Open_Circuit_Voltage_Prediction_of_Lithium_ion_Battery.pdf
def E(a, b, c):
    E = sum((V_func(a, b, c, t) - V_meas) ** 2)  # 에러함수: 오차제곱합
    return E

#%%
df=pd.read_csv('curr.csv')
df.columns=['time','voltage']
df.time=df.time.str.slice(stop=8)
df.time=df.time.str.replace(pat=':', repl='', regex=False)
hh=df['time'].str.slice(start=0, stop=2)
mm=df['time'].str.slice(start=2, stop=4) 
ss=df['time'].str.slice(start=4, stop=6)
hh=hh.astype(int) 
mm=mm.astype(int)
ss=ss.astype(int)
df.time=3600*hh+60*mm+ss
df.time=df.time-df.time.min()
V_meas=df.voltage.to_numpy()/10**5
# %%
a, b, c = -10, -1, 200  # 초기값
insp_t = len(V_meas)  # 60*10초동안 휴지전압 측정
t = np.arange(1, insp_t+1)
# %%
learning_rate = 0.0001
error = []
for i in range(10000):  # 경사하강 알고리즘
    Ea = sum((V_func(a, b, c, t) - V_meas)*(1/t)**(-b))
    Eb = sum((V_func(a, b, c, t) - V_meas)*a*(1/t)**(-b)*np.log(t))
    Ec = sum((V_func(a, b, c, t) - V_meas) )
    # learning_rate=(Eaa/Ea)**2,(Ebb/Eb)**2,(Ecc/Ec)**2
    a -= learning_rate * Ea
    b -= learning_rate * Eb
    c -= learning_rate * Ec
    if i > 1:
        if error[-1] < E(a, b, c):
            error.append(E(a, b, c))
            print("turn")
            print(E(a, b, c), error[-1])
            break
    error.append(E(a, b, c))
    print(a, b, c, E(a, b, c))

# %%
plt.plot(V_measf,label='measured voltage')
plt.plot(np.arange(1, insp_t+1),V_func(a, b, c, t),'r',linewidth='3',label='fitted voltage')

plt.title('formula: $at^{b}+c$'+'\n\nMSE:'+str(E(a, b, c)/len(V_meas)))
plt.legend()

이전 포스트의 모델에 비해 MSE(mean squared error)가 절반정도로 줄었다

여기에 초기 400초 전압곡선만 학습하여 OCV를 추정해 보고, 1400여초 학습데이터로 나온 OCV와 비교해보겟다.
OCV1400OCV_{1400}=215.8936790206262
OCV400OCV_{400}=215.64662766761796

결과:
1400초 단자전압대비 400초 단자전압은 0.25% 차이가 나는 반면
1400초ocv추정값대비 400초ocv추정값 오차는0.11443%이다.

요약하자면 다항전압곡선 모델에서 1400초 단자전압기반 ocv추정이 정확하다면 400초 단자전압 측정만으로도 정확한 ocv추정이 가능하다는 것을 의미한다

profile
Quantami

0개의 댓글