У меня есть некоторые данные из лаборатории, которые я подгоняю к функции
f(s, params) = amp * (s/sp) / (1 + s/sp + 1,041) + bg (не смог понять, как это ввести)
Я установил absolute_sigma=True для curve_fit, чтобы получить абсолютные неопределенности параметров (sp, amp, bg), но вычисленную ошибку из np. sqrt(np.diag(pcov)) кажется необоснованным. Смотрите сюжет ниже. Синие точки — это данные. Красная линия — это f(s, *popt). Зеленая линия заменяет оптимальное значение sp на sp — это ошибка, рассчитанная по np.sqrt(np.diag(pcov)). Оранжевая линия — это sp + то же значение.

Я ожидаю, что линии +/- будут намного ближе к красной линии.
Вот минимальный пример:
# Функция для подгонки def рассеяния_rate(s, sp, amp, bg): возвратный усилитель * (с/сп) / (1 + с/сп + (-20/19,6)**2) + bg # данные s = np.array([0,6, 1,2, 2,3, 4,3, 8,1, 15,2, 28,5, 53,4]) y = np.array([8.6, 8.5, 8.9, 9.5, 10.6, 12.6, 15.5, 18.3]) # Подгоним данные к скорости насыщенного рассеяния popt, pcov = Curve_fit (скорость_рассеяния, с, у, Absolute_sigma=True) print('Подобрать параметры', popt) print('Подобрать неопределенности', np.sqrt(np.diag(pcov))) # Построить подгонку на основе оптимизированных параметров fit_s = np.linspace(np.min(s), np.max(s), 100) fit = рассеивание_rate(fit_s, *popt) # Рассмотрим одну ошибку в значении sp fit_plus_err = saturation_power(fit_s, popt[0] + np.sqrt(np.diag(pcov))[0], popt[1], popt[2]) fit_minus_err = saturation_power(fit_s, popt[0] - np.sqrt(np.diag(pcov))[0], popt[1], popt[2]) # Сюжет plt.plot(s, y, '-o',markeredgecolor='k', label='data') plt.plot(fit_s, fit_plus_err, label='sp + err') plt.plot(fit_s, fit_minus_err, label='sp - err') plt.plot(fit_s, fit, '-r', label='opt sp') plt.xlabel('s') plt.ylabel('y') plt.legend() plt.grid() plt.show()