Initial commit
[pftoolbox.git] / expressions / @xtable / gradx.m
blob9d618ac22d32f027cd494bbdcd99cbbf9ff63444
1 function v=gradx(obj,x,t,w,u)\r
2 % Evaluates the gradient object at time t, with respect to x.\r
3 %\r
4 % Syntax: (* = optional)\r
5 %\r
6 % v = gradx(obj, x, t, w, u);\r
7 %\r
8 % In arguments:\r
9 %\r
10 % 1. obj\r
11 %       The xtable object containing the gradient.\r
12 %       Must be generated by a call to the 'initgradx' method before use.\r
13 % 2. x\r
14 %       A column vector or a scalar containing x(t).\r
15 % 3. t\r
16 %       A scalar containing the time t.\r
17 % 4. u\r
18 %       A column vector or scalar containing u(t).\r
19 % 5. w\r
20 %       A column vector or scalar containing w(t)\r
21 %\r
22 % Out arguments:\r
23 %\r
24 % 1. v\r
25 %       A matrix containing the gradient at time t.\r
27 % Toolbox for nonlinear filtering.\r
28 % Copyright (C) 2005  Jakob Rosén <jakob.rosen@gmail.com>\r
29 %\r
30 % This program is free software; you can redistribute it and/or\r
31 % modify it under the terms of the GNU General Public License\r
32 % as published by the Free Software Foundation; either version 2\r
33 % of the License, or (at your option) any later version.\r
34 %\r
35 % This program is distributed in the hope that it will be useful,\r
36 % but WITHOUT ANY WARRANTY; without even the implied warranty of\r
37 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
38 % GNU General Public License for more details.\r
39 %\r
40 % You should have received a copy of the GNU General Public License\r
41 % along with this program; if not, write to the Free Software\r
42 % Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\r
44 if obj.interpolate\r
45         tvec=find(obj.Ts>=t);\r
47         if isempty(tvec)\r
48                 % t>Ts(max)\r
49                 Ts=obj.Ts;\r
50                 gradx=obj.gradx;\r
51                 idxup=length(Ts);\r
52                 idxlow=idxup-1;\r
53                 tup=Ts(idxup);\r
54                 tlow=Ts(idxlow); % An error here means that Ts contains too few elements for interpolation\r
55                 vlow=gradx(:,:,idxlow);\r
56                 vup=gradx(:,:,idxup);\r
57                 v=vup+(vup-vlow)./(tup-tlow).*(t-tup);                  \r
58                 return;         \r
59         end\r
61         idxup=tvec(1);\r
62         Ts=obj.Ts;\r
63         tup=Ts(idxup);\r
64         if tup==t\r
65                 % Right on target. No interpolation needed.\r
66                 v=obj.gradx(:,:,idxup);\r
67         elseif idxup>1\r
68                 % t is somewhere in Ts\r
69                 gradx=obj.gradx;\r
70                 idxlow=idxup-1;\r
71                 tlow=Ts(idxlow);\r
72                 vlow=gradx(:,:,idxlow);\r
73                 vup=gradx(:,:,idxup);\r
74                 v=vlow+(vup-vlow)./(tup-tlow).*(t-tlow);\r
75         else\r
76                 % idxup==1 and t~=tup, so t<Ts(min)\r
77                 gradx=obj.gradx;\r
78                 v=gradx(:,:,1)+(gradx(:,:,2)-gradx(:,:,1))./(Ts(2)-tup).*(t-tup);                       \r
79         end\r
80 else\r
81         tvec=find(obj.Ts>=t);\r
82         if isempty(tvec)\r
83                 v=obj.gradx(:,:,end);\r
84         else\r
85                 v=obj.gradx(:,:,tvec(1));\r
86         end\r
87 end\r