【问题标题】:Incorrect Square Wave Plot方波图不正确
【发布时间】:2014-03-06 22:03:45
【问题描述】:

我很尴尬地问这个问题,因为我相信我可能遗漏了一些明显的东西,但我就是看不出哪里出错了。作为一个更大项目的一部分,我正在研究应用离散化方法来近似方波上的对流方程。但是,我注意到在某些情况下,我的方波的边界被错误地应用了。当 10.25

L=20;                   %domain length
dx=0.01;                %space step
nx=(L/dx);              %number of steps in space
x=0:dx:(nx-1)*dx;       %steps along x
sqr=zeros(1,nx);        %pre-allocate array space

for j=1:nx
    if ((10.25<=x(j))&&(x(j)<=10.5))  
        sqr(j)=1;
    else
        sqr(j)=0;
end
d=plot(x,sqr,'r','LineWidth',2);    axis([10.1 10.6 0 1.1]);
drawnow;

在这种情况下,波形显示不正确,x=10.5 取值为 0 而不是 1,如下所示:

https://dl.dropboxusercontent.com/u/8037738/project/square_wave.png

奇怪的是,如果我将域长度更改为不同的值,它有时会正确显示。这是当域长度设置为 30 并正确显示时:

https://dl.dropboxusercontent.com/u/8037738/project/square_wave_correct.png

我真的不明白,因为我的 x 数组总是以 0.01 的间隔离散化,所以它在循环时永远不会“错过”10.5。我希望我已经充分解释了这个问题,如果这是我的愚蠢错误,我提前道歉。

【问题讨论】:

    标签: matlab discretization


    【解决方案1】:

    当你完成if时,你忘记了end

    L=20;                   %domain length
    dx=0.01;                %space step
    nx=(L/dx);              %number of steps in space
    x=0:dx:(nx-1)*dx;       %steps along x
    sqr=zeros(1,nx);        %pre-allocate array space
    
    eps = 1.e-8;    
    
    for j=1:nx
        if ((10.25-eps<=x(j))&&(x(j)<=10.5+eps))  
            sqr(j)=1;
        else
            sqr(j)=0;
        end
    end
    d=plot(x,sqr,'r','LineWidth',2);    axis([10.1 10.6 0 1.1]);
    drawnow;
    

    我还建议您在使用浮点值进行比较时使用较小的容差,例如 x(j)&lt;=10.5

    如果你在这一点上看到了差异,matlab 会告诉你

    x(1051)-10.5
    
    ans =
    
         1.776356839400250e-15
    

    所以由于四舍五入,x(j) 的值略大于 10.5,与您预期的不相等

    【讨论】:

    • 太棒了!我忘了把end 复制过来。我觉得需要添加公差很奇怪,这肯定是人们的普遍问题吗?不过感谢您的解决方案。
    【解决方案2】:

    您的问题是 x 值不完全落在空间步上。例如,如果您查看以下内容:

    j=1051;
    format long;
    x(j)
    
    ans =
    
    10.500000000000002
    

    sebas 的答案通过为每个边界添加容差来解决此问题。在执行 if 语句中的逻辑之前,您还可以尝试将 x(j) 舍入到最接近的第 100 位:

    roundn(x(j), -2)
    

    【讨论】:

      猜你喜欢
      • 2014-04-29
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多