我试图使用lsqcurvefit函数使用MATLAB拟合数据,但我遇到了一些麻烦。 MATLAB给了我以下信息。
Local minimum possible.
lsqcurvefit stopped because the size of the current step is less than
the selected value of the step size tolerance.
<stopping criteria details>
Optimization stopped because the norm of the current step, 5.578610e-021,
is less than options.TolX = 1.000000e-020.
Optimization Metric Options
norm(step) = 5.58e-021 TolX = 1e-020 (selected)
我尝试过改变TolX和TolFun,但唯一改变的是,该程序现在需要很长时间才能完成。
我试图适应的功能是:
function P = dIdV(delta, E, T)
%delta in eV
%E in eV
%T in K
gamma = 0.00001;
%IV curve
arr = zeros(size(E));
A = -E(length(E))*10:E(length(E))/750:E(length(E))*10;
for i=1:length(E)
arr(i) = trapz(A, (FermiDirac(-E(i)+A, T) - FermiDirac(A,T)) .* SCDOS(-E(i)+A, delta, gamma));
end
%derivative
B = zeros(size(E));
points = 49;
for i=1:length(E)-points
p = polyfit(E(i:i+points), arr(i:i+points), 1);
B(floor(points/2)+i-1) = p(1);
end
%vector size back to original
for k=0:ceil(points/2)
B(k+1) = B(floor(points/2));
B(length(E)-k) = B(length(E)-ceil(points/2)-1);
end
P = B
FermiDirac是
function P=FermiDirac(E,T)
%E in eV
%T in Kelvin
kb=8.617343*10^(-5);
P=1./(1+exp(E./(kb.*T)));
SCDOS
function N=SCDOS(E,delta,gamma)
%E in eV
%delta in eV
%gamma undefined
N=abs(real((E-1i*gamma)./sqrt((E-1i*gamma).^2-delta^2)));
我计算的是在某个温度T下超导体的dI / dV曲线。我应该通过拟合获得能隙(delta)的值。
我会在这里发布我的数据,但它长达10000点,所以我不确定如何发布。我已经尝试过滤我的数据以平滑曲线,但无济于事。我也试过使用不同的间隔。
欢迎任何关于如何开展这项工作的建议。也欢迎更好的健身方式。
编辑:Here's a graph数据。蓝线是在上面函数中计算的数据的导数,红线是过滤数据,绿线是理论曲线。我试图将红色的那个装到绿色的那个。