Перепишите f следующим образом:
function y = g(x, r)
n = length(r);
log_part = 0.5.*n.*log(x(2).^2);
sum_part = ((sum(r-x(1))).^2)./(2.*x(2).^2);
y = log_part + sum_part;
end
Используйте fmincon
вместо fminsearch
, потому что стандартное отклонение
всегда положительный номер.
Set стандартное отклонение нижняя граница до нуля 0
Весь код выглядит следующим образом:
%make random numbers with gaussian dist
r=[2.39587291079469
1.57478022109723
-0.442284350603745
4.39661178526569
7.94034385633171
7.52208574723178
5.80673144943155
-3.11338531920164
6.64267230284774
-2.02996003947964];
% mu=2 sigma=3
fun = @(x)g(x, r);
% starting point
x0 = [0,0];
% borns
lb = [-inf, 0];
ub = [inf, inf];
[y, fval] = fmincon(fun,x0,[],[],[],[],lb,ub, []);
function y = g(x, r)
n = length(r);
log_part = 0.5.*n.*log(x(2).^2);
sum_part = ((sum(r-x(1))).^2)./(2.*x(2).^2);
y = log_part + sum_part;
end
Решение
y = [3.0693 0.0000]
Для лучшей оценки используйте mle()
напрямую
Код довольно прост:
y = mle(r,'distribution','normal')
Решение
y = [3.0693 3.8056]