使用自定义方程进行曲线拟合的Matlab选项(用于RC测量的TDR应用)

时间:2014-06-25 03:11:46

标签: matlab curve-fitting electronics oscilloscope

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

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

您可以在下图中看到此功能的示例:

enter image description here

问题在于我无法找到正确的选项来使#34; fit&#34;能够有效地工作。

我尝试过这样的事情:

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电路中。 上面链接中的图像是以秒和伏特为单位的可能值的比例。

1 个答案:

答案 0 :(得分:0)

通常,将多参数模型拟合到欠约束数据是一个难题。您最终可能必须使用更复杂的方法,例如使用马尔可夫链蒙特卡罗方法 - 这有利于保证收敛到全局误差最小值(尽管不是在可预测的时间内)。

您是否尝试过使用其他拟合算法?如果您有权访问统计工具箱,请尝试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,使用的错误模型,或者 - 我的建议 - 使用 lot 更多的计算时间并转到{{3方法 - 这是我在拟合高维模型时使用的方法。

希望有所帮助!