Код возвращает минимальное значение m st P(X>m)=1/n^2 для биномиального эксперимента

Предположим, мы проводим эксперимент, в котором мы бросаем n шаров в n банок. X - независимая переменная, описывающая количество шаров в первом сосуде. Построение функции возвращает наименьшее целое число, удовлетворяющее P(X>m)<1/n^2.

Распределение является биномиальным, поэтому я написал следующую функцию Matlab:

function m = intpq3(n)
flag=0;
par=1/n^2;
m=0;
P=0;
%Since X is non-neative integer 
if(n==1)
    m=-1*Inf;
else
    while(flag==0 && m<=n)
        m=m+1;
         P=P+nchoosek(n,m)*(1/n)^m*(1-1/n)^(n-m);   

        if(1-P<=par)
            flag=1;
        end

    end
end
disp(m)
end

Но для каждого 'n', который я даю, он возвращает либо ошибку, либо n-1. Что я делаю неправильно?

1 ответ

Решение

Следующая версия вашей программы, кажется, делает то, что вы хотите. Насколько я могу судить, проблема с вашей версией в том, что вы не включили m=0 в вашу сумму Pтаким образом 1-P был последовательно слишком большим. Это всегда хорошая идея, чтобы попросить программу выложить цифры и сравнить с бумажными и карандашными вычислениями.

function [m,P] = intpq3(n,varargin);    

if nargin==2
   plt=varargin{1}; 
else
   plt = 0;
end

flag=0;
par=1/n^2;
m=0;
P=0;

disp(['1/n^2 =  ' num2str(par)]);

%Since X is non-neative integer 
if(n==1)
    m=-1*Inf;
else
    while m<n & flag==0
       P=P+nchoosek(n,m)*(1/n)^m*(1-1/n)^(n-m);   
       disp([' n= ' num2str(n)  ' m= ' num2str(m)  ' P(X>' num2str(m) ') ' num2str(1-P)])
        if(1-P<=par)
            flag=1;
        end
       m=m+1;
    end
end
disp(['mselect =  ' num2str(m-1)]);
end

Следующее также помогло диагностировать проблему. Показывает значения P(X>m) (цветные точки) для разных m при выбранных значениях n, Наложение в виде пунктирной линии 1/n^2,

введите описание изображения здесь

Другие вопросы по тегам