n
を使用して次数の多項式の係数を見つけようとしていますfminunc
。わかってpolyfit
いますが、後でモデルを拡張する必要があるため、fminunc (または lsqnonlin) を使用する必要があります。とにかく、私の目的関数は単純な非線形最小二乗問題であり、で使用されているのと同じセンタリングとスケーリングのアプローチを適用しましたpolyfit
。
tmpx = (xdat-mean(xdat))./std(xdat) % centering/scaling
x0 = zeros(degree+1, 1); % initial point
objfctn = @(pars) mdl(pars, tmpx, ydat)
と
function [ sse, grad ] = mdl( pars, xdat, ydat )
est = polyval(pars, xdat)-ydat;
sse = sum(est.^2);
degree = length(pars)-1;
grad = [];
for d = 0:degree
grad = [sum(2*est.*(xdat.^d)); grad]; %#ok<AGROW>
end
end
次に、ターゲット測定データ セットから導き出されたいくつかのヒューリスティックに従って、いくつかのテスト データを生成しました。
degree = 2;
tpars = [ ... % true parameters
randraw('uniform', [-5e-20, 5e-20], 1), ...
randraw('uniform', [-10e-20, 10e-20], 1), ...
randraw('uniform', [-20e-9, 20e-9], 1), ...
randraw('uniform', [-50e-6, 50e-6], 1), ...
randraw('uniform', [0, 89e9], 1)];
tpars = tpars(end-degree:end);
xdat = sort(randi(1800e9, 100e3, 1));
yreal = polyval(tpars, xdat);
ydat = yreal + randraw('norm', [0, 100], length(xdat));
ここで入手できる有名なrandraw
スクリプトを使用します。
これまでのところ、これは次数が 2 までの多項式 (つまり ) でうまく機能しlength(pars) <= 3
ます。上記のテストデータを使用するとpolyfit
、精度が向上します。ただし、次数が 2 を超える多項式を当てはめようとするとfminunc
、最初の反復の直後に停止します。
現在の検索方向では目的関数を減少させることができないため、最適化が停止しました。目的関数の予測された変化、またはライン検索間隔が eps 未満です。
ただし、polyfit
誤差は増加しますが、それでも多項式を適合させることができます。高次多項式を に適合させる方法を知っている人はいfminunc
ますか?
私の感じでは、何らかの数値的な問題がfminunc
その仕事を妨げているということです。たぶん、勾配が高すぎて、y 軸のスケーリングも必要ですか?