lsqcurvefit中的错误,无法为Arrhenius拟合

时间:2017-09-18 08:23:39

标签: matlab curve-fitting

我试图使用lsqcurvefit将Arrhenius形式的方程拟合到某些数据点。

    D = D0 * exp( -Ea / ( R * T ));   % Arrhenius equation for curve fitting

D0和Ea是我要找的值。 T是温度,表示X,D是系数,表示Y,R是气体常数。 由于matlab在没有提供jacobian的情况下找不到解决方案,我计算了jacobian并包含了一个函数,正如@ m7913d在我之前的帖子中所证明的那样([Matlab curve-fitting won't work for small values (1e-12), what can I do?再次感谢!)。

当我尝试运行代码时,Matlab会返回一个错误,指出所提供的雅可比行星具有错误的尺寸,并且它的大小应为5乘2。

    Error using lsqncommon (line 45)
    Supplied Jacobian is not the correct size:
    the Jacobian matrix should be 5-by-2.

但是,对应于主拟合方程的雅可比行列式由Matlab作为1乘4矩阵返回。我用以下方式计算了它:

    syms D0 Ea R T
    F = D0 * exp(-Ea./(R.* T));
    J = jacobian(F)

    J = [ exp(-Ea/(R*T)), -(D0*exp(-Ea/(R*T)))/(R*T), ... 
    (D0*Ea*exp(-Ea/(R*T)))/(R^2*T), (D0*Ea*exp(-Ea/(R*T)))/(R*T^2)]

但是Matlab不会接受这个雅各比矩阵来执行lsqcurvefit操作。

我该怎么办?我在某处错过了什么吗? 我知道D0应该是1e-5的数量级,Ea是170e3左右。

任何帮助都将受到赞赏。这是我使用的代码的最小示例。请注意,此代码将导致上述错误。

clear all

R1F = [1250 2.5e-11; 1300 2.7e-11; 1350 7.1e-11; 1400 7.2e-11; 1450 1.1e-10];           % test data

 R = 8.3144598;                  % [(kg*m^2) / (s^2 * mol * K)]
 xdata = [R1F(:,1)+272]';
 ydata = R1F(:,2)';

 D0 = 0.1;   % start guess
 Ea = 0.1;   % start guess


 options = optimoptions('lsqcurvefit', 'StepTolerance', 1e-12, ...
'OptimalityTolerance', 1e-12, 'FunctionTolerance', 1e-12, ...
'FiniteDifferenceType', 'central', 'SpecifyObjectiveGradient', true);           
 [X, resnorm, residual, EXITFLAG, OUTPUT] = lsqcurvefit(@(x, xdata) ...
 z(x(1), x(2), xdata, R),[D0 Ea], xdata, ydata, [], [], options);

D0 = X(1);
Ea = X(2);


semilogy(10000./xdata,ydata, '*')
hold on
semilogy(10000./xdata, z(D0, Ea, xdata, R))
hold off


function [F, J] = z(D0, Ea, T, R)
  F = D0 * exp(-Ea./(R.* T));              % function to fit to the datapoints
  J = [ exp(-Ea./(R.*T)), -(D0.*exp(-Ea./(R.*T)))./(R.*T), ...
(D0*Ea*exp(-Ea./(R.*T)))./(R.^2*T), (D0*Ea*exp(-Ea./(R.*T)))./(R.*T.^2)];    % Jacobian of the fit function
end

2 个答案:

答案 0 :(得分:1)

jacobian的大小确实应为5x2

  • 每个样本点一行(长度xdata
  • 您想要适​​合的每个变量的一列

因此,T应该是列向量并且在计算时 jacobian,你应该指定他有哪些变量来计算 衍生物。请注意,即使订单也很重要!

答案 1 :(得分:0)

我没有解决我要求的确切问题,但我找到了解决问题的方法。我计算的jacobian是正确的,但Matlab只是找不到合适的解决方案。

所以我将方程式转换为对数空间中的线性形式。等式的形式现在是:

    log(D) = - (Ea / (ln(10)*R*T) + log(D0)

我能够使用“拟合”拟合参数,并从得到的拟合参数计算Ea和D0的值。

所以,对我来说这个问题已经解决了,但是如果有人知道matlab最初问题的解决方案没有找到指数方程的解决方案,请随意分享。