Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在强制曲线形状时拟合数据点_Python_Matplotlib_Data Fitting - Fatal编程技术网

Python 在强制曲线形状时拟合数据点

Python 在强制曲线形状时拟合数据点,python,matplotlib,data-fitting,Python,Matplotlib,Data Fitting,我试图用多项式曲线拟合2D数据点;见下图。蓝点是数据。蓝色虚线是适合这些点的二阶多项式。我想强制我的拟合具有与黑线完全相同的形状,并且我想计算新拟合相对于黑色曲线的y偏移。有没有关于如何做到这一点的想法?提前谢谢 x = np.linspace(6.0,12.0,num=100) a = -0.0864 b = 11.18 c = 9.04 fit_y = a*(x - b)**2 + c # black line z = np.polyfit(data_x,data_y,2) zfit=

我试图用多项式曲线拟合2D数据点;见下图。蓝点是数据。蓝色虚线是适合这些点的二阶多项式。我想强制我的拟合具有与黑线完全相同的形状,并且我想计算新拟合相对于黑色曲线的y偏移。有没有关于如何做到这一点的想法?提前谢谢

x = np.linspace(6.0,12.0,num=100)

a = -0.0864
b = 11.18
c = 9.04
fit_y = a*(x - b)**2 + c # black line

z = np.polyfit(data_x,data_y,2)

zfit=z[2]+z[1]*x+z[0]*x**2

fig, ax = plt.subplots()
ax.plot(data_x,data_y,'.',color='b')
ax.plot(x,fit_y,color='black') #curve of which we want the shape
ax.plot(x,zfit,color='blue',linestyle='dashed') #polynomial fit
ax.set_xlim([6.5,11.0])
ax.set_ylim([6.5,10.5])
plt.show()

编辑:这是我问题的解决方案:

x = np.linspace(6.0,12.0,num=100)

# We want to keep a and b fixed to keep the same shape
# a = -0.0864     
# b = 11.18
c = 9.04

#Only c is a variable because we only want to shift the plot on the y axis
def f(x, c):
    return -0.0864*(x - 11.18)**2 + c

popt, pcov = curve_fit(f, data_x, data_y)  # popt are the fitted parameters

plt.plot(data_x, data_y,'.') #blue data points
plt.plot(x,f(x, c),'black') #black line, this is the shape we want our fit to have

plt.plot(x, f(x, *popt), 'red')  # new fitted line to the data (with same shape as black line)

plt.xlim([6.5,11.0])
plt.ylim([6.5,10.5])

plt.show()

print("y offset:", popt[0] - c)
y偏移量:0.2349238387717355

您要使用的。正如您在文档中看到的,您可以使用要拟合的参数定义自己的函数
fit_y
。拟合完成后,您可以计算y偏移(相对于原点?),只需在
x=0
中计算函数即可。下面我向您展示了一个使用根函数的示例代码(这是黑色曲线的样子):


我没有足够的声誉来发布这个情节,但只要运行代码就可以看到你自己。

欢迎使用Stack Overflow。你能告诉我们到目前为止你都做了些什么吗?特别是关于你如何找到合适的。请查收谢谢!我尝试过二阶多项式拟合,但我不知道如何在这个拟合上强制一个形状。我已经用这些信息编辑了我的帖子。为什么你会说
scipy.optimize.curve\u fit
numpy.polyfit
更好呢?这能回答问题吗?正如德鲁顿所说:“我想强迫我的身材与黑线的形状完全相同。”。为了做到这一点,他必须知道曲线的函数形式f(x)。即使任何函数都可以重写为多项式(泰勒),为什么要猜测多项式的阶数,而我们可以简单地拟合f(x)中的系数?我明白了,所以你假设黑线的函数依赖性是已知的。不确定这个假设是否合理,但OP对此并不十分清楚。是的,黑线的分布是已知的:a*(x-b)**2+c,其中a=-0.0864,b=11.18,c=9.04。谢谢Logozoe。在你的帮助下我找到了答案。我只需要对c参数使用曲线拟合,同时保持a和b固定。
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

def f(x, a, b, c):
    return a * np.power(x, b) + c


x_data = np.arange(100)
noise = np.random.normal(size=100)
y_data = np.power(x_data, 0.5) + noise
y = f(x_data, 1, 2, 0.3)  # random values to initialize the fit
popt, _ = curve_fit(f, x_data, y_data)  # popt are the fitted parameters

plt.scatter(x_data, y_data)
plt.plot(x_data, f(x_data, *popt), 'r')  # fitted line
plt.show()

print("y offset:", f(0, *popt))