繁体   English   中英

如何在Matlab中更改lsqcurvefit中的步骤?

[英]How to change the step in lsqcurvefit in Matlab?

我遇到以下错误:

lsqcurvefit stopped because the size of the current step is less than
the default value of the step size tolerance.

步长公差为默认值(1e-6)。 问题是我正在使用X中的巨大功能(X = 1e7中的步骤)。 您可能会猜到,lsqcurvefit根本不会收敛。

如何修改步骤,使其更容易收敛?

这是Lorentzien的创作:

Gamma=[4e6 4e6 4e6];
C=1;
m=0;
Amplitude=[1.5 5];
Width=[0.15 0.25];
Offset=[1 2];
GuessC=Offset;

Aub = 2e7;
Alb = 5e6;
NUub = FreqR*0.999;
NUlb = FreqR*0.800;


for i=1:Nombre
    Ampl(i,1) = Alb + (Aub-Alb).*rand;
    Ampl(i,2) = Alb + (Aub-Alb).*rand;
    Ampl(i,3) = Alb + (Aub-Alb).*rand;
    Pic1 = RoundTo(NUlb + (NUub-NUlb).*rand,-6);
    Pic2 = RoundTo(NUlb + (NUub-NUlb).*rand,-6);
    Pic3 = RoundTo(NUlb + (NUub-NUlb).*rand,-6);

    T0=[Ampl(i,1) Ampl(i,2) Ampl(i,3)];
    nurG(i,1) = min([Pic1 Pic2 Pic3]);
    nurG(i,2) = median([Pic1 Pic2 Pic3]);
    nurG(i,3) = max([Pic1 Pic2 Pic3]);
    X1=nurG(i,1)-FreqR*0.025:FreqR*0.0003:FreqR;
    N=length(X1);
    Y1=zeros(1,N);

    for j=1:N   
       Y1(j)=(2*T0(1)/pi)*(Gamma(1)/(4*(X1(j)-nurG(i,1))^2+Gamma(1)^2))+(2*T0(2)/pi)*(Gamma(2)/(4*(X1(j)-nurG(i,2))^2+Gamma(2)^2))+(2*T0(3)/pi)*(Gamma(3)/(4*(X1(j)-nurG(i,3))^2+Gamma(3)^2))+C+m*randn();
    end

XP1 = X1/(FreqR*0.009);

Frequency=[nurG(i,1)/(FreqR*0.009) nurG(i,3)/(FreqR*0.009)];
GuessP11=(Width./(2*pi)).*(Amplitude-Offset);
GuessP21=Frequency;
GuessP31=Width.^2/4;
GuessP12=(Width./(2*pi)).*(Amplitude-Offset);
GuessP22=Frequency;
GuessP32=Width.^2/4;
GuessP13=(Width./(2*pi)).*(Amplitude-Offset);
GuessP23=Frequency;
GuessP33=Width.^2/4;

[yprime params resnorm residual]=lorentzfit3(XP1,Y1,[],[GuessP11(1) GuessP21(1) GuessP31(1) GuessP12(1) GuessP22(1) GuessP32(1) GuessP13(1) GuessP23(1) GuessP33(1) GuessC(1); GuessP11(2) GuessP21(2) GuessP31(2) GuessP12(2) GuessP22(2) GuessP32(2) GuessP13(2) GuessP23(2) GuessP33(2) GuessC(2)]);

在lorentzfit3中,有一系列的if来查看Guess是否正确。 但我将跳过这一部分。 Guess给出了从哪里开始寻找的想法。

[params resnorm residual] = lsqcurvefit(@lfun3c,p0,x,y,lb,ub,optimset('MaxFunEvals',200000,'MaxIter',10000,'TolFun',1e-18));
yprime = lfun3c(params,x);

end % MAIN

function F = lfun3c(p,x)
F = p(1)./((x-p(2)).^2+p(3)) + p(4)./((x-p(5)).^2+p(6)) + p(7)./((x-p(8)).^2+p(9)) + p(10);
end % LFUN3C

您可以重写函数,以便采用更合理缩放的参数:

function f = myfun(x)
f = myBigFun(1e7 * x);

其中myBigFun是您的原始函数-但现在myfun具有x,该x在较小的步长范围内缩放。

当您查看函数返回的值时,这也是一个好主意。 有时优化无法看到您感兴趣的顺序的变化,因此,再次将函数的输出缩放到“合理范围”有助于确保“事物表现”。

经常有意义的另一件事,尤其是当最佳值位于“很大的某个地方”时,正在重新确定函数的中心:将函数定中心,而不是从1000000到1000001,因此您正在寻找-0.5之间的值和0.5

只是一些想法可以对您有所帮助...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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