scipy.optimize.least_squares() 运行 5 次并每次都返回初始猜测

问题描述 投票:0回答:1

我正在运行最小二乘优化,根据测量值拟合我的数据。我创建了一个成本函数,所有函数参数似乎都很好,但结果与我提供的最初猜测完全相同。一点也不偏离。

感谢您提前提供的帮助。

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) 

`

我尝试过各种其他初始猜测,但总是得到相同的猜测。

python optimization scipy scipy-optimize least-squares
1个回答
0
投票

您的代码计算损失函数。但

least_squares
预计会有残差。
diff
应该是残差向量,例如:

diff = ocv_pred - np.array(list(ocv.values())

您可以使用参数

scipy.optimize.(f,x,loss=...)
来定位特定的损失函数。您可以在 scipy 文档 中查看变体。

如果你想使用损失函数,我建议使用

scipy.optimize.minimize

© www.soinside.com 2019 - 2024. All rights reserved.