2012-11-29 174 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)的對數。 –