平滑拟合函数

时间:2019-03-14 14:42:28

标签: python numpy scipy

大家下午好

我一直在尝试平滑我作为指数拟合过程输出的拟合函数。我正在使用的代码行如下所示:

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

x = (0.005, 0.025, 0.05, 0.075, 0.1)
y = (1.0, 0.7261356155365372, 0.5170068027210885, 0.3651525126179504, 0.26135615536537193)
plt.plot(x, y, "r")
x = np.array(x, dtype=float)
y = np.array(y, dtype=float)
def func(x, a, b):
    return a * np.exp(-b * x)
popt, pcov = curve_fit(func, x, y)
print(popt[0], popt[1])

plt.plot(x, func(x, *popt), "b")
plt.legend(loc='best')
plt.show()

My graphical output

输出在数学上令人满意,并且我的拟合值print(popt[0], popt[1])完全合理。主要问题是蓝线(拟合功能)不平滑。我一直在研究函数平滑化,但是没有发现任何适用于拟合函数的函数,并且对我原始数据集起作用的函数(例如numpy的np.linspace())没有帮助。

非常感谢能帮助我完成此任务的任何人!

1 个答案:

答案 0 :(得分:4)

因此,该函数绝对是平滑的,因为它是一个很好的指数。问题在于您将其绘制在非常粗糙的网格x上。当然,您要在拟合曲线时保持x固定,因为x的值对应于您的已知观测值y。但是在绘制时我们可以使用其他域,如下所示。

plt.plot开头的行替换为:

new_x = np.linspace(0, 0.1) # or whatever domain you like
plt.plot(new_x, func(new_x, *popt), "b")
plt.legend(loc='best')
plt.show()

你应该很好。