$u = \frac{\hat\sigma}{\sqrt{n}}$
где $\hat\sigma = \frac{\sum(x-\bar{x})}{\sqrt{n-1}}$
Эта неопределенность исчезнет по мере отбора проб $n \rightarrow \infty$, однако неопределенность все еще остается к самому прибору (неопределенность типа B). Обычно предполагается, что эти два числа можно сложить квадратично.
Что, если это сделать с помощью аппроксимации кривой? Я пытался сделать что-то вроде этого

< /p>
Это можно легко сделать с помощью scipy.optimize.curve_fit:
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
data_length = 10000
x = np.array(range(data_length))
y = 5 * np.ones(data_length) + np.random.normal(0, 1, data_length)
u_y = 1 * np.ones(data_length)
def func(x, b):
return x*0 + b
popt, pcov = curve_fit(func, x,y, sigma=u_y, absolute_sigma=False)
# generate the plot
plt.errorbar(x, y, yerr=u_y, fmt='o')
plt.plot(x, func(x, *popt), 'r-')
plt.show()
print(popt)
print(np.sqrt(np.diag(pcov)))
Как выяснилось, ошибка $\rightarrow 0$ при $n \rightarrow \infty$, следовательно, это означает, что есть какой-то способ превзойти точность прибора, выполнив огромное количество измерений, что звучит совершенно нереально. Кроме того, я обнаружил, что если я масштабирую сигму на sigma=1e6*u_y , ошибка popt не затрагивается, что означает, что сигма в этой функции не работает, поскольку что-то соответствует неопределенности измерения, заданного инструментом.< /p>
Я просмотрел документацию и обнаружил, что мне следует установить Absolute_sigma=True. Я пробовал, но, похоже, он всегда возвращает 1/np.sqrt(data_length), и случайность самого набора данных не играет никакой роли. Кроме того, меня продолжает беспокоить тот факт, что эта ошибка также исчезает при $n \rightarrow \infty$.
как правильно включить погрешность инструмента в аппроксимацию кривой? Что на самом деле означает здесь сигма? Как включить этот термин в настоящую кривую, если у вас есть несколько параметров? Я попробовал решить линейную задачу
sampling_points = int(1e2)
x = np.linspace(0, 1, sampling_points)
y = 5 * x + np.random.normal(0, 1, sampling_points)
u_y = 1 * np.ones(sampling_points)
def func(x, a, b):
return x*a + b
popt, pcov = curve_fit(func, x,y, sigma=1*u_y, absolute_sigma=False)
print("sample points: ", sampling_points)
print("k={pop[0]:.2f}, b={pop[1]:.2f}".format(pop=popt))
print("error of k: ", np.sqrt(pcov[0,0]))
print("error of b: ", np.sqrt(pcov[1,1]))
и все равно оказывается, что вы можете полностью устранить свою ошибку, увеличив точку данных
sample points: 100
k=4.74, b=0.23
error of k: 0.37312467183800596
error of b: 0.2159669523150594
и
sample points: 1000000
k=5.01, b=-0.00
error of k: 0.0034627280798220374
error of b: 0.0019992075688566534
Подробнее здесь: https://stackoverflow.com/questions/792 ... -curve-fit
Мобильная версия