1

我有以下必须适合数据的自定义函数:

function y=reflectometriaRC(x,v0,t0,v1,t1,v2,v3,tau)

y=zeros(size(x));

for i=1:length(x)
    if x(i)<t0,
        y(i)=v0;
    elseif x(i)<t0+t1,
        y(i)=v1;
    else
        y(i)=v2+v3*(1-exp(-(x(i)-(t0+t1))/tau));
    end
end
end

您可以在下图中看到此函数的示例:

在此处输入图像描述

问题是我找不到正确的选项来使“适合”功能正常工作。

我试过这样的事情:

x=transpose([0:200*10^-12:1200*10^-9]);
y=reflectometriaRC(x,0,100*10^-9,0.98,100*10^-9,0,1.96,250*10^-9);
ft = fittype('reflectometriaRC(x,v0,t0,v1,t1,v2,v3,tau)');
f = fit( x, y, ft,'Robust','on', 'MaxFunEvals',600000,'MaxIter',400000000, 'StartPoint', [0, 0, 0.5, 0, 0,0, 0], 'Lower',[0, 0, 0.5, 0, 0,0, 0]  );
coeffvalues(f)

但结果只是某种阶跃函数。

知道什么是使拟合工作的好配置吗?


此代码的想法是从与基本 TDR 之类的脉冲发生器一起使用的示波器中获取测量值。被测器件在 1m 同轴线末端的 RC 电路中。上面链接中的图像是以秒和伏特为单位的可能值的比例。

4

1 回答 1

1

一般来说,将多参数模型拟合到约束不足的数据是一个难题。您最终可能不得不使用更复杂的方法,例如使用马尔可夫链蒙特卡洛方法——它的好处是可以保证收敛到全局误差最小值(尽管不是在可预测的时间内)。

您是否尝试过使用不同的拟合算法?如果您可以访问统计工具箱,请尝试doc nlinfit. 此函数可以使用 Levenberg-Marquardt 算法或迭代重新加权最小二乘算法。此外,您可以相对轻松地获得拟合参数的置信区间,这使您可以很好地了解拟合的好坏。

拟合效果不佳的原因是,默认情况下,它使用 Levenberg-Marquardt 算法,该算法依赖于容易陷入局部最小值的梯度下降方法。所以,公平地说,是 nlinfit,但你对它有更多的控制权。

首先,稍微重新定义你的函数:

function y=reflectometriaRC(b, x)
%The function to fit; inputs: b, a vector of parameters, and x, 
%the independent variable (e.g. time)
v0=b(1);
t0=b(2);
v1=b(3);
t1=b(4);
v2=b(5);
v3=b(6);
tau=b(7);

y=zeros(size(x));

for i=1:length(x)
    if x(i)<t0,
        y(i)=v0;
    elseif x(i)<t0+t1,
        y(i)=v1;
    else
        y(i)=v2+v3*(1-exp(-(x(i)-(t0+t1))/tau));
    end
end
end

然后,在您的脚本中:

opts = statset('nlinfit');
opts.RobustWgtFun = 'bisquare';
beta0= [0, 0, 0.5, 0, 0,0, 0];
params=nlinfit(x, y, @reflectometricaRC, beta0,opts);

这将返回相对接近真实参数的参数——从数字上讲,四个中的三个相同(零),其他的在两倍之内,但拟合仍然不是很好。您可能要么必须使用beta0,所使用的错误模型,要么 - 我的建议 - 使用更多的计算时间并采用MCMC方法 - 这是我在拟合高维模型时使用的方法。

希望有帮助!

于 2014-06-25T09:18:20.000 回答