我有一套实验点
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等功能可以解决这个问题吗? 如果是这样,你能提供一些如何做的提示吗?
答案 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
问题生成解决方案,但我们仍然可以完成重要步骤。
首先,让我们定义一个函数来模拟您的myfunction
,Xdata
和Ydata
。
%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)值相匹配。