我有以下必须适用于数据的自定义函数:
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
您可以在下图中看到此功能的示例:
问题在于我无法找到正确的选项来使#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电路中。 上面链接中的图像是以秒和伏特为单位的可能值的比例。
答案 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方法 - 这是我在拟合高维模型时使用的方法。
希望有所帮助!