0

我有一些来自研究的数据(xy坐标),我必须绘制它们并找到适合数据的最佳曲线。我的曲线是:

  • 多项式高达 6 次;
  • 幂律;
  • 指数的。

我能够找到最适合多项式的

while(i < 6):
    coefs, val = poly.polyfit(x, y, i, full=True)

我采取最小化的程度val

当我必须拟合幂律(在我的研究中最有可能)时,我不知道如何正确地做到这一点。这就是我所做的。我已将 log 函数应用于所有函数,xy尝试将其与线性多项式拟合。如果误差 (val) 低于之前尝试过的其他多项式,我选择幂律函数(如果直线的 m 为负值,自然会选择)。我对么?

现在我怎样才能从线开始重建我的幂律y = mx + q以便用原始点绘制它?我还需要显示找到的功能。

我尝试过:

def power_law(x, m, q):
    return q * (x**m)

使用

x_new = np.linspace(x[0], x[-1], num=len(x)*10)
y1 = power_law(x_new, coefs[0], coefs[1])
popt, pcov = curve_fit(power_law, x_new, y1)

但得到的曲线不适合数据。

4

1 回答 1

3

如果你用谷歌搜索“曲线拟合”这个短语,我的网站是最高回报 - 所以我对这类事情有所了解。

我建议不要对数据进行任何对数或其他转换,因为 scipy 有一个非线性求解器,非常适合这种类型的拟合。看着:

http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html

我在我的网站上使用了 scipy 非线性求解器,它可以直接在线拟合您的数据。尝试:

http://zunzun.com/Equation/2/Power/Standard%20Power/

并确保没有实验引入的偏移,例如直流偏移电压,请尝试:

http://zunzun.com/Equation/2/Power/Standard%20Power%20With%20Offset/

非线性拟合可能遇到的一个问题是为非线性求解器选择一组合适的起始参数以进行迭代优化。该网站的 BSD 许可源代码使用遗传算法自动确定起点,因此您可能想自己尝试一下。它附带了许多示例,包括一个“函数查找器”,它适合数百个方程并对它们进行排序——您也可以在线尝试。源代码位于 Google 代码存储库中:

https://code.google.com/p/pyeq2/

或指向压缩和 tgz 源分发的链接位于网站每个页面的底部。

如果您有任何问题,请直接与我联系,我很乐意为您提供帮助。我喜欢这个东西。

詹姆斯 zunzun@zunzun.com

于 2014-06-08T11:15:15.193 回答