我正在尝试复制出版物中执行的分析,但遇到了麻烦。这是关于尝试根据流变数据计算无限松弛谱。
考虑到实验数据序列(上图),作者通过求解实验数据(上图)与模型数据(下图)之间的平方和之差来提取弛豫谱(H(tau))。
这种松弛遵循以下关系所描述的分布。
此计算是使用matlabs lsqcurefit函数执行的。但是,lsqcurvefit不接受函数作为可解参数。我想知道如何使用此matlab函数完成提取。
编辑:在Bentoys评论之后,这是我的问题的澄清。
我将仅针对G''(Gdp)详细介绍以下内容,以节省空间。
我有以下形式的实验数据:频率值(omega),xdata和Gdp响应值(Gdp)的向量。
我想计算H(tau),为此,我将需要该函数中包含的参数。这给出了我需要解析的以下表达式:
Gdp是omega的函数,而我的xdata是omega值的向量,但是我正在就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向量,这可能有助于克服当前xdata与积分之间的差异。
答案 0 :(得分:0)
假设您以向量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)
形式的函数。这里的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
的文档。
编辑
在下面的注释中,有一个G+G'
值的向量,对应omega
的多个值(在向量W
中)。
因此,您要使用的功能要复杂一些:
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)