繁体   English   中英

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

[英]Using Matlab's lsqcurvefit to Calculate Infinite Relaxation Spectrum

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

General_Function

给定一个实验数据系列(上图),作者通过求解实验数据(上图)和模型数据(下图)之间的平方和之差来提取弛豫谱(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)应该类似于下图。

EgFig

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

EgFig

假设您具有向量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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM