Aquí está el enfoque cuantitativo (simulación) que mencionó @Dr. Momo: podemos simular algunos puntos para $x_i$ y $F_i$, asignarles algunos errores gaussianos, estimar $k$ con los dos enfoques y ver qué tan cerca están las estimaciones del verdadero parámetro.
Los supuestos subyacentes a esta simulación son probablemente una buena aproximación para experimentos simples de laboratorio, pero uno debe tener cuidado al elegir el método a aplicar a un problema específico para verificar cómo se distribuyen las incertidumbres; no todo es gaussiano en realidad, y descifrar estas distribuciones es un asunto complicado.
Dicho eso: estos dos estimadores, aunque ambos sin sesgo, difieren en su varianza (@usuario551504 ha discutido la razón por la cual).
El resultado se ve así: la normalización es irrelevante, pero se puede ver claramente que los errores son en promedio más pequeños con el enfoque de ajuste lineal.
Aquí está el código (en python - también requiere los paquetes numpy
y matplotlib
):
import numpy as np
import matplotlib.pyplot as plt
# desviaciones estándar de los errores de x y F
sigma_x = .1
sigma_F = .1
# parámetro elástico verdadero
k_true = 1.
# número de puntos de medida ficticios
n_measurement_points = 20
# número de pruebas a realizar
n_trials = 1000
def trial(seed: int):
# generar puntos x igualmente espaciados entre 1 y 20, inclusive
xi = np.linspace(1, 20, num=n_measurement_points)
# generar las fuerzas "verdaderas", de acuerdo con la ley lineal
# (sin el signo negativo por simplicidad, no cambia nada)
Fi = k_true * xi
# agregar ruido aleatorio gaussiano a x y F
rng = np.random.default_rng(seed)
xi += rng.normal(scale=sigma_x, size=xi.shape)
Fi += rng.normal(scale=sigma_F, size=Fi.shape)
# estimar el parámetro elástico con los dos enfoques
k_estimate_avg = 1 / n_measurement_points * np.sum(Fi / xi)
k_estimate_fit = np.sum(Fi * xi) / np.sum(xi**2)
return k_estimate_avg - k_true, k_estimate_fit - k_true
# realizar la prueba varias veces para obtener estadísticas sobre la varianza
# del estimador
avg_errs = []
fit_errs = []
for n in range(n_trials):
# sembramos el RNG con el índice del bucle for - no importa realmente,
# es útil para la reproducibilidad
err_avg, err_fit = trial(n)
avg_errs.append(err_avg)
fit_errs.append(err_fit)
# hacer un histograma de los resultados
plt.hist(avg_errs, alpha=.5, density=True, label='promedio')
plt.hist(fit_errs, alpha=.5, density=True, label='ajuste')
plt.xlabel('Estimación menos verdadero $k$')
plt.ylabel('Densidad de probabilidad')
plt.legend()
# para guardar la figura, se puede hacer
# plt.savefig('ajuste_lineal_vs_avg.png', dpi=150)
# para mostrarla de forma interactiva, en cambio, hacer
# plt.show()
También señalaré que el resultado es cualitativamente el mismo incluso si los errores solo se incluyen para $x$ o para $F$.