Mercurial > repos > public > sbplib
annotate +grid/bspline.m @ 1037:2d7ba44340d0 feature/burgers1d
Pass scheme specific parameters as cell array. This will enabale constructDiffOps to be more general. In addition, allow for schemes returning function handles as diffOps, which is currently how non-linear schemes such as Burgers1d are implemented.
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Fri, 18 Jan 2019 09:02:02 +0100 |
parents | 4f7930d2d2c4 |
children |
rev | line source |
---|---|
197
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
1 % Calculates a D dimensional p-order bspline at t with knots T and control points P. |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
2 % T = [t0 t1 t2 ... tm] is a 1 x (m+1) vector with non-decresing elements and t0 = 0 tm = 1. |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
3 % P = [P0 P1 P2 ... Pn] is a D x (n+1) matrix. |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
4 |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
5 % knots p+1 to m-p-1 are the internal knots |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
6 |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
7 % Implemented from: http://mathworld.wolfram.com/B-Spline.html |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
8 function C = bspline(t,p,P,T) |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
9 m = length(T) - 1; |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
10 n = size(P,2) - 1; |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
11 D = size(P,1); |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
12 |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
13 assert(p == m - n - 1); |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
14 |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
15 C = zeros(D,length(t)); |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
16 |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
17 for i = 0:n |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
18 for k = 1:D |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
19 C(k,:) = C(k,:) + P(k,1+i)*B(i,p,t,T); |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
20 end |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
21 end |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
22 |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
23 % Curve not defined for t = 1 ? Ugly fix: |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
24 I = find(t == 1); |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
25 C(:,I) = repmat(P(:,end),[1,length(I)]); |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
26 end |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
27 |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
28 function o = B(i, j, t, T) |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
29 if j == 0 |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
30 o = T(1+i) <= t & t < T(1+i+1); |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
31 return |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
32 end |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
33 |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
34 if T(1+i+j)-T(1+i) ~= 0 |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
35 a = (t-T(1+i))/(T(1+i+j)-T(1+i)); |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
36 else |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
37 a = t*0; |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
38 end |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
39 |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
40 if T(1+i+j+1)-T(1+i+1) ~= 0 |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
41 b = (T(1+i+j+1)-t)/(T(1+i+j+1)-T(1+i+1)); |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
42 else |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
43 b = t*0; |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
44 end |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
45 |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
46 o = a.*B(i, j-1, t, T) + b.*B(i+1, j-1, t, T); |
4f7930d2d2c4
Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
47 end |