使用Matlab';s LSQ曲线拟合计算无限弛豫谱

使用Matlab';s LSQ曲线拟合计算无限弛豫谱,matlab,Matlab,我试图复制在出版物中执行的分析,但遇到了问题。这是关于试图从流变数据计算无限松弛谱 给出一个实验数据系列(上图),作者通过求解实验数据(上图)和模型数据(下图)之间的平方和差来提取弛豫谱(H(tau)) 这种松弛遵循以下关系描述的分布 此计算使用matlabs lsqcurefit函数执行。但是,lsqcurvefit不接受函数作为可解参数。我想知道如何使用此matlab函数完成此提取 编辑:在本托的评论之后,这里是对我问题的澄清 为了节省空间,我将详细介绍以下内容 我有以下形式的实验数据

我试图复制在出版物中执行的分析,但遇到了问题。这是关于试图从流变数据计算无限松弛谱

给出一个实验数据系列(上图),作者通过求解实验数据(上图)和模型数据(下图)之间的平方和差来提取弛豫谱(H(tau))

这种松弛遵循以下关系描述的分布

此计算使用matlabs lsqcurefit函数执行。但是,lsqcurvefit不接受函数作为可解参数。我想知道如何使用此matlab函数完成此提取

编辑:在本托的评论之后,这里是对我问题的澄清

为了节省空间,我将详细介绍以下内容

我有以下形式的实验数据:频率值向量(ω)、扩展数据和Gdp响应值向量(Gdp)

我想计算H(tau),为此我需要该函数中包含的参数。这给出了我需要解析的以下表达式:

Gdp是ω的函数,我的扩展数据是ω值的向量,但我是关于ln(tau)的积分。这似乎可能是个问题

此外,我没有6个变量的预期初始值的明确理想,只有结果H(tau),因此我选择了任意值作为开始。如果可以获得计算值,我可以优化它们的相对值

根据您的建议,我的matlab代码如下:

w = numdata(:,1); %w is omega (experimental xdata)
GdpExp = numdata(:,3); % response values (ydata)
x0 = [10,10,0.1,0.1,1,1]; % arbitrary intial values
H = @(x, xdata) x(1)*exp(-(xdata-log(x(3))).^2/x(5)^2/2)...
    + x(2)*exp(-(xdata-log(x(4))).^2/x(6)^2/2);

Gdp = @(A_1, A_2, tau_1, tau_2, sigma_1, sigma_2, w) ...
    integral(H([A_1, A_2, tau_1, tau_2, sigma_1, sigma_2], ...
    u).* w.*exp(u)./(1+w.^2.*exp(2*u)), -Inf, Inf);

lsqcurvefit(Gdp, x0, w, GdpExp);
此电流产生以下错误:

>> lsqcurvefit(Gdp, x0, w, GdpExp);
Not enough input arguments.

Error in

Inf_Spec_Test>@(A_1,A_2,tau_1,tau_2,sigma_1,sigma_2,w)integral
(H([A_1,A_2,tau_1,tau_2,sigma_1,sigma_2],u).*w.*exp(u)./(1+w.^2.*exp(2*u)),
-Inf,Inf)

Error in lsqcurvefit (line 202)
        initVals.F = feval(funfcn_x_xdata{3},xCurrent,XDATA,varargin{:});

Caused by:
Failure in initial objective function evaluation. LSQCURVEFIT cannot 
continue.
我是否正确地认为每个函数都是自包含的,或者A_1、A_2等的命名应该与x(1)、x(2)相同,或者A_1等的标签只是指计算值

实验数据和计算的H(tau)应类似于下图

我还发现了以下关系,它可以用来将omega向量转换为tau向量,这可能有助于克服当前扩展数据和积分之间的差异


假设你有
H(tau)
的实验数据,以向量
Y
的形式,你想拟合你的模型
H

H = @(A_1, A_2, tau_1, tau_2, sigma_1, sigma_2, tau) ...
      A1*exp(-(log(tau)-log(tau_1)).^2/sigma_1^2/2) + A2*exp(-(log(tau)-log(tau_2)).^2/sigma_2^2/2);
lsqcurvefit
要求函数的形式为
f(x,扩展数据)
。这里
xdata
是“时间数据”,命名函数的所有系数
tau
,以及
x
。因此,重写函数
H
给出:

H = @(x, xdata) x(1)*exp(-(log(xdata)-log(x(3))).^2/x(5)^2/2) + x(2)*exp(-(log(xdata)-log(x(4))).^2/x(6)^2/2);
然后我估计你对所有六个系数的值都有一些初步的猜测。否则,拟合可能不会收敛到适当的解。我把这个初始猜测称为
x0
,它是长度为6的向量。要获得合适的身材,只需拨打:

lsqcurvefit(H, x0, tau, Y)
您可能需要添加更多选项(如参数边界),有关详细信息,请参阅
lsqcurvefit
的文档

编辑

按照下面注释中的详细信息,对于几个
omega
(在向量
W
中)的值,您有一个值向量
G+G'

因此,您想要拟合的函数稍微复杂一些:

H = @(x, xdata) x(1)*exp(-(xdata-log(x(3))).^2/x(5)^2/2) + x(2)*exp(-(xdata-log(x(4))).^2/x(6)^2/2);

GGp = @(A_1, A_2, tau_1, tau_2, sigma_1, sigma_2, w) ...
      integral(H([A_1, A_2, tau_1, tau_2, sigma_1, sigma_2], u).* w.*exp(u).*(1+w.*exp(u))./(1+w.^2.*exp(2*u)), -Inf, Inf);
变量稍作更改后,
u=ln(tau)

那么它就是完全相同的东西,只是你现在有一个不同的功能来适应:

lsqcurvefit(GGp, x0, W, Y)

你的问题不够清楚。您希望使用哪个函数来拟合数据?如果要将
H
拟合到数据中,拟合程序将搜索参数的最佳值(所有A_i、sigma_i和tau_i),给定值向量
tau
和实验
H
。Hi Bentoy。从描述的方式来看,作者似乎在拟合实验数据和模型数据之间的差异,以提取H(拉紧)函数的值。然后提取H(tau)的参数,全部采用LSQ曲线拟合。这是我遇到的问题的一部分,因为我不知道如何用lsqcurvefit适当地构造输入参数,这样我就可以得到这个结果。嗨,Bentoy。也许我没有把我的问题解释清楚。我希望通过拟合两组(G'+G'')来找到H(tau)。一组G'+G''是实验性的。另一个包含我想要提取的H(tau)。描述的程序似乎使两者相互适合,以找到H(tau)的值,从而使它们相等,同时最小化最小平方。在这两种情况下,时域由频率(ω)值给出。很抱歉给你添了点麻烦。@NzFrancis我没有仔细看你的问题!你想计算的未知变量仍然是函数H的系数,对吗?我只是想计算H(Tau)(全局值序列,比如把G’(ω)转换成H(Tau))。现在,我不明白的是如何提取H(tau),因为它是一个函数。似乎我需要为G'+G''数据系列上的每个点提取一个值。此外,由于这是一个关于ln(tau)的积分,并且ln(tau)存在于H(tau)函数中,我对如何构造输入参数以获得所需的输出感到困惑。我希望这是有意义的。@NzFrancis回答更新。您不应该拘泥于搜索函数这一事实。既然你有解的解析形式,你想计算这个函数的系数。谢谢你更新的答案,我会在下周回来的时候试试,让你知道它是怎么回事。