1

我有一组数据点(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输出分数参数拟合也很棒,但是......它不是这样做的方法,有很多拟合要做:(

4

2 回答 2

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
于 2012-11-30T20:31:31.347 回答
0

不幸的是,MATLAB lsqcurvefit 不支持除下限和上限之外的约束。从数学上讲,这是可能的——只是没有实现。不建议使用 fmincon 进行曲线拟合。

在简单的总和约束的情况下,最好的解决方案可能是消除您的变量 x(5):

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

这通常需要调整 x(4) 的允许范围,以便 x(5) = 1-x(4) 也将保持在允许范围内。(在您的情况下,对于 x(4) 和 x(5),这是 0...1,因此无需进行任何调整)。

于 2012-11-29T14:09:18.373 回答