たくさんのデータがあり、たとえば、必要な関数を使用したフィッティングが必要です1/(ax^2+bx+c)
。私の目的は、a、b、cの値を取得することです。
これを支援するMATLABの関数はありますか?機能を確認してきましたfit()
が、結論が出ませんでした。どちらが最善の方法ですか?
たくさんのデータがあり、たとえば、必要な関数を使用したフィッティングが必要です1/(ax^2+bx+c)
。私の目的は、a、b、cの値を取得することです。
これを支援するMATLABの関数はありますか?機能を確認してきましたfit()
が、結論が出ませんでした。どちらが最善の方法ですか?
提供するモデルは、次の簡単な方法で解決できます。
% model function
f = @(a,b,c,x) 1./(a*x.^2+b*x+c);
% noise function
noise = @(z) 0.005*randn(size(z));
% parameters to find
a = +3;
b = +4;
c = -8;
% exmample data
x = -2:0.01:2; x = x + noise(x);
y = f(a,b,c, x); y = y + noise(y);
% create linear system Ax = b, with
% A = [x² x 1]
% x = [a; b; c]
% b = 1/y;
A = bsxfun(@power, x.', 2:-1:0);
A\(1./y.')
結果:
ans =
3.035753123094593e+00 % (a)
4.029749103502019e+00 % (b)
-8.038644874704120e+00 % (c)
これが可能なのは、指定するモデルが線形モデルであるためです。この場合、バックスラッシュ演算子が解を提供します(1./y
ただし、少し危険です...)
非線形モデルを近似する場合は、(最適化ツールボックス)を参照するか、(最適化ツールボックス) またはlsqcurvefit
を使用して独自の実装を作成できます。fmincon
fminsearch
fminunc
また、カーブフィッティングツールボックスがある場合は、help curvefit
そこに入力して開始します。
私には、これは最小二乗問題のように聞こえます。
私はlsqcurvefit
始めるのに良い場所かもしれないと思います:
この投稿が3か月後に役立つかどうかはわかりません。私はcftool
あなたがそれをチェックするのを助けるかもしれないと思います
簡単にデータを追加し、フィッティング方法を選択できます...。