使用Matlab的曲线拟合失败了

Yot*_*tam 3 matlab curve-fitting

我正在尝试使用fit命令行在Matlab中拟合曲线.输入数据是:

X =

     1
     2
     4
     5
     8
     9
    10
    13

Y =

1.0e-04 *

    0.1994
    0.0733
    0.0255
    0.0169
    0.0077
    0.0051
    0.0042
    0.0027
Run Code Online (Sandbox Code Playgroud)

目标函数是

Y = 1/(kappa*X.^a)
Run Code Online (Sandbox Code Playgroud)

我正在使用fittype,fitoptions并且fit如下:

model1 = fittype('1/(kappa*x.^pow)');
opt1 = fitoptions(model1);
opt1.StartPoint = [1e-5 -2];
[fit1,gof1] = fit(X,Y.^-1,model1,opt1)
Run Code Online (Sandbox Code Playgroud)

我得到的结果rsquare大约是-450,与测量的方向相同.我附上了一个数字来证明这一点.如何提高Matlab的拟合技巧?

编辑:

我删除了.^-1fit命令.这改善了行为,但并不完全正确.如果我将model1设置为:

model1 = fittype('1/(kappa*x.^pow)');
Run Code Online (Sandbox Code Playgroud)

适合不好.如果我将它设置为:

model1 = fittype('kappa*x.^pow');
Run Code Online (Sandbox Code Playgroud)

拟合是好的(kappa是一个非常小的数字,而pow是负的).

我也正常化了Y,我得到了一个合理的结果

Kav*_*vka 6

你应该更换

[fit1,gof1] = fit(X,Y.^-1,model1,opt1)
Run Code Online (Sandbox Code Playgroud)

通过

[fit1,gof1] = fit(X,Y,model1,opt1)
Run Code Online (Sandbox Code Playgroud)

你的初始条件kappa1e-5,如果kappa在分子中,那将是有意义的.

使用模型kappa*x.^pow,在初始条件下[1e-5 -2],您将获得正确的拟合:

X =[1     2     4     5     8     9    10    13]';
Y = 1.0e-04 * [0.1994 0.0733 0.0255 0.0169 0.0077 0.0051 0.0042  0.0027]';

model1 = fittype('kappa*x.^pow');
opt1 = fitoptions(model1);
opt1.StartPoint = [1e-5 -2];
[fit1,gof1] = fit(X,Y,model1,opt1)
plot(fit1, X, Y)
Run Code Online (Sandbox Code Playgroud)

拟合的结果是

>> fit1
fit1 = 
   General model:
   fit1(x) = kappa*x.^pow
   Coefficients (with 95% confidence bounds):
     kappa =   2.044e-05  (1.931e-05, 2.158e-05)
     pow =      -1.657  (-1.851, -1.464)
Run Code Online (Sandbox Code Playgroud)

适合曲线