matlab: lsqcurvefit и параметры - PullRequest
       26

matlab: lsqcurvefit и параметры

2 голосов
/ 23 ноября 2011

Я пытаюсь сделать некоторые примерки с помощью lsqcurvefit. У меня есть такая функция:

function F = cdf_3p_model(a,data)
F=1-((1-a(5)-a(6)).*(exp(-abs(data)./a(1)))+((1-a(4)-a(6)).*(exp(-abs(data)./a(2))))+((1-a(4)-a(5)).*(exp(-abs(data)./a(3)))));

и

function [a residual] = cdf_fit_3p(x,y)
a0 = [10 1 0.1 0.3 0.3 0.3];
lb = [0 0 0 0 0 0];
ub = [];
curvefitoptions = optimset('Display','final','MaxFunEvals',100000,'MaxIter',50000);
[a, residual] = fmincon(@cdf_3p_model,a0,x,y,lb,ub,curvefitoptions);
end

Я устанавливаю начальные параметры, ub, lb, но как мне также объявить, что:

a(1) > a(2) > a(3)
a(5) + a(6) +a(7) = 1

Ответы [ 3 ]

3 голосов
/ 23 ноября 2011

Я думаю, что у вас больше шансов использовать одну из процедур минимизации, такую ​​как fmincon , которая позволяет вам указать ограничения, которые в противном случае вы не смогли бы сделать.Вы можете легко включить наименьших квадратов, взяв L2-норму разницы между моделью и данными

0 голосов
/ 28 февраля 2012

Вам нужно будет вычислить параметры, которые вы «хотите» из набора параметров, которые более пригодны для MatLab.

Например, вы можете переписать

a(1) > a(2) > a(3)
a(5) + a(6) + a(7) = 1

как

a(3) = p(1)
a(2) = p(1) + p(2)
a(1) = p(1) + p(2) + p(3)
a(4) = p(4)
a(5) = p(5)
a(6) = p(6)
a(7) = 1 - p(5) - p(6)

с

lb = [0 0 0 0 0 0]
ub = [Inf Inf Inf Inf 1 1]

Ну, это не идеально, потому что допускает (7) всего -1 вместо 0. Но это включает и другие ваши ограничения.

0 голосов
/ 23 ноября 2011

Как правило, я бы сказал: «создайте в своей функции предложения, которые дают действительно ужасные« оценки », когда эти условия не выполняются».Однако ваши условия делают диапазон допустимых параметров таким крошечным подмножеством диапазона возможных чисел, что, я думаю, вы заставите lsqcurvefit никогда не сходиться, если вы сделаете это.Я бы сказал, что lsqcurvefit - не правильное решение для вас.

...