2013-08-17 4 views
1

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

+0

Я изменен мой ответ, пожалуйста, проверьте его. –

ответ

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.

enter image description here