我的代码中有一个错误,我不知道在哪里! [MATLAB]

时间:2018-02-28 05:05:57

标签: matlab

我正在尝试重现article的结果。但到目前为止,我还没有成功。这是我写的代码

  

编辑:根据Zizy Archer的初步评论,代码已经修改。

clear;
Nmax        =  30;              % number of rounds
M           =  10000;           % number of simulations
beta0       =  5*10^-6;         % relative clock offset in micro seconds
alpha0      =  1.01;            % relative clock skew
for simN = 1:M

for N  = 1:Nmax

    mean_dly    =  randi([20 50],N,1).*10^-6;         % micro seconds
    stdd_dly    =  randi([1 5],N,1).*10^-6;           % micro seconds

    XpropDly    =  normrnd(mean_dly,stdd_dly,N,1);    % micro seconds
    YpropDly    =  normrnd(mean_dly,stdd_dly,N,1);    % micro seconds
    prcssTme    =  randi([100 500],N,1).*10^-6;       % micro seconds
    T_1         =  (1:N)'*10^-3;                         % milli seconds
    T_2         =  T_1 + XpropDly;                       % milli seconds
    T_3         =  T_2 + prcssTme;                       % milli seconds
    T_4         =  T_3 + YpropDly;                       % milli seconds

    % actual time
    T_2act      =  (T_1 + XpropDly).*alpha0 + beta0;
    T_3act      =  (T_4 - YpropDly).*alpha0 + beta0;

    % equation 13
    A           =  sum(T_2act(1:N) + T_3act(1:N));
    B           =  sum(T_1(1:N) + T_4(1:N));
    C           =  sum((T_2act(1:N) + T_3act(1:N)).^2);
    D           =  sum((T_2act(1:N) + T_3act(1:N)).*(T_1(1:N) + T_4(1:N)));

    % equation 16
    alpha0est(simN,N)     =  (A.^2-C.*Nmax)./(A.*B-D.*Nmax);
    beta0est(simN,N)      =  (B.*C-A.*D)./(2.*(A.*B-D.*Nmax));
end
timestamps            =  [T_1 T_2 T_3 T_4];
clear T_*;
end
% equation 29 and 30
MSE_alpha   =  sum((alpha0est - alpha0).^2)/M;
MSE_beta    =  sum((beta0est - beta0).^2)/M;

figure %2(a)
semilogy(1:Nmax,MSE_beta.*10^12)
xlabel('N');ylabel('MSE of the estimated offset \beta_{0}')
figure %2(b)
semilogy(1:Nmax,MSE_alpha)
xlabel('N');ylabel('MSE of the estimated skew \alpha_{0}')
  

但这就是我得到的:

enter image description here

  

EDIT2 :删除了代码段。

有谁能告诉我我的代码有什么问题?
提前感谢你们。

1 个答案:

答案 0 :(得分:3)

下次至少尝试一些基本的调试来弄清楚可能出错的地方。 要调试,可能会打印出一些变量或绘制内容。设置一些条件来检查这些值是否有所预期或没有意义。如果你知道这么一小段代码中的某些东西是错的,那就不难了(但是,如果没有你想要的纸张,那么这个bug可能潜伏了一段时间。)

嗯,对于这种情况下的逐步解决方案:

你立即注意到的是,如果你绘制alpha0est或beta0est,你对alpha的估计系统性地过高,单个圆形情况下的1.015而不是1.01,类似于beta。 现在,它会是什么?它显然不是信号处理或延迟中的噪声,这个显示为平均值周围所有这些毛茸茸的东西,你可以将所有延迟设置为0来验证这一点。所以,它必须是别的东西。 进一步观察,你可以注意到,当你增加轮数时,这个系统误差正在减少,并且已经完成了30轮。

所以,它必须是你正在做的轮数。现在尝试设置N = 10而不是30,现在10轮的情况很好。你有你的错误。本文中的公式13 - 您将N个元素相加。等式16类似地与N相乘。这个N显然必须是相同的数字。但事实证明,在你的代码中它并不是。代码中的公式13总结ROUNDS个案例。可以是1,可以是30.等式16乘以N(= 30,总是)。

如果您使用更齐全的变量名称(全部大写,真的吗?),这一切都可以轻松避免。如果您使用N表示执行的轮数,并且maxN作为限制,您可以尝试最多执行多少轮,那么您很容易就能做到。