2016-11-04 9 views
0

私はMatlabカーブフィッティングツールcftoolを使用してデータに適合しています。問題はyの値がx-axisに対して大きく変化している(大きく減少している)ということです。試料は強く変化するデータにフィットする曲線

x   y 
0.1  237.98 
1  25.836 
10  3.785 
30  1.740 
100  0.804 
300  0.431 
1000 0.230 
2000 0.180 

嵌合形式は、以下に与えられる:定数として、B、C、およびDとy=a/x^b+c/x^dを。 matlabからのカーブフィットは、大きいy-values(それはxレンジがより小さい)が0.1%未満のずれではかなり正確です。しかし、より高いx-valuesでは、フィットの精度は良くありません(約11%の偏差)。また、データが正確に取得されることを確認するために、カーブフィッティング反復に% deviationを含めることも望みます。このプロットはフィットおよびデータ参照のために与えられる。 enter image description here

誰も私にデータをフィットさせるためのより良い方法を提案できますか?

答えて

1

カーブをフィットさせる最も一般的な方法は、データとフィットの二乗差の合計を最小にする最小二乗適合を行うことです。これは、yが大きいときにフィットが厳しい理由です。0.18の値の11%の偏差は0.000392の二乗誤差だけですが、240の値の0.1%の偏差は0.0576の二乗誤差です。

あなたが気にしているのは、絶対(二乗)誤差ではなく偏差であれば、フィッティングアルゴリズムを再調整するか、データを賢明に変換することができます。第2の方法は、一般的で有用なツールです。

あなたのケースでこれを行う方法の1つは、yではなくlog(y)です。

data = [0.1  237.98 
1  25.836 
10  3.785 
30  1.740 
100  0.804 
300  0.431 
1000 0.230 
2000 0.180]; 

x = data(:,1); 
y = data(:,2); 


% Set up fittype and options. 
ft = fittype('a/x^b + c/x^d', 'independent', 'x', 'dependent', 'y'); 
opts = fitoptions('Method', 'NonlinearLeastSquares'); 
opts.Display = 'Off'; 
opts.StartPoint = [0.420712466925742 0.585539298834167 0.771799485946335 0.706046088019609]; 

%% Usual least-squares fit 
[fitresult] = fit(x, y, ft, opts); 
yhat = fitresult(x); 
% Plot fit with data. 
figure 
semilogy(x, y); 
hold on 
semilogy(x, yhat); 

deviation = abs((y-yhat))./y * 100 

%% log-transformed fit 
[fitresult] = fit(x, log(y), ft, opts); 
yhat = exp(fitresult(x)); 
% Plot fit with data. 
figure 
semilogy(x, y); 
hold on 
semilogy(x, yhat); 

deviation = abs((y-yhat))./y * 100 
0

一つのアプローチではなく、最も低い和の二乗絶対誤差よりも、最低の和の二乗相対誤差に合わせて次のようになります。これは、はるかに重要な小さな誤差を作る効果があります。あなたの質問に投稿されたデータを使用すると、最小2乗和相対誤差に適合すると誤差は+/- 4%になります - これは便利なオプションです。この方法を検討するかどうかを確認するには、この方法を使用して投稿データから決定した係数をここに示します。

a = 2.2254477037465399E+01 
b = 1.0038013513610324E+00 
c = 4.1544917994119190E+00 
d = 4.2684956973959676E-01 
関連する問題