[英]Using Matlab's lsqcurvefit to Calculate Infinite Relaxation Spectrum
我正在尝试复制出版物中执行的分析,但遇到了麻烦。 这是关于尝试从流变数据计算无限松弛谱。
给定一个实验数据系列(上图),作者通过求解实验数据(上图)和模型数据(下图)之间的平方和之差来提取弛豫谱(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与整数之间的差异。
假设您具有向量Y
形式的H(tau)
实验数据,则想要拟合模型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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.