我有一組數據點(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)的對數。 –