曲线拟合强烈变化的数据

时间:2016-11-04 12:48:15

标签: matlab curve-fitting

我正在使用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

有人可以建议我更好地适应数据吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

一种方法是拟合最小的平方和相对误差,而不是最小的平方和绝对误差。当我使用您问题中公布的数据时,拟合到最小平方和相对误差会产生+/- 4%的误差 - 所以这可能是一个有用的选项。为了验证您是否可能需要考虑这种方法,以下是我使用此方法根据您发布的数据确定的系数:

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