使用Matlab的lsqcurvefit计算无限弛豫谱

时间:2018-09-06 11:33:46

标签: matlab

我正在尝试复制出版物中执行的分析,但遇到了麻烦。这是关于尝试根据流变数据计算无限松弛谱。

General_Function

考虑到实验数据序列(上图),作者通过求解实验数据(上图)与模型数据(下图)之间的平方和之差来提取弛豫谱(H(tau))。

Model

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

Relaxation Model

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

编辑:在Bentoys评论之后,这是我的问题的澄清。

我将仅针对G''(Gdp)详细介绍以下内容,以节省空间。

我有以下形式的实验数据:频率值(omega),xdata和Gdp响应值(Gdp)的向量。

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

Mix

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)应该类似于下图。

EgFig

我还发现以下关系可用于将omega向量转换为tau向量,这可能有助于克服当前xdata与积分之间的差异。

EgFig

1 个答案:

答案 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是“时间数据”,分别命名了函数的所有系数taux。因此,重写函数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)