Mercurial > repos > public > sbplib
comparison diracDiscr.m @ 649:1bdbe026abbc feature/d1_staggered
Make diracDiscr return zeros if x0 is outside grid.
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Tue, 14 Nov 2017 15:40:06 -0800 |
parents | 9e5dd0d3cf60 |
children | 4ee7d15bd8e6 |
comparison
equal
deleted
inserted
replaced
648:9e5dd0d3cf60 | 649:1bdbe026abbc |
---|---|
1 function ret = diracDiscr(x_0in , x , m_order, s_order, H) | 1 function ret = diracDiscr(x_0in , x , m_order, s_order, H) |
2 | 2 |
3 fnorm = diag(H); | 3 % Return zeros if x0 is outside grid |
4 eta = abs(x-x_0in); | 4 if(x_0in < x(1) || x_0in > x(end) ) |
5 h = x(2)-x(1); | |
6 tot = m_order+s_order; | |
7 S = []; | |
8 M = []; | |
9 poss = find(tot*h/2 >= eta); | |
10 | 5 |
11 % Ensure that poss is not too long | 6 ret = zeros(size(x)); |
12 if length(poss) == (tot + 2) | 7 |
13 poss = poss(2:end-1); | 8 else |
14 elseif length(poss) == (tot + 1) | 9 |
15 poss = poss(1:end-1); | 10 fnorm = diag(H); |
11 eta = abs(x-x_0in); | |
12 h = x(2)-x(1); | |
13 tot = m_order+s_order; | |
14 S = []; | |
15 M = []; | |
16 poss = find(tot*h/2 >= eta); | |
17 | |
18 % Ensure that poss is not too long | |
19 if length(poss) == (tot + 2) | |
20 poss = poss(2:end-1); | |
21 elseif length(poss) == (tot + 1) | |
22 poss = poss(1:end-1); | |
23 end | |
24 | |
25 % Use first tot grid points | |
26 if length(poss)<tot && eta(end)>eta(1) | |
27 index=1:tot; | |
28 pol=(x(1:tot)-x(1))/(x(tot)-x(1)); | |
29 x_0=(x_0in-x(1))/(x(tot)-x(1)); | |
30 norm=fnorm(1:tot)/h; | |
31 | |
32 % Use last tot grid points | |
33 elseif length(poss)<tot && eta(end)<eta(1) | |
34 index = length(x)-tot+1:length(x); | |
35 pol = (x(end-tot+1:end)-x(end-tot+1))/(x(end)-x(end-tot+1)); | |
36 norm = fnorm(end-tot+1:end)/h; | |
37 x_0 = (x_0in-x(end-tot+1))/(x(end)-x(end-tot+1)); | |
38 | |
39 % Interior | |
40 else | |
41 pol = (x(poss)-x(poss(1)))/(x(poss(end))-x(poss(1))); | |
42 x_0 = (x_0in-x(poss(1)))/(x(poss(end))-x(poss(1))); | |
43 norm = fnorm(poss)/h; | |
44 index = poss; | |
45 end | |
46 | |
47 h_pol = pol(2)-pol(1); | |
48 b = zeros(m_order+s_order,1); | |
49 | |
50 for i = 1:m_order | |
51 b(i,1) = x_0^(i-1); | |
52 end | |
53 | |
54 for i = 1:(m_order+s_order) | |
55 for j = 1:m_order | |
56 M(j,i) = pol(i)^(j-1)*h_pol*norm(i); | |
57 end | |
58 end | |
59 | |
60 for i = 1:(m_order+s_order) | |
61 for j = 1:s_order | |
62 S(j,i) = (-1)^(i-1)*pol(i)^(j-1); | |
63 end | |
64 end | |
65 | |
66 A = [M;S]; | |
67 | |
68 d = A\b; | |
69 ret = x*0; | |
70 ret(index) = d/h*h_pol; | |
16 end | 71 end |
17 | 72 |
18 % Use first tot grid points | |
19 if length(poss)<tot && eta(end)>eta(1) | |
20 index=1:tot; | |
21 pol=(x(1:tot)-x(1))/(x(tot)-x(1)); | |
22 x_0=(x_0in-x(1))/(x(tot)-x(1)); | |
23 norm=fnorm(1:tot)/h; | |
24 | |
25 % Use last tot grid points | |
26 elseif length(poss)<tot && eta(end)<eta(1) | |
27 index = length(x)-tot+1:length(x); | |
28 pol = (x(end-tot+1:end)-x(end-tot+1))/(x(end)-x(end-tot+1)); | |
29 norm = fnorm(end-tot+1:end)/h; | |
30 x_0 = (x_0in-x(end-tot+1))/(x(end)-x(end-tot+1)); | |
31 | |
32 % Interior | |
33 else | |
34 pol = (x(poss)-x(poss(1)))/(x(poss(end))-x(poss(1))); | |
35 x_0 = (x_0in-x(poss(1)))/(x(poss(end))-x(poss(1))); | |
36 norm = fnorm(poss)/h; | |
37 index = poss; | |
38 end | |
39 | |
40 h_pol = pol(2)-pol(1); | |
41 b = zeros(m_order+s_order,1); | |
42 | |
43 for i = 1:m_order | |
44 b(i,1) = x_0^(i-1); | |
45 end | |
46 | |
47 for i = 1:(m_order+s_order) | |
48 for j = 1:m_order | |
49 M(j,i) = pol(i)^(j-1)*h_pol*norm(i); | |
50 end | |
51 end | |
52 | |
53 for i = 1:(m_order+s_order) | |
54 for j = 1:s_order | |
55 S(j,i) = (-1)^(i-1)*pol(i)^(j-1); | |
56 end | |
57 end | |
58 | |
59 A = [M;S]; | |
60 | |
61 d = A\b; | |
62 ret = x*0; | |
63 ret(index) = d/h*h_pol; | |
64 end | 73 end |
65 | 74 |
66 | 75 |
67 | 76 |
68 | 77 |