首页 > 解决方案 > 如何将数据点拟合到 Python 中的函数 e**x?

问题描述

我目前正在尝试将一组数据点拟合到函数 e^x 中。似乎数据点绘制得很好,但无论出于何种原因,当我尝试拟合 e^x 时,结果都是一条水平线。数据点是指数的。谁能看到可能导致此问题的原因?

以下是一些示例数据:csv 数据

这是代码:

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

x_data, y_data = np.loadtxt("analog-data.csv", unpack=True, delimiter=',')

def func1(x, a, b, c):
return a + (b * (e**(c * x)))

initialGuess = [1, -1, -1]

params, params_covariance = curve_fit(func1, x_data, y_data, p0=initialGuess, absolute_sigma=True)
print(params)

plt.plot(x_data, func1(x_data, params[0], params[1], params[2]), color='orange', label='Sin Fit')
plt.plot(x_data, (y_data - func1(x_data, params[0], params[1], params[2])), 'o', color='orange')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.title('Title')
plt.legend()
plt.show()

标签: pythonmatplotlibscipycurve-fitting

解决方案


您的第二个绘图功能似乎有问题。您的曲线拟合在原始 x 和 y 数据上,但您正在绘制 xdata 和 ydata-stuff。仅在 xdata 和 ydata 上将 plt.plot 替换为 plt.scatter。

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

x_data = np.array([500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500])
y_data = np.array([31.64, 63.20, 75.1, 84.77 , 90.82, 94.24 ,96.39 ,97.95 ,98.63])

def func1(x, a, b, c):
    return a + b*np.exp(c * x)

initialGuess = np.array([0, -1, 0])

params, params_covariance = curve_fit(func1, x_data, y_data, p0=initialGuess, absolute_sigma=True)
print(params)
# print(params_covariance)

plt.plot(x_data, func1(x_data, params[0], params[1], params[2]), color='orange', label='Sin Fit')
# plt.plot(x_data, (y_data - func1(x_data, params[0], params[1], params[2])), 'o', color='orange')
plt.scatter(x_data, y_data)
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.title('Title')
plt.show()

输出图


推荐阅读