0

すべて 5 ~ 8 個のパラメーターを持つ 5 つのノンパラメトリック モデルがあります。このモデルは、t を時間として経時データ y(t) を適合させるために使用されます。すべてのデータファイルは、比較のために 5 つのモデルすべてに適合しています。モデル自体を変更することはできません。

フィッティングには開始値が使用され、これらはレーベンバーグ・マルカート アルゴリズムを使用して lsqcurvefit モデルにフィッティングされます。そこで、いくつかのモデル用のスクリプトと、カーブ フィッティング用の 1 つの関数を作成しました。

カーブ フィッティングを実行すると、多くの開始値が極端な値に変化します。これらのパラメーターは開始値の近くにとどまる必要があり、明確に定義された範囲内でのみ変化するか、標準偏差内に収まる曲線のみが含まれるようにする必要があるため、これは避けたいことです。カーブ フィッティング (反復数値化手法) 中に適用する必要があり、後で適用する必要はありません。

モデルを高さに合わせるために私が書いた関数:

% Fit a specific model for all valid persons
    try
        opts = optimoptions(@lsqcurvefit, 'Algorithm', 'levenberg-marquardt'); 
        [personalParams,personalRes,personalResidual] = lsqcurvefit(heightModel,initialValues,personalData(:,1),personalData(:,2),[],[],opts);
    catch
        x=1;
    end

モデルの 1 つに対して作成した関数

   elseif strcmpi(model,'jpss')
    % y = h_1(1-(1/(1+((t+0.75)^c_1/d_1)+((t+0.75)^c_2/d_2)+((t+0.75)^c_3/d_3)))
%     heightModel = @(params,ages) params(1).*(1-1./(1+((ages+0.75).^params(2))./params(3) + ((ages+0.75).^params(4))./params(5) + ((ages+0.75).^params(6))./params(7)));
    heightModel = @(params,ages) params(1).*(1-1./(1+(((ages+0.75)./params(3)).^params(2)) + (((ages+0.75)./params(5)).^params(4)) + ((ages+0.75)./params(7)).^params(6))); % Adapted 25/07
    modelStrings = {'h1','c1','d1','c2','d2','c3','d3'};

    % Define initial values
if strcmpi('male',gender)
    initialValues = [174.8 0.6109 2.9743 3.614 9.88 22.393 13.59];
else
    initialValues = [162.7 0.6546 2.43 4.011 8.579 18.394 11.846];
end    

私がしたいこと:

すべての開始値 @initial 値に制限を課すことは可能ですか? lsqcurvefit に制限を設けることは良い考えではないと思います。異なる開始値と許可されている範囲を持つ異なるモデルがあるからです。

私は2つのことを頭に入れていました.1.範囲を使用して、これを初期値の間に配置します。範囲 a2=[0.3,0.8] など

  1. Heightmodel='name model' initial value* 1.2 および lb = initial value* 0.8 の場合、lsqcurvefit の間のすべての初期値に lb と ub の制限を別々に配置します。

私はそれを機能させることができないので、誰かが私にいくつかのヒントや指針を与えることができます.

前もって感謝します

ルーシー

誰か助けてくれませんか

4

1 に答える 1

0

あなたは次のように述べています:異なる開始値と異なる許容範囲を持つ異なるモデルがあります。 ここでとを使用できます。これを行う方法は、ドキュメントで概説されています。ublblsqcurvefit

X=LSQCURVEFIT(FUN,X0,XDATA,YDATA,LB,UB) defines a set of lower and
upper bounds on the design variables, X, so that the solution is in the
range LB <= X <= UB. Use empty matrices for LB and UB if no bounds
exist. Set LB(i) = -Inf if X(i) is unbounded below; set UB(i) = Inf if
X(i) is unbounded above.

たとえば、次の例では、パラメーターはフィット中に制限内に制約されます。下限 ( lb) と上限 ( ub) は、それぞれ開始値の 20% 下と上に設定されます。

heightModel = @(params,ages) abs(params(1).*(1-1./(1+(params(2).* (ages+params(8) )).^params(5) +(params(3).* (ages+params(8) )).^params(6) +(params(4) .*(ages+params(8) )).^params(7) )));
initialValues = [161.92 0.4173 0.1354 0.090 0.540 2.87 14.281 0.3701];
lb = 0.8*initialValues; % <-- lower bound is 20% smaller than initial par values
ub = 1.2*initialValues;
[parsout,resnorm,residual] = lsqcurvefit(heightModel,initialValues,t,ht,lb,ub);
于 2013-08-19T13:30:08.457 に答える