我正在使用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
以确保准确捕获数据。该图用于拟合和数据参考。
有人可以建议我更好地适应数据吗?
答案 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