2016-03-28 49 views
0

我有一组实验点适合模拟到具有多个拟合参数

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(targetvalue))而在两个for循环内获得。

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

这个问题是否可行使用像lsqcurvefit函数? 如果是这样,你能提供关于如何去做的提示吗?

+0

要在这里确认:'Xdata'和'Ydata'是相同大小的载体? 'a','b'和'c'是标量?目标是找到'a','b'和'c'的最佳估计值以适应所提供的数据? – Pursuit

+0

是Xdata和Ydata大小相等,a,b,c是要估计的标量。我应该指出的。并感谢您的快速回复!我会尝试基于你的提示来实现这个算法 – BMST

回答

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,XdataYdata

%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],匹配(A,B,C)用于生成Ydata值。