方波图不正确

时间:2014-03-06 22:03:46

标签: matlab discretization

我很尴尬地问这个,因为我相信我可能会遗漏一些明显的东西,但我只是看不出我错在哪里。作为一个更大的计划的一部分,我正在研究离散化方法的应用,以近似方波上的对流方程。但是,我注意到在某些情况下,我的方波的边界被错误地应用了。当10.25 <= X <= 10.5时,它应该具有1的初始条件,并且在其他地方应该具有0。这是问题的一个例子:

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。我希望我已经充分解释了这个问题,如果我犯了一个愚蠢的错误,我会事先道歉。

2 个答案:

答案 0 :(得分:1)

完成end

后,您忘记了if
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)<=10.5

如果你在这一点上有所不同,matlab会告诉你

x(1051)-10.5

ans =

     1.776356839400250e-15

因为四舍五入,x(j)的值略大于10.5,不等于你的预期

答案 1 :(得分:1)

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

j=1051;
format long;
x(j)

ans =

10.500000000000002

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

roundn(x(j), -2)