0

これは、単純な積分が 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 を正しく使用していませんか? では、どのようにすればよいのでしょうか。

4

1 に答える 1