2016-11-04 54 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 

擬合格式爲:y=a/x^b+c/x^d與A,B,c和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的平方誤差,更重要。

如果您關心的是偏差而不是絕對(平方)誤差,那麼您可以重新擬合擬合算法,或以巧妙的方式轉換您的數據。第二種方法是知道的常用和有用的工具。

在你的情況下做到這一點的一種方法是適合log(y)而不是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

一種方法是適合平方和的,最低的相對誤差,而不是平方和的,最低的絕對誤差。當我使用發佈在你的問題中的數據時,擬合最小平方和的相對誤差會產生+/- 4%的誤差 - 所以這可能是一個有用的選擇。爲了驗證您是否想要考慮這種方法,下面是使用此方法從您發佈的數據中確定的係數:

a = 2.2254477037465399E+01 
b = 1.0038013513610324E+00 
c = 4.1544917994119190E+00 
d = 4.2684956973959676E-01