カーブをフィットさせる最も一般的な方法は、データとフィットの二乗差の合計を最小にする最小二乗適合を行うことです。これは、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