我正在运行最小二乘优化,根据测量值拟合我的数据。我创建了一个成本函数,所有函数参数似乎都很好,但结果与我提供的最初猜测完全相同。一点也不偏离。
感谢您提前提供的帮助。
def LSMM(initial_guess, ocp_cathode, ocp_anode,soc_values, soc, ocv_entries):
def ocp_pe(alpha_p, beta_p, ocp_cathode, soc_values):
ocp_p = {k_soc:v for k_soc, v in zip(np.around(alpha_p*soc_values+beta_p,3), ocp_cathode)}
return ocp_p
def ocp_ne(alpha_n, beta_n, ocp_anode, soc_values):
ocp_n = {k_soc:v for k_soc, v in zip(np.round(alpha_n*soc_values+beta_n,3), ocp_anode)}
return ocp_n
def ocv_cell(soc, ocv_datapoints):
ocv = {k_soc:v for k_soc, v in zip(np.round(soc,3), ocv_datapoints)}
return ocv
def cost_function(params, ocp_cathode, ocp_anode, soc_values, soc, ocv_datapoints):
print("here")
alpha_p, beta_p, alpha_n, beta_n = params
print(params)
ocp_p = ocp_pe(alpha_p, beta_p, ocp_cathode, soc_values)
ocp_n = ocp_ne(alpha_n, beta_n, ocp_anode, soc_values)
ocv = ocv_cell(soc, ocv_datapoints)
ocv_cat = []
ocv_an = []
for i in ocv.keys():
ocv_cat.append(ocp_p[i])
ocv_an.append(ocp_n[i])
ocv_pred = np.array(ocv_cat) - np.array(ocv_an)
diff = np.sqrt(np.sum((ocv_pred - np.array(list(ocv.values()))) ** 2))
#return np.sqrt(np.mean((ocv_pred - np.array(list(ocv.values()))) ** 2))
return diff
opti = least_squares(cost_function, initial_guess, args = (ocp_cathode, ocp_anode, soc_values, soc, ocv_entries),method='trf')
alpha_p, beta_p, alpha_n, beta_n = opti.x
jac = opti.grad
#stat = opti.status
print("alpha p: ", alpha_p)
print("beta p: ", beta_p)
print("alpha n: ", alpha_n)
print("beta n: ", beta_n)
print(jac)
o_p = ocp_pe(alpha_p, beta_p, ocp_cathode, soc_values)
o_n = ocp_ne(alpha_n, beta_n, ocp_anode, soc_values)
o = ocv_cell(soc, ocv_entries)
ocv_cat = []
ocv_an = []
for j in o.keys():
ocv_cat.append(o_p[j])
ocv_an.append(o_n[j])
ocv_pred = np.array(ocv_cat) - np.array(ocv_an)
plt.figure(figsize=(10, 6))
plt.plot(list(o_p.keys()), list(o_p.values()), label="Cathode")
plt.plot(list(o_n.keys()), list(o_n.values()), label="Anode")
plt.plot(list(o.keys()), ocv_pred, label="OCV Predicted")
plt.plot(list(o.keys()), list(o.values()), label ="OCV Measured")
plt.xlabel("State of Charge (SoC)")
plt.ylabel("Open Circuit Potential (OCP) [V]")
plt.title("Open Circuit Potential")
plt.grid(True)
plt.legend()
plt.show()
initial_guess = np.array([1.2,-0.1,1.2,-0.1])
LSMM(initial_guess, ocp_cathode, ocp_anode, soc_values, soc, ocv_entries)
`
我尝试过各种其他初始猜测,但总是得到相同的猜测。
您的代码计算损失函数。但
least_squares
预计会有残差。
diff
应该是残差向量,例如:
diff = ocv_pred - np.array(list(ocv.values())
您可以使用参数
scipy.optimize.(f,x,loss=...)
来定位特定的损失函数。您可以在 scipy 文档 中查看变体。
如果你想使用损失函数,我建议使用
scipy.optimize.minimize
。