2012-11-29 144 views
1

我有一组数据点(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(具有相同模型+约束)拟合相同的数据时,它完美地工作...当我使用固定的原点输出分数参数时,拟合也很好,但是...它不是这样做的方式,有十几个拟合要做:(

回答

2

如果您对此使用fmincon(并使用另一个参数作为第三个分数),则约束非常简单。您可能需要使用fmincon选项来获得良好的收敛性。

function solution = my_fit_fun(xdata, ydata, a0) 

lb = [0 0 0 0 0 0]; 
ub = [inf inf inf 1 1 1]; 

%Aeq and beq specify that the last three parameters add to 1 
Aeq = [0 0 0 1 1 1]; 
beq = 1; 

solution = fmincon(@objective,a0,[],[],Aeq,beq,lb,ub); 

    function F = model(x) 

     fraction1 = x(4); 
     fraction2 = x(5); 
     fraction3 = x(6); 

     F=1-(fraction1.*(exp(-(xdata)./x(1)))+(fraction2.*(exp(-(xdata)./x(2))))+(fraction3.*(exp(-(xdata)./x(3))))); 

    end 

    function f = objective(x) 

     yfit = model(x); 
     f = sum((yfit - ydata) .^2); 
    end 

end 
0

不幸的是,MATLABs lsqcurvefit不支持约束条件而不是下限和上限从数学角度来看,这是可能的 - 它只是没有实现,fmincon的使用是不建议用于曲线拟合。

在简单相加的情况下,限制了最佳的解决方案可能是你变量x的消除(5):

fraction1 = x(4); 
fraction2 = 1-x(4); 

这通常需要X(4)的允许范围的调整,使得x(5 )= 1-x(4)也将保持在允许范围内。 (在你的情况下,对于x(4)和x(5),这是0 ... 1,所以不需要进行调整)。

+0

对不起,我不明白...请解释。我有三个指数的总和,每个指数都有自己的分数(所以f1 + f2 + f3 = 1),现在它减少为两个参数(f1,f2,1-f1-f2)。我怎样才能减少到只有一个?你显示的是好的,但只有两个指数的总和(然后f1 + f2 = 1可以用ub/lb 0-1简化为f1和1-f1),这正是我为2个零件模型所做的,但三个? – Art

+0

对不起,我误解了你的问题。我在想只有两个参数。但实际上现在我不明白你的问题是什么。你的模型应该工作,我不明白为什么你需要额外的限制。如果收敛不好,检查TolX和TolFun值是否有意义,或者尝试拟合时间常数x(1..3)的对数。 –