Используйте интеграл2 или интеграл3, чтобы вычислить CDF в MATLAB

Я только что столкнулся с проблемой, используя integral2 или integral3 для расчета CDF в MATLAB. Предположим, у меня есть две независимые нормальные случайные величины X и Y, вектор среднего значения равен mu = [5;50], а ковариационная матрица равна c = [3^2,0; 0,3^2].

Поскольку они независимы, совместная PDF является произведением двух PDF, я использовал следующий код для вычисления вероятности по всей области:

integral2(@(x,y) normpdf(x,5,3).*normpdf(y,50,3),-Inf,Inf,-Inf,Inf)

Я думаю, что он должен дать мне 1 в качестве ответа, но вместо этого он возвращает

1.8174e-10

Затем я попробовал функцию mvncdf,

mvncdf([Inf,Inf],[5,50],diag([3,3].^2))

и он возвращает правильный ответ, 1. Я также попробовал версию 1D integral, которая отлично работает. Кто-нибудь может объяснить это для меня?


person qlzou    schedule 18.10.2017    source источник


Ответы (1)


Это происходит из-за числовой неточности (в сочетании с тем фактом, что ваши распределения имеют ненулевые средние значения). ). Вы можете использовать параметр 'AbsTol' для integral2, чтобы увеличить решение точность:

integral2(@(x,y)normpdf(x,5,3).*normpdf(y,50,3),-Inf,Inf,-Inf,Inf,'AbsTol',1e-16)

возвращает что-то ближе к 1. Вы можете избежать этого, воспользовавшись симметрией относительно средств ваших распределений, например,

4*integral2(@(x,y)normpdf(x,5,3).*normpdf(y,50,3),5,Inf,50,Inf)

В вашем примере mvncdf используется совершенно другой метод прямого вычисления чего-то вроде этого:

normcdf(Inf,5,3)*normcdf(Inf,50,3)
person horchler    schedule 18.10.2017