【发布时间】:2020-05-07 16:51:27
【问题描述】:
我在尝试使用对数 y 轴拟合以下数据时做错了什么。代码和生成的图表如下。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def func(x, a, b, c):
return a * np.exp(-b * x) + c
fig, ax = plt.subplots()
x = np.array([88.08064516, 264.24193548, 440.40322581, 616.56451613, 792.72580645, 968.88709677, 1145.0483871, 1321.20967742, 1497.37096774, 1673.53225806, 1849.69354839, 2025.85483871, 2202.01612903, 2378.17741935, 2554.33870968, 2730.5, 2906.66129032, 3082.82258065, 3258.98387097, 3435.14516129, 3611.30645161, 3787.46774194, 3963.62903226, 4139.79032258, 4315.9516129, 4492.11290323, 4668.27419355, 4844.43548387, 5020.59677419, 5196.75806452, 5372.91935484, 5549.08064516])
y = np.array([210737, 2175, 514, 158, 90, 46, 27, 22, 10, 11, 3, 7, 3, 2, 0, 1, 1, 1, 0, 0, 1, 0, 0,0, 0, 0, 1, 0, 0, 0, 0,1])
popt, pcov = curve_fit(func, x, y)
ax.plot(x, func(x, *popt), 'g--')
ax.plot(x, y, 'ro', label='data')
ax.set_yscale('log') # I need to have the y-axis logarithmic
plt.show()
【问题讨论】:
-
curve_fit使用什么函数?它是来自一个包还是你自己写的? -
对不起,它来自 from scipy.optimize import curve_fit
-
所以我猜问题是执行拟合后的
popt值。你能打印出来吗? -
这很有帮助,因为
curve_fit以某种方式喜欢 在标准化范围内进行操作。但是我已经删除了我的评论,因为现在我看到您的数据看起来像是 在对数图中 的负参数的指数!!!!如果您尝试适合自己的不同功能,您会有更好的运气 -
例如,从
ln(y) = a exp(-(b x)) + c我们有(即Emacs 的calc有)y = exp(c + a exp(-(b x))),你可以尝试拟合这个双指数,不是吗?
标签: python matplotlib curve-fitting power-law