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) は 3 つの分数を定義するために使用されるため、それらの合計は 1 でなければなりません。

%% 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 (同じモデル + 制約) を使用して同じデータをフィッティングしたとき、それは完全に機能します... 固定 Origin を使用したとき出力分数パラメータの適合も素晴らしかったですが...何十もの適合を行う方法ではありません:(

4

2 に答える 2

2

これに fmincon を使用する場合 (および 3 番目の分数として別のパラメーターを使用する場合)、制約は非常に単純です。適切な収束を得るには、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 に答える