0

多項式曲線を当てはめたい x 値と y 値のセットがあります。この関数は、最大 9 次の多項式の形式を取る必要があります。

y = a(1)*X.^1 + a(2)*X.^2 + a(3)*X.^3 + a(4)*X.^4 + a(5)*X.^5 + a(6)*X.^6 + a(7)*X.^7 + a(8)*X.^8 + a(9)*X.^9;

ここで、a(n) は私の係数です。

私が持っている2つの問題があります。この曲線は、常に 9 次多項式の形をとるとは限りません。それは 3 次、6 次、またはその他 (最大 9 次まで) の場合があります。

最適化ツールボックスを使用してこれを設定する方法がわかりません。何か案は?

次に、計算された y 値が常に正になるように制約を設定できますか?

どうもありがとう、

以下の現在のコード。

関数;

function F = polyfun(a,redCO2)
F = a(1)*redCO2.^1 + a(2)*redCO2.^2 + a(3)*redCO2.^3 + a(4)*redCO2.^4 + a(5)*redCO2.^5 + a(6)*redCO2.^6 + a(7)*redCO2.^7 + a(8)*redCO2.^8 + a(9)*redCO2.^9;

F = @(a) polyfun(a,X);

a0 = [100, 100, 100, 100, 100, 100, 100, 100, 100]; % Starting guess

a = lsqcurvefit(@polyfun,a0,X,y);

4

2 に答える 2

2

2 つの別々の要求があります。

制約のないフィットの場合、関数はまったく必要ありません。問題は線形であり、mrdivideおよび/またはpinv最小二乗法で最適なフィットが得られます。

a = y / bsxfun(@power, x, 1:9);

また

a = y * pinv(bsxfun(@power, x, 1:9));

システムが十分に制約されていない場合、これらの 1 つは l2 ノルムの意味で「小さな」解を与え、もう 1 つは l0 ノルムの意味で解を与えます。システムが完全にまたは過度に制約されている場合、どちらもa積分二乗誤差 (l2-ノルム) を最小化する の値を示します。

制約付きフィットの場合、lsqcurvefit既に発見した関数がうまく機能します。lb引数をゼロのベクトルに設定して、強制a的に非負にするだけです。

a = lsqcurvefit(@polyval,a0,X,y,zeros(1,9));
于 2014-10-28T21:24:21.830 に答える
1

を使用するだけpolyfitです。まさにそのために設計されています。

% Data you want to fit in x and y
% n is the polynomial order of your choosing
% the polynomial coefficients are returned in the vector p
p = polyfit(x,y,n);

次に、 を使用して、値のベクトルに対してpolyval多項式を評価できます。px

于 2014-10-28T21:15:21.907 に答える