1

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 軸のスケーリングも必要ですか?

4

1 に答える 1