matlab: lsqcurvefit и параметры
Я пытаюсь сделать некоторую подгонку с помощью 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 ответа:
Я думаю, что у вас больше шансов использовать одну из подпрограмм минимизации, таких как fmincon, которая позволяет указать ограничения, которые вы в противном случае не смогли бы сделать. Вы можете легко включить наименьшие квадраты, взяв L2-норму разности между моделью и данными
Обычно я бы сказал: "сделайте в своей функции Предложения, которые дают действительно ужасные "оценки", когда эти условия не выполняются."Однако ваши условия делают диапазон допустимых параметров таким крошечным, крошечным подмножеством диапазона возможных чисел, что я думаю, что вы заставите lsqcurvefit никогда не сходиться, если вы это сделаете. Я бы сказал, что lsqcurvefit не является правильным решением для вас.
Вам нужно будет вычислить параметры, которые вы "хотите", из набора параметров, который более удобен для 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]
Ну, это не идеально, потому что это позволяет a(7) как минимум -1 вместо 0. Но это включает и другие ваши ограничения.