我有一堆数据,我想要一个我想要的函数的拟合,例如,1/(ax^2+bx+c)
. 我的目标是获得 a、b、c 值。
MATLAB 有什么功能可以解决这个问题吗?我一直在检查fit()
功能,但我没有得出结论。哪个是最好的方法?
我有一堆数据,我想要一个我想要的函数的拟合,例如,1/(ax^2+bx+c)
. 我的目标是获得 a、b、c 值。
MATLAB 有什么功能可以解决这个问题吗?我一直在检查fit()
功能,但我没有得出结论。哪个是最好的方法?
您给出的模型可以使用简单的方法解决:
% 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
fminunc
此外,如果您碰巧有曲线拟合工具箱,请输入help curvefit
并从那里开始。
我不知道这篇文章在 3 个月后是否有用。我想cftool
可以帮你检查一下
您可以轻松添加数据并选择拟合方法....
对我来说,这听起来像是一个最小二乘问题。
我认为lsqcurvefit
可能是一个很好的起点: