【问题标题】:Curve fit with an list of point曲线拟合点列表
【发布时间】:2020-06-26 14:04:42
【问题描述】:

我的一个 python 脚本根据处理持续时间给了我一些结果,我这样显示:

现在我想追踪最接近结果演变的函数曲线。

经过几次研究,我发现最好的工具是 scipy.optimize 的 curve_fit。 只有一个问题,函数 curve_fit 需要一个函数的第一个参数(如果我很好地理解文档的示例)但我在图表上的点不是函数的结果,所以我不不知道该放什么。

有人可以帮我解决这个问题或建议我另一种方法吗?

谢谢。

【问题讨论】:

  • 找到合适的功能是你的责任。

标签: python python-2.7 numpy matplotlib scipy


【解决方案1】:

当你说“现在我想跟踪函数的曲线,它最接近结果演变”时,你必须记住某种曲线,它是数据的理想形式。那么,这个功能是什么?在曲线拟合中,该函数称为“模型函数”——对数据建模的函数。

这样想:您有 50 个左右的测量点。您可能会相信它们都非常准确且没有错误。但是,既然您询问了曲线拟合,那么情况可能并非如此。也就是说,您可能认为数据中存在一些噪声或错误,并且数据可以用一个理想化的函数来表示,该函数的参数少于 50 个左右(我猜是 4 个左右)。

解释您的模型的理想化函数(并允许在您未测量的“持续时间”点预测“最佳”值)是“模型函数”。如果你有这个,曲线拟合可以提供帮助:你编写那个函数(它可能取决于一些参数)在 python 中对数据进行建模并找到参数的最佳值,以便模型与你的数据匹配。如果你没有那个,你所说的“曲线拟合”是什么意思?

您可以通过数据绘制样条曲线或以其他方式平滑数据,但这几乎没有能力预测与“在不担心噪声影响的情况下对数据进行插值/外推”不同的新值。

【讨论】:

    【解决方案2】:

    它看起来像一个“指数方法”类型的曲线,就像你为电容器充电所得到的一样 - 请参阅here。

    所以,我将从这个公式开始:

    y = a * ( 1 - n * np.exp(-b*x))
    

    如果我用 Matplotlib 绘制它:

    #!/usr/bin/env python3
    
    import numpy as np
    import matplotlib.pyplot as plt
    
    # Make 100 samples along x-axis, from 0..10
    x = np.linspace(0,10,100)
    
    # Make an exponential approach type of curve
    a = 17000
    n = 1
    b = 3
    y = a * ( 1 - n * np.exp(-b*x))
    
    # Plot it
    plt.title(f'Plot for a={a}, n={n}, b={b}')
    plt.plot(x,y)
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      相关资源
      最近更新 更多