これは、単純な積分が 1 であるべきだと私が考えるケースですが、dblquad は頑固に 0.81 と言っています。
詳細: 以下の関数 createFun は、実際の関数を返します。[-b, 1-a] の値を取る確率変数の密度関数を意図した、区分線形です。
def createFun(a, b):
def fIn(x):
if x < -a:
return (b+x)/(b-a)
elif x > 1-b:
return 1 - (x-(1-b))/(b-a)
else:
return 1
return fIn
ここで、特定の値 a=0 および b=0.2 に対して、そのような関数を 1 つ作成します。
a = 0.0
b = 0.2
f1 = createFun(a, b)
まず、[-b, 1-a] の積分が本当に 1 であることを確認します。
print("Check it is a density, in [-b, 1-a]")
print(quad(f1, -b, 1-a)) # It is 1, as expected
ここまでは順調です。ここで、関数 g:RxR --> R を g(y,x) = f1(x) * f1(y) として定義します。
def g(y, x):
return f1(y) * f1(x)
平方 [-b, 1-a] x [-b, 1-a] における g の二重積分は、各変数の積分の積になるはずです (g は x と a の関数として因数分解されます)。 y の関数)、どちらも 1 であるため、1*1=1 と予想しました。しかし、コード
print("Now, the double integral")
print(dblquad(g, -b, 1-a, lambda _:-b, lambda _:1-a)) # Should be 1, but isn't!
は 0.8161 を示しており、1E-10 のオーダーの非常に低いエラーがあります。
私の数学は間違っていますか?何らかの理由でこの積分は 1 ではありませんか? それともそうですが、dblquad を正しく使用していませんか? では、どのようにすればよいのでしょうか。