解決したい問題
あるデータをガウシアンでフィットした場合など、得られるパラメータの値と誤差の桁はパラメータによって大きく違うことがある。
$$ p_1 \exp \left(- \frac{(x-p_2)^2}{2p_3^2} \right)$$
例えば scipy.optimizee.leastsq
で得られた値を
$p_1 = 1000 \pm 20$
$p_2 = 300.3 \pm 0.4$
$p_3 = 5.05 \pm 0.06$
のように表示したくても、パラメータの桁数を指定する方法では
p1 = 1000.00 +- 20.34
p2 = 300.30 +- 0.45
p3 = 5.05 +- 0.06
と不恰好になるし、指数表示でも
p1 = 1.000+e03 +- 2.034+e01
などのように不要な桁が現れる。
お手製の解決法
def format_with_error(p, dp):
if dp == 0:
return f"{p}"
if dp >= 1:
return f"{p:.0f} ± {dp:.0f}"
dp_str = f"{dp:.10f}"
decimal_places = len(dp_str.split('.')[1].rstrip('0'))
return f"{p:.{decimal_places}f} ± {dp:.{decimal_places}f}"
専用のライブラリuncertainties
from uncertainties import ufloat
v = ufloat(p,dp)
print(f"{v:.1u}")
可読性が上がった