Что не так?
p*q^x-1 % Your original code
Ваш исходный код принимает q
, увеличивая его на x
th, умножая на p
, , затем , вычитая 1. Это эквивалентно следующему коду, который вы наверняка не делали Т намерения
(p*(q^x)) - 1 % What your code was doing written differently
Учитывая порядок операций , исправление легко.
p*q^(x-1) % Your corrected code
Другой возможный источник ошибок - ваша функция не сохранена как отдельный m-файл "Geometric.m", который также должен находиться в вашем пути MATLAB (MATLAB должен его "увидеть"). Если у вас есть файл функции " MyFunction.m ", хранящийся в папке, вы можете добавить эту папку в видимый путь MATLAB одной строкой (или перейти туда вручную). Подробнее см. , как создать функцию .
.
mypathtoMyFunction = 'C:\Users\SonnyJordan\Documents\SweetCode\FunctionFolder';
path(path,'mypathtoMyFunction')
Полное решение (3 подхода)
Из вашей параметризации Геометрическое распределение вам нужна поддержка {1, 2, 3, 4, ...}.
Две вещи. (1) Я бы порекомендовал анонимную функцию для чего-то подобного. (2) На самом деле нет необходимости разделять p и q как отдельные переменные, поскольку p + q = 1 и, следовательно, один определяет другой (т. Е. q = 1-p
).
Подход 1: Анонимная функция
% MATLAB R2018b
geopmfh =@(p,k) p.*((1-p).^(k-1)); % Define pmf
k = 5; % Number of trials
p = 0.2; % Prob("Success" on trial)
geopmfh(p,k) % Probability
Выше код полностью векторизован , так что вы можете передавать ему векторы и / или массивы входов.
Быстрая проверка, чтобы подтвердить, что это действительная функция вероятности массы (pmf) .
M = 500;
sum(geopmfh(p,[1:M])) % should return 1 if M large enough
Подход 2: Функция (без проверки ошибок)
Кроме того, создание функции в MATLAB имело бы большой смысл, если бы вы хотели добавить проверку ошибок на входах функций, чтобы убедиться, что k является положительным целым числом и что p находится между [0 1].
function [pmf] = geopmf(p,k)
%GEOPMF Calculates pmf for Geometric(p,k) distribution on {1,2,3,...}
% pmf = geopmf(p,k)
% p = n x d matrix of n d-dimensional success probabilities; must be [0,1]
% k = m x d matrix of m d-dimensional numbers of trials
% pmf = n x m matrix of probabilities
%
% Examples:
% k = 4; p = .5;
% pmf = geopmf(p,k) % pmf = 0.0625
% Input Error Checking ****************************************************
if isempty(p) | isempty(k), pmf = []; return, end
if nargin ~= 2, error('Function requires two inputs.'), end
if p < 0 | p > 1, error('p must be between 0 and 1.'), end
if k < 1 | ~isint(k), error('k must be positive integer & k > 0.'), end % with this parameterization
n = size(p,1); d = size(p,2);
m = size(k,1);
if isempty(p) | ~isnumeric(p) | ~ismatrix(p)
error('p must be non-empty numeric scalar, vector, or 2-D matrix.');
elseif isempty(k) | ~isnumeric(k) | ~ismatrix(k)
error('k must be non-empty numeric scalar, vector, or 2-D matrix.');
elseif size(k,2) ~=d
error('Rows of p and k must have same dimensions.');
end
% End (Input Error Checking) **********************************************
pmf = p.*((1-p).^(k-1));
end
Подход 3: Встроенная функция MATLAB
Если у вас есть набор инструментов статистики, в MATLAB для этого уже есть функция geopdf
, но обратите внимание, что она параметризована в соответствии с другой «версией» с поддержкой {0, 1, 2, ...} ( см. вики-страницу ).
p.*((1-p).^k) % The other parameterization
geopdf(k,p) % Note order of inputs
Вы можете исправить это, отрегулировав свой ввод.
geopdf(k-1,p) % Subtract 1 trial
Код, протестированный с MATLAB R2018b.