【问题标题】:MATLAB fitting of data to a inverse quadratic equationMATLAB 将数据拟合到反二次方程
【发布时间】:2018-02-05 23:41:18
【问题描述】:

我有一堆数据,我想要一个带有我想要的函数的拟合,例如,1/(ax^2+bx+c)。我的目标是获得 a、b、c 值。

MATLAB 有什么功能可以帮助解决这个问题吗?我一直在检查fit() 函数,但我没有得出结论。哪个是最好的方法?

【问题讨论】:

  • 通常您希望函数适合数据,而不是相反。 ;) 关于功能:你可以看看fminuncfminsearch

标签: matlab curve-fitting


【解决方案1】:

你给出的模型可以用简单的方法求解:

% model function
f = @(a,b,c,x) 1./(a*x.^2+b*x+c);

% noise function 
noise = @(z) 0.005*randn(size(z));

% parameters to find
a = +3;
b = +4;
c = -8;

% exmample data
x = -2:0.01:2;    x = x + noise(x);
y = f(a,b,c, x);  y = y + noise(y);


% create linear system Ax = b, with 
% A = [x²  x  1]
% x = [a; b; c]
% b = 1/y;
A = bsxfun(@power, x.', 2:-1:0);

A\(1./y.')

结果:

ans = 
 3.035753123094593e+00  % (a)
 4.029749103502019e+00  % (b)
-8.038644874704120e+00  % (c)

这是可能的,因为您给出的模型是线性模型,在这种情况下,反斜杠运算符将给出解决方案(虽然1./y 有点危险......)

在拟合非线性-线性模型时,请查看lsqcurvefit(优化工具箱),或者您可以使用fmincon(优化工具箱)、fminsearch 或@编写自己的实现987654327@。

另外,如果您碰巧有曲线拟合工具箱,请输入help curvefit 并从那里开始。

【讨论】:

  • 嘿,谢谢!我有个问题。将我的数据用于 x 和 y 时,我遇到了下一个我不明白的错误:“两个输入数组的非单一维度必须相互匹配。”另外,我确实有curvefit工具箱,但我找不到适合我想要的功能,只能使用GUI! (是的,GUI 使用了其他功能,但我迷路了……)
  • @AnderBiguri: 嗯...看来y 的数据比x 的数据多(反之亦然)。您必须查看是否numel(x)==numel(y) 并检查所有内容是否“正确”转置。如果numel(x)~=numel(y),好吧……那不是我能解决的问题:)
  • @AnderBiguri 这可能是bsxfun 参数的换位问题。第一个向量应该是列向量,第二个是行向量。
  • @angainor 这正是问题所在,两个数据都是行向量!谢谢!但是当转置其中一个时,我在最后一行出现错误,A\... 矩阵尺寸必须一致。
  • 好吧,我解决了它,消除了最后一行 Y 的转置!谢谢!
【解决方案2】:

对我来说,这听起来像是一个最小二乘问题。

我认为lsqcurvefit 可能是一个不错的起点:

http://www.mathworks.co.uk/help/optim/ug/lsqcurvefit.html

【讨论】:

    【解决方案3】:

    我不知道这篇文章在 3 个月后是否有用。 我想cftool 可以帮助你 检查一下

    您可以轻松添加数据并选择拟合方法....

    【讨论】:

      猜你喜欢
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2012-05-17
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多