我有一组数据点(data_x,data_y)。我需要将模型函数拟合到这些数据中。模型是 5 个参数的函数,我这样定义它:
function F = model(x,xdata)
fraction1 = x(4);
fraction2 = x(5);
fraction3 = 1-x(4)-x(5);
F=1-(fraction1.*(exp(-(xdata)./x(1)))+(fraction2.*(exp(-(xdata)./x(2))))+(fraction3.*(exp(-(xdata)./x(3)))));
参数 x(4) 和 x(5) 用于定义三个分数,因此它们的总和必须为 1。为了适应这个函数,我使用了 lsqcurvefit,如下所示:
%% initial conditions
a0 = [guess1 guess2 guess3 0.3 0.3];
%% bounds
lb = [0 0 0 0 0 ];
ub = [inf inf inf 1 1];
%% Fitting options
curvefitoptions = optimset( 'Display', 'iter' );
%% Fit
a = lsqcurvefit(@model,a0,x,y,lb,ub,curvefitoptions);
问题是不知道如何添加约束,以保持分数之和 = 1。我知道这lsqcurvefit
不是解决这个问题的最佳方法,但我不知道如何输入fmincon
这些数据来找到我的参数。非常感谢您的帮助!
编辑:请注意,F 的最大值可能是 1...几乎相等的分数(0.33),根本没有任何意义,因为其他参数被搞砸了......当我使用Origin(具有相同的模型+约束)拟合相同的数据时,它完美地工作......当我使用固定的Origin输出分数参数拟合也很棒,但是......它不是这样做的方法,有很多拟合要做:(