适用于具有多个拟合参数的数据模拟

时间:2016-03-28 16:50:42

标签: matlab

我有一套实验点

Xdata=[xd1 xd2...]

Ydata=[yd1 yd2...]

间接模拟的function y=myfunction(xsimul,a,b,c)

Ysimul=[ys1 ys2...]

表示Xsimul=Xdata

间接地,我的意思是没有直接计算y =函数(x,a,b,c)。相反,通过最小化另一个函数g = f(z)(使用fminsearch),然后是Ysimul =(g(目标值)),在两个for循环内获得它。

目标是使模拟适合实验数据,并通过最小二乘法检索最佳a,b和c值。 我可以给参数做一个很好的初步猜测。然而,具有3个拟合参数以及用于确定Ysimul的已经很大的计算时间使得该问题非常麻烦。 所以我想知道的是:

使用lsqcurvefit等功能可以解决这个问题吗? 如果是这样,你能提供一些如何做的提示吗?

1 个答案:

答案 0 :(得分:0)

只是解决方案

这是lsqnonlin的标准用法,你只需要正确地格式化它。这意味着这样的事情:

%First, define a function whose inputs are a single vector, and whose
%outputs can be minimized
funToMinimize = @(abc) myfunction(Xdata,abc(1), abc(2), abc(3)) - Ydata;

%Define an initial guess of the values (including the size of the vector)
abcInitial = [0 0 0]; %Or whatever your best guess is

%Then use the nonlinear fit
abcFit = lsqnonlin(funToMinimize , abcInitial);

<强>示范

我显然无法为您的myfunction问题生成解决方案,但我们仍然可以完成重要步骤。

首先,让我们定义一个函数来模拟您的myfunctionXdataYdata

%Define some complicated-ish "myfuction", with inputs that match yours
myfunction = @(xsimul, a, b, c) sqrt(abs(xsimul))*a + sin(xsimul)*b*a^2 + c;
%Define "Xdata"
Xdata = linspace(0,10,100);
%Define "Ydata", note that I'm sneaking in a set of (a, b, c) values here
Ydata = myfunction(Xdata, 1, 2, 3);

现在,让我们运行上面答案中的步骤:

funToMinimize = @(abc) myfunction(Xdata,abc(1), abc(2), abc(3)) - Ydata;
abcInitial = [0 0 0];
abcFit = lsqnonlin(funToMinimize , abcInitial)

最后一步应返回[1 2 3],与用于生成Ydata的(a,b,c)值相匹配。