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 2

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. Но это включает и другие ваши ограничения.