Код возвращает минимальное значение 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
,