我很尴尬地问这个,因为我相信我可能会遗漏一些明显的东西,但我只是看不出我错在哪里。作为一个更大的计划的一部分,我正在研究离散化方法的应用,以近似方波上的对流方程。但是,我注意到在某些情况下,我的方波的边界被错误地应用了。当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。我希望我已经充分解释了这个问题,如果我犯了一个愚蠢的错误,我会事先道歉。
答案 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)