実は手ごわいuncertaintiesモジュール

元ネタ
曖昧な数値を曖昧なまま計算できるPythonのモジュール uncertainties


これを読んだときはあまりよくわからなかったけど、インストールしていざ使ってみると、これはそんなに簡単なものではないようです。

from uncertainties import ufloat
from uncertainties.umath import *

x = ufloat("0.0+/-3.0")
print sin(x)
0.0+/-3.0

はい?
もうちょっと簡単な例で試してみましょう。

x = ufloat("0.0+/-3.0")
print x * 2
0.0+/-6.0

これは簡単ですね。

print ufloat("0.0+/-3.0") + ufloat("0.0+/-3.0")
0.0+/-4.24264068712

つまり、後ろの数は標準偏差なんですね。足すと分散が和になるので、√(32 + 32) = 3√2ということです。掛け算だともう少し難しくて、

print ufloat("1.0+/-0.1") * ufloat("2.0+/-0.1")
2.0+/-0.22360679775

これは√5/10ですね。このあたりはリンク先を辿ってくと公式が載っているところがあります。


Propagation of uncertainty - Wikipedia, the free encyclopedia

ここで、上のような計算では相関係数ρは0です。
さて、最初の例はなんだったのでしょう。

print sin(ufloat((math.pi / 3, 0.1)))
0.866025403784+/-0.05

π/3で傾きが1/2だから、それで近似しているわけですね。0なら傾きが1だから、上のようになると。関数はそういう仕組みになっているようですね。


元記事を書いている人は分かっていても、読んだだけの人はあまりわかっていないんじゃないかなあ。