2014-03-06 84 views
1

我很尷尬地問這個,因爲我相信我可能會錯過某些明顯的東西,但我不知道自己出錯的地方。作爲一個更大程序的一部分,我正在研究離散化方法在方波上近似對流方程的應用。但是,我注意到,在某些情況下,我的方波的邊界被錯誤地應用。當其他地方的10.25 < = X < = 10.5和0時,它應具有1的初始條件。這是問題的一個示例:不正確的方波波形

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它循環通過。我希望我已經充分解釋了這個問題,如果這是我的一個愚蠢的錯誤,我提前道歉。

回答

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)w稍微大於10.5,不等於你所期待的

+0

好極了!我忘了複製'結束'了。我發現奇怪的是需要增加容忍度,這對於人們來說肯定是一個普遍問題?儘管感謝解決方案。 – Jimog

1

你的問題是,x值不完全落在空間步驟上。例如,如果你看看下面:

j=1051; 
format long; 
x(j) 

ans = 

10.500000000000002 

從sebas答案通過將容忍到每個邊界的解決這個問題。您也可以嘗試四捨五入X(j)至最近的100 if語句執行邏輯之前:

roundn(x(j), -2)