Как установить условие линейного соответствия в Python? - PullRequest
1 голос
/ 17 июня 2019

У меня есть произвольно определенный набор точек, которым я хочу соответствовать линейной зависимости 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 было выполнено, даже если подгонка немного отклоняется от фактической линии лучше всего подходит.

Кроме того, не стесняйтесь указывать на любые отклонения от соглашения или избыточности в моем коде.

EDIT: Чтобы быть более точным в том, что я подразумеваю под «расходиться», я бы хотел, чтобы линия соответствия определяла предел точек на этом изображении. На этом изображении вы сможете увидеть произвольные точки сверху, помеченные красными крестиками. Использование одного из значений для поиска другого не соответствует пределу точно, и мне все еще нужно выполнить условие для точности на последующих этапах моей работы. По сути, мне нужно, чтобы линия немного расходилась по обоим параметрам при сохранении точного представления предела данных.

...