python 中的非线性曲线拟合程序
Non-linear curve-fitting program in python
我想找到并绘制一个函数 f,它表示拟合在我已知的一些设定点 x 和 y 上的曲线。
经过一些研究,我开始尝试使用 scipy.optimize 和 curve_fit,但在参考指南中,我发现该程序使用一个函数来拟合数据,它假设 ydata = f(xdata, *参数) + eps.
所以我的问题是:我必须在我的代码中更改什么才能使用 curve_fit 或任何其他库来使用我的设置点找到曲线的函数? (注意:我也想知道该功能,以便稍后为我的项目集成并绘制它)。我知道这将是一个衰减的指数函数,但不知道确切的参数。这是我在我的程序中尝试过的:
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
xdata = np.array([0.2, 0.5, 0.8, 1])
ydata = np.array([6, 1, 0.5, 0.2])
plt.plot(xdata, ydata, 'b-', label='data')
popt, pcov = curve_fit(func, xdata, ydata)
plt.plot(xdata, func(xdata, *popt), 'r-', label='fit')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
目前正在 Raspberry Pi 上开发这个项目,如果它有什么变化的话。并且想使用最小二乘法,因为它非常精确,但欢迎使用任何其他效果很好的方法。
同样,这是基于 scipy 库的参考指南。另外,我得到以下图表,它甚至不是曲线:Graph and curve based on set points
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
#c is a constant so taking the derivative makes it go to zero
def deriv(x, a, b, c):
return -a * b * np.exp(-b * x)
#Integrating gives you another c coefficient (offset) let's call it c1 and set it equal to zero by default
def integ(x, a, b, c, c1 = 0):
return -a/b * np.exp(-b * x) + c*x + c1
#There are only 4 (x,y) points here
xdata = np.array([0.2, 0.5, 0.8, 1])
ydata = np.array([6, 1, 0.5, 0.2])
#curve_fit already uses "non-linear least squares to fit a function, f, to data"
popt, pcov = curve_fit(func, xdata, ydata)
a,b,c = popt #these are the optimal parameters for fitting your 4 data points
#Now get more x values to plot the curve along so it looks like a curve
step = 0.01
fit_xs = np.arange(min(xdata),max(xdata),step)
#Plot the results
plt.plot(xdata, ydata, 'bx', label='data')
plt.plot(fit_xs, func(fit_xs,a,b,c), 'r-', label='fit')
plt.plot(fit_xs, deriv(fit_xs,a,b,c), 'g-', label='deriv')
plt.plot(fit_xs, integ(fit_xs,a,b,c), 'm-', label='integ')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
我想找到并绘制一个函数 f,它表示拟合在我已知的一些设定点 x 和 y 上的曲线。
经过一些研究,我开始尝试使用 scipy.optimize 和 curve_fit,但在参考指南中,我发现该程序使用一个函数来拟合数据,它假设 ydata = f(xdata, *参数) + eps.
所以我的问题是:我必须在我的代码中更改什么才能使用 curve_fit 或任何其他库来使用我的设置点找到曲线的函数? (注意:我也想知道该功能,以便稍后为我的项目集成并绘制它)。我知道这将是一个衰减的指数函数,但不知道确切的参数。这是我在我的程序中尝试过的:
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
xdata = np.array([0.2, 0.5, 0.8, 1])
ydata = np.array([6, 1, 0.5, 0.2])
plt.plot(xdata, ydata, 'b-', label='data')
popt, pcov = curve_fit(func, xdata, ydata)
plt.plot(xdata, func(xdata, *popt), 'r-', label='fit')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
目前正在 Raspberry Pi 上开发这个项目,如果它有什么变化的话。并且想使用最小二乘法,因为它非常精确,但欢迎使用任何其他效果很好的方法。 同样,这是基于 scipy 库的参考指南。另外,我得到以下图表,它甚至不是曲线:Graph and curve based on set points
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
#c is a constant so taking the derivative makes it go to zero
def deriv(x, a, b, c):
return -a * b * np.exp(-b * x)
#Integrating gives you another c coefficient (offset) let's call it c1 and set it equal to zero by default
def integ(x, a, b, c, c1 = 0):
return -a/b * np.exp(-b * x) + c*x + c1
#There are only 4 (x,y) points here
xdata = np.array([0.2, 0.5, 0.8, 1])
ydata = np.array([6, 1, 0.5, 0.2])
#curve_fit already uses "non-linear least squares to fit a function, f, to data"
popt, pcov = curve_fit(func, xdata, ydata)
a,b,c = popt #these are the optimal parameters for fitting your 4 data points
#Now get more x values to plot the curve along so it looks like a curve
step = 0.01
fit_xs = np.arange(min(xdata),max(xdata),step)
#Plot the results
plt.plot(xdata, ydata, 'bx', label='data')
plt.plot(fit_xs, func(fit_xs,a,b,c), 'r-', label='fit')
plt.plot(fit_xs, deriv(fit_xs,a,b,c), 'g-', label='deriv')
plt.plot(fit_xs, integ(fit_xs,a,b,c), 'm-', label='integ')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()