如何在Python中将条件设置为线性拟合?

时间:2019-06-17 18:36:00

标签: python numpy scipy curve-fitting

我有一个任意定义的点集,我希望它们符合线性关系M = km + c,其中k是斜率,c是某个常数。我还想将条件设置为21(1-k)= c + 5。

我已经使用np.poly1d和sp.optimize.curve_fit来找到k和c的值,这两个值都相同,但是我找不到找到适用上述条件的方法。

这是poly1d版本:

arbitrary_x=[17.1,17.5,18.9,20.5]
arbitrary_y=[6,7,10,14]
plt.scatter (arbitrary_x, arbitrary_y, color='r', marker='x')

dparallax_fit = np.polyfit(arbitrary_x, arbitrary_y, 1)
j = np.poly1d(dparallax_fit)

x_dparallax_fit = np.linspace(16, 22, 100)
y_dparallax_fit = j(x_dparallax_fit)
plt.plot(x_dparallax_fit, y_dparallax_fit, color='purple')

这是sp.optimize.curve_fit选项。如您所见,我试图在linear_fit函数中声明条件,但无济于事:

m = np.linspace(16,22,100)

def find_lin_fit():
    #point and fit for the relationship between delta_parallax and d_max
    arbitrary_x=[17.1,17.5,18.9,20.5]
    arbitrary_y=[6,7,10,14]
    plt.scatter (arbitrary_x, arbitrary_y, color='r', marker='x')
    def linear_fit(m, k, c):
        #assert 21*(1-k)==c+5
        return k*m+c
    popt, pcov = sp.optimize.curve_fit(linear_fit, arbitrary_x, arbitrary_y)
    return popt, pcov

j = find_lin_fit()

plt.plot(m,j[0][0]*m+j[0][1], color='g')

两个结果均为ak = 2.33,c = -33.88,但是我再次希望满足21(1-k)= c + 5的条件,即使拟合与实际的线略有不同最合适。

此外,请随时指出我的代码中与惯例或冗余的任何差异。

编辑: 为了更具体地说明“发散”的含义,我希望通过拟合线来定义this图像中点的极限。您将可以在此图像中从上方看到带有红色x标记的任意点。使用其中一个值来查找另一个值并不能准确地满足限制,因此在以后的工作中,我仍然需要满足条件才能保证准确性。本质上,我需要使行在两个参数上稍有差异,同时保持数据限制的准确表示。

0 个答案:

没有答案