【问题标题】:More accurate curve fitting更准确的曲线拟合
【发布时间】:2020-01-27 22:57:06
【问题描述】:

我在 scipy 中使用 curve_fit 函数进行了曲线拟合。 但是,曲线拟合对我来说并不好。有什么办法可以改善曲线拟合? 下面是我写的python代码。

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

minus_eta_total =[-0.004, -0.0116, -0.02604, -0.04, -0.08, -0.12, -0.16, -0.2, -0.24, -0.288, -0.3456, -0.4]

I_d_infil_0_sub_1 = [0.004204675, 0.012262849, 0.028331318, 0.045626793, 0.113222124, 0.224759087, 0.403571293, 0.678854397, 1.090002487, 1.837299526, 3.260471157, 5.311900419]
ASR_el = 0.0075

eta_infil_0_sub_1 = np.array(minus_eta_total) + (np.array(I_d_infil_0_sub_1)*np.array(ASR_el))

cons_eq = 8.3144 * 1073 / (0.5 * 4 * 96485)

def func(x, a, b):
    return -cons_eq*np.log(x/a)-b*x

popt_infil_0_sub_1, pcov_infil_0_sub_1 = curve_fit(func, I_d_infil_0_sub_1, eta_infil_0_sub_1)

plt.clf()

plt.plot(I_d_infil_0_sub_1, eta_infil_0_sub_1, linestyle = '--',  marker='o', color='k', label = 'original')
plt.plot(I_d_infil_0_sub_1, func(np.asarray(I_d_infil_0_sub_1),*popt_infil_0_sub_1), 'k', label='fit: $\mathit{j_0}$=%5.4f, R$_{ohm}$=%5.4f' % tuple(popt_infil_0_sub_1))

plt.ylim(-0.42, 0.02)
plt.xticks(np.arange(0, 12, 2))
plt.yticks(np.arange(0, -0.42, -0.05))
plt.xlabel('$\mathit{j}$ ($A/cm^2$)', fontsize=14)
plt.ylabel('-\u03b7$_c$ (V)', fontsize=14)  # \u03bcm = micro(\u03bc) + meter(m)
plt.legend(loc='upper right')
plt.show(block = False)

【问题讨论】:

  • 从什么意义上说它对您不利? (提示:这通常是问题所在,您需要向算法传达您想要的曲线拟合类型)
  • 我用 scipy 的差分进化遗传算法提供的初始参数估计值尝试了你的代码,并且产生了与你相同的拟合 - 也就是说,它并不比 curve_fit 的所有 1,0 的默认参数估计值更好.我知道改善拟合的唯一方法是使用不同的方程,我可以建议 - 这对你的工作有什么用吗?
  • @MatthieuBrucher 我尝试使用 y = -Aln(x/a)-Bx 之类的方程,但拟合图不能很好地反映这些点。有没有更好的方法来拟合更准确?
  • @JamesPhillips 我应该考虑一下我可以使用的其他方程式。不管怎样,谢谢你的建议。

标签: python scipy curve-fitting


【解决方案1】:

拟合不如预期的好,可能是因为选择的方程不太方便。

例如,如果我们选择方程式:

y(x)=(exp(-a*x)-1)/a

和拟合标准:最小均方相对误差,

a=10.17

结果是 MSRE=0.052

考虑到只有一个参数的如此简单的方程,这是一个非常好的结果。

当然,更精确的拟合当然可以通过选择更复杂的方程和更多可调参数来实现。

【讨论】:

    猜你喜欢
    • 2018-04-27
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2021-01-19
    • 2021-01-17
    相关资源
    最近更新 更多