四則演算における精度
測定値は誤差を含む、すなわち測定値には有効桁数がある。岡本安晴「統計学を学ぶための数学入門[上]:算数から数学へ」培風館において、不等式(第1.6節)あるいは1次近似(第A.5節)によって四則演算の有効桁数について説明している。ここでは、シミュレーションによって四則演算の精度をグラフィカルに調べる。
上掲書第1.6節での例を用いてシミュレーションを行う。本ウェブサイトでのプログラムは、圧縮ファイルOpAccuPrg.zipにまとめられている。
1.足し算の場合
2つの物、AとB、の重さを、それぞれ精度が0.1gの計りと精度が0.01gの計りで測ったとき、150.2gと57.35gであった。AおよびBの真の重さをXgおよびYgであるとすると、次式が成り立つ。
このとき
である。 が、(1)式で表される区間において、どのように分布しているかを調べるため、次のプログラムを用意した。
import random
import matplotlib.pyplot as plt
n = 100000
data = []
vX = 150.2
minX = 150.15
maxX = 150.25
vY = 57.35
minY = 57.345
maxY = 57.355
for i in range(n):
X = random.uniform(minX,
maxX)
Y = random.uniform(minY,
maxY)
data.append(X + Y)
plt.title(("Possible real values
for\n" + \
"{0} + {1} = {2:.5}").format(vX, vY, vX + vY))
plt.hist(data, bins = 20)
plt.show()
上のプログラムを実行すると図1のグラフが表示される。
図1
ほぼ一様な分布である。これは、Aの値の誤差の変動がBの誤差の変動より大きく、Aの誤差の変動がBの誤差の変動を飲み込んでしまっているからと解釈できる。
AとBの値の誤差の変動を同じにした場合の足し算の真値の分布を調べるため、次のプログラムを用意した。
import random
import matplotlib.pyplot as plt
n = 100000
data = []
vX = 150.2
minX = 150.15
maxX = 150.25
vY = vX
minY = minX
maxY = maxX
for i in range(n):
X = random.uniform(minX,
maxX)
Y = random.uniform(minY,
maxY)
data.append(X + Y)
plt.title(("Possible real values
for\n" + \
"{0} + {1} = {2:.5}").format(vX, vY, vX + vY))
plt.hist(data, bins = 20)
plt.show()
このプログラムを実行すると、図2のグラフを得る。
図2
誤差の変動が同じ大きさのときは、足し算の真値の分布はピラミッド状になっている。
2.引き算の場合
引き算は、マイナスの足し算なので、足し算の場合と同様になる。
AとBの重さの差の場合の不等式は次式のようになる。
差の真値が、区間(2)において、どのように分布しているかを調べるため、次のプログラムを用意した。
import random
import matplotlib.pyplot as plt
n = 100000
data = []
vX = 150.2
minX = 150.15
maxX = 150.25
vY = 57.35
minY = 57.345
maxY = 57.355
for i in range(n):
X = random.uniform(minX,
maxX)
Y = random.uniform(minY,
maxY)
data.append(X - Y)
plt.title(("Possible real values
for\n" + \
"{0} - {1} = {2:.5}").format(vX, vY, vX - vY))
plt.hist(data, bins = 20)
plt.show()
上のプログラムを実行すると、図3のグラフが表示される。
図3
Bの誤差がAの誤差に飲み込まれて、の分布はほぼ一様になっている。
2つの測定値の誤差の分布の大きさを揃えたときの影響を見るために、次のプログラムを用意した。
import random
import matplotlib.pyplot as plt
n = 100000
data = []
vX = 150.2
minX = 150.15
maxX = 150.25
vY = vX
minY = minX
maxY = maxX
for i in range(n):
X = random.uniform(minX,
maxX)
Y = random.uniform(minY,
maxY)
data.append(X - Y)
plt.title(("Possible real values
for\n" + \
"{0} - {1} = {2:.5}").format(vX, vY, vX - vY))
plt.hist(data, bins = 20)
plt.show()
上のプログラムを実行すると、図4のグラフを得る。
図4
足し算の場合と同じく、の分布はピラミッド状になっている。
3.掛け算の場合
花壇の縦と横の長さを測ると、85.79mと7.95mであった。このとき、縦と横の真の長さをXmとYmで表すと、次式が成り立つ。
これより、花壇の面積は、
(3)
となる。が、区間(3)において、どのように分布しているかを調べるため、次のプログラムを用意した。
import random
import matplotlib.pyplot as plt
n = 100000
data = []
vX = 85.79
minX = 85.785
maxX = 85.795
vY = 7.95
minY = 7.945
maxY = 7.955
for i in range(n):
X = random.uniform(minX,
maxX)
Y = random.uniform(minY,
maxY)
data.append(X * Y)
plt.title(("Possible real values
for\n" + \
"{0} * {1} = {2:.5}").format(vX, vY, vX * vY))
plt.hist(data, bins = 20)
plt.show()
上のプログラムを実行すると図5のグラフが表示される。
図5
掛け算の場合は、有効桁数の小さい方が有効桁数の大きい方より誤差の割合が大きく、有効桁数の大きい方の誤差の影響を飲み込んでしまい(上掲書、p.140、式[A.5.2])、積の分布が一様分布に近くなると解釈できる。双方の有効桁数を揃えた場合の影響を見るため次のプログラムを用意した。
import random
import matplotlib.pyplot as plt
n = 100000
data = []
vX = 85.79
minX = 85.785
maxX = 85.795
vY = vX
minY = minX
maxY = maxX
for i in range(n):
X = random.uniform(minX,
maxX)
Y = random.uniform(minY,
maxY)
data.append(X * Y)
plt.title(("Possible real values
for\n" + \
"{0} * {1} =
{2:.5}").format(vX, vY, vX * vY))
plt.hist(data, bins = 20)
plt.show()
上のプログラムを実行すると図6のグラフが得られる。
図6
分布がピラミッド状になっている。
4.割り算の場合
縦の長さが横の長さの何倍であるかの計算を行う。縦の長さの横の長さに対する比の存在区間は
となる。比の真値の区間(4)における分布を調べるため次のプログラムを用意した。
import random
import matplotlib.pyplot as plt
n = 100000
data = []
vX = 85.79
minX = 85.785
maxX = 85.795
vY = 7.95
minY = 7.945
maxY = 7.955
for i in range(n):
X = random.uniform(minX,
maxX)
Y = random.uniform(minY,
maxY)
data.append(X / Y)
plt.title(("Possible real values
for\n" + \
"{0} / {1} = {2:.5}").format(vX, vY, vX / vY))
plt.hist(data, bins = 20)
plt.show()
上のプログラムを実行すると図7のグラフを得る。
図7
掛け算のときと同様、比の真値の分布はほぼ一様分布である。有効桁数の小さい方の誤差の割合が、有効桁数の大きい方の誤差の割合より大きいため、有効桁数の大きい方の誤差の影響が飲み込まれるためと解釈できる(上掲書、付録A、p.142)。有効桁数を揃えたときの分布を調べるため、次のプログラムを用意した。
import random
import matplotlib.pyplot as plt
n = 100000
data = []
vX = 85.79
minX = 85.785
maxX = 85.795
vY = vX
minY = minX
maxY = maxX
for i in range(n):
X = random.uniform(minX,
maxX)
Y = random.uniform(minY,
maxY)
data.append(X * Y)
plt.title(("Possible real values
for\n" + \
"{0} / {1} = {2:.5}").format(vX, vY, vX / vY))
plt.hist(data, bins = 20)
plt.show()
これを実行すると図8のグラフを得る。
図8
掛け算のときと同様、有効桁数を揃えると比の真値の分布はピラミッド状になる。