使用scipy.optimize.curve_fit绘制图

时间:2018-07-08 08:49:39

标签: python matplotlib scipy

我在理解PdfFixedDocument doc = new PdfFixedDocument(); // Default page is portrait letter PdfPage page = doc.Pages.Add(); // Create a landscape letter page page.Rotation = 90; 函数时遇到麻烦。我的拟合函数是幂律。但是我不知道plot命令中的第二个值应该是什么?首先,我们必须调用函数optimize.curve_fit,它将返回拟合线,但我们没有调用此函数。我想知道这个命令的工作方式。

ff(L,v)

1 个答案:

答案 0 :(得分:0)

plot命令可绘制x与y值,因此您必须根据定义的函数ff计算相应的y值。由于pfit是作为数组返回的,因此您在调用fit函数ff时必须解压缩这些值。如果您知道自己有两个系数,则当然可以像v, k = pfit那样提取它们,并使用ff(x, v, k)计算y值。但是,如果稍后将拟合函数更改为L**(-1/v) * k + a怎么办?然后,您将不得不重写代码。一种更简单的方法是将其留给Python,以使用*pfit解包系数:

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

#define some sample data
x = np.arange(1, 6)
y = np.asarray([100, 37, 18, 3, 1])

#fitting function with more than one parameter to fit
def ff(L, v, k):
    return L**(-1/v) * k

pfit, perr = curve_fit(ff,x,y)
print(pfit)

#plot original data
plt.plot(x, y, "ro", label = "data")
#calculate y-values
y_fit = ff(x, *pfit)
#plot fitted curve
plt.plot(x, y_fit, "b", label = "fit")
plt.legend()
plt.show()

这当然不足以令人印象深刻,拟合曲线看起来根本不平滑: enter image description here

为克服这一点,我们可能想创建一个分辨率更高的x值范围,并绘制该值而不是原始的x值数据:

x_fit = np.linspace(np.min(x), np.max(x), 1000)
plt.plot(x_fit, ff(x_fit, *pfit), "b", label = "fit")

现在好多了:

enter image description here