【问题标题】: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()