MATLAB - 最小二乘曲线拟合多个自变量

时间:2017-02-13 21:52:06

标签: least-squares matlab

我有以下功能:

我想通过MATLAB函数lsqcurvefit获得least squares method的系数。

问题是,我不知道,当我的函数t有多个自变量而不只是一个变量时,它是否甚至可以使用该函数。所以,根据链接,我应该有多个xData向量 - 类似这样的东西:

lsqcurvefit(f, [1 1 1], nprocs, ndoms, nDOF, measuredVals)

你知道怎么做吗?

我的尝试

我试图像这样定义我的目标函数

f = @(c, x) c(1)*x(2).^(c(2)*x(1).^c(3)) + (c(4) + c(5)*x(1))/x(3);

并像这样使用lsqcurvefit

lsqcurvefit(f, [1 1 1], [ndoms nDOF nprocs], measuredVals),

但是有一个问题,measuredVals是一个大小为56x1的向量,但是我的" xData"是一个大小为56x3的矩阵,所以我收到了这个错误:

Index exceeds matrix dimensions.

Error in factorizatonKGlobRegr>@(c,x)c(1)*x(2).^(c(2)*x(1).^c(3))+(c(4)+c(5)*x(1))/x(3)

Error in lsqcurvefit (line 202)
            initVals.F = feval(funfcn_x_xdata{3},xCurrent,XDATA,varargin{:});

Caused by:
    Failure in initial objective function evaluation. LSQCURVEFIT cannot continue.

但是我怎么做这个,当$ t:\ mathbb {R} ^ 3 \ rightarrow \ mathbb {R} $?

第二次尝试

我稍微改变了目标函数

f = @(c, x) c(1)*x(:,2).^(c(2)*x(:,1).^c(3)) + (c(4) + c(5)*x(:,1))/x(:,3);,

但错误仍然存​​在。

我的数据

measuredVals = [
0.1647815
0.06300775
0.05769325
0.04803725
0.04290825
0.0405065
0.03807525
0.03487725
0.284112
0.13495675
0.12740075
0.11109725
0.105036
0.11022575
0.100587
0.09803775
0.48695475
0.30563525
0.30084925
0.283312
0.2745085
0.271998
0.27472625
0.27103925
0.89953925
0.68234025
0.6783635
0.65540225
0.64421475
0.64214725
0.63949875
0.623119
1.588605
1.37335275
1.36082075
1.35097375
1.34813125
1.34932025
1.3519095
1.34521625
2.820884
2.63251325
2.640659
2.6338805
2.636361
2.62748
2.6233345
2.63821
4.81472975
4.65116425
4.664892
4.64225625
4.6734825
4.63981675
4.635483
4.6280245];

n = 56;

ndoms = [];
for i=1:n
    ndoms = [ndoms; 288];
end

tmp = [
        375
        1029
        2187
        3993
        6591
        10125
        14739];
nDOF = [];
for i=1:7
    for j=1:8
        nDOF = [
            nDOF
            tmp(i)];
    end
end

nprocs = [];
for i=1:7
    nprocs = [nprocs; [1 2 3 4 6 8 12 24]'];
end

1 个答案:

答案 0 :(得分:0)

当我使用模拟的c和x输入测试目标函数时,它返回了一个与数据集大小相当的NxN矩阵。情况并非如此。你应该只为每个数据集获得一个值,所以我期望一个Nx1矩阵。尝试将您的功能更新到此

f = @(c,x)c(1)。* x(:,2)。^(c(2)。* x(:,1)。^ c(3))+(c(4 )+ c(5)* x(:,1))./ x(:,3)

我给了除数一段时间。