我有一组数据点(data_x,data_y)。我需要将模型函数放入这些数据中。模型是5个参数的函数,并且我已经定义它这样:matlab:用lsqcurvefit和fmincon约束拟合
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 ...我试图欺骗,即通过添加或甚至乘以10 ^(1-fraction1-fraction2-fraction3)之类的东西,但一切,但那么我就会得到几乎相等的分数(0.33),什么都没有意义,导致其他参数被拧紧...当我使用Origin(具有相同模型+约束)拟合相同的数据时,它完美地工作...当我使用固定的原点输出分数参数时,拟合也很好,但是...它不是这样做的方式,有十几个拟合要做:(
对不起,我不明白...请解释。我有三个指数的总和,每个指数都有自己的分数(所以f1 + f2 + f3 = 1),现在它减少为两个参数(f1,f2,1-f1-f2)。我怎样才能减少到只有一个?你显示的是好的,但只有两个指数的总和(然后f1 + f2 = 1可以用ub/lb 0-1简化为f1和1-f1),这正是我为2个零件模型所做的,但三个? – Art
对不起,我误解了你的问题。我在想只有两个参数。但实际上现在我不明白你的问题是什么。你的模型应该工作,我不明白为什么你需要额外的限制。如果收敛不好,检查TolX和TolFun值是否有意义,或者尝试拟合时间常数x(1..3)的对数。 –