Mercurial > repos > public > sbplib
diff diracDiscr.m @ 651:4ee7d15bd8e6 feature/d1_staggered
Fix roundoff bug in diracDiscr and improve test.
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Wed, 15 Nov 2017 14:58:13 -0800 |
parents | 1bdbe026abbc |
children | 5264ce57b573 |
line wrap: on
line diff
--- a/diracDiscr.m Wed Nov 15 14:56:52 2017 -0800 +++ b/diracDiscr.m Wed Nov 15 14:58:13 2017 -0800 @@ -1,5 +1,7 @@ function ret = diracDiscr(x_0in , x , m_order, s_order, H) +m = length(x); + % Return zeros if x0 is outside grid if(x_0in < x(1) || x_0in > x(end) ) @@ -14,7 +16,7 @@ S = []; M = []; poss = find(tot*h/2 >= eta); - + % Ensure that poss is not too long if length(poss) == (tot + 2) poss = poss(2:end-1); @@ -23,19 +25,31 @@ end % Use first tot grid points - if length(poss)<tot && eta(end)>eta(1) + if length(poss)<tot && x_0in < x(1) + ceil(tot/2)*h; index=1:tot; pol=(x(1:tot)-x(1))/(x(tot)-x(1)); x_0=(x_0in-x(1))/(x(tot)-x(1)); norm=fnorm(1:tot)/h; % Use last tot grid points - elseif length(poss)<tot && eta(end)<eta(1) + elseif length(poss)<tot && x_0in > x(end) - ceil(tot/2)*h; index = length(x)-tot+1:length(x); pol = (x(end-tot+1:end)-x(end-tot+1))/(x(end)-x(end-tot+1)); norm = fnorm(end-tot+1:end)/h; x_0 = (x_0in-x(end-tot+1))/(x(end)-x(end-tot+1)); + % Interior, compensate for round-off errors. + elseif length(poss) < tot + if poss(end)<m + poss = [poss; poss(end)+1]; + else + poss = [poss(1)-1; poss]; + end + pol = (x(poss)-x(poss(1)))/(x(poss(end))-x(poss(1))); + x_0 = (x_0in-x(poss(1)))/(x(poss(end))-x(poss(1))); + norm = fnorm(poss)/h; + index = poss; + % Interior else pol = (x(poss)-x(poss(1)))/(x(poss(end))-x(poss(1)));