[Thread Prev][Thread Next][Index]
Re: [ferret_users] How to do @rsum and @iin in reverse?
Actually, an ok solution is pretty easy. It's not quite Steve's
suggestion (which doesn't work), but is simpler:
yes? let test = {1,2,3,4,5,6}
yes? list test, test[i=@rsum], test[i=@sum] - test[i=@rsum] +
test ! add the variable itself to the reverse running sum
X: 0.5 to 6.5
Column 1: TEST is {1,2,3,4,5,6}
Column 2: TEST[X=@RSU] is {1,2,3,4,5,6} (running sum on X)
Column 3: EX#3 is TEST[I=@SUM]-TEST[I=@RSUM]+TEST
TEST TEST EX#3
1 / 1: 1.000 1.00 21.00
2 / 2: 2.000 3.00 20.00
3 / 3: 3.000 6.00 18.00
4 / 4: 4.000 10.00 15.00
5 / 5: 5.000 15.00 11.00
6 / 6: 6.000 21.00 6.00
The third column is the desired reversed running sum.
The same thing can be achieved with an irregular interval as follows:
Suppose the variable yvar is on a y axis with variable intervals:
! get the box size
! ybox is in axis units. Typically this would be in degrees latitude
! in that case multiply by meters/degree latitude
let mpd=111200 ! meters/degree latitude
let yvarbox=ybox[gy=yvar]*mpd
let yvar_rev_iin = yvar[y=@din] - yvar[y=@iin] + yvar*yvarbox
Billy
On 14Jul 2006, at 11:05 AM, Steve Hankin wrote:
Hi Billy,
I have just a few minutes, but maybe can shed a little light on
this. I think this is the deal:
The underlying math is simply that
INTEGRAL[x to b] = INTEGRAL[a to b] - INTEGRAL[a to x]
The thing is, that this statement is true where x is a continuous
variable. Here we are on a discretized axis, where each value on
our axis actually represents a cell. As you move from low to high
along the axis the running sum is really the integral across that
full cell. But the coordinate point lies in the center of the
cell (ignoring the complexities of irregular cell sizes for this
discussion). I've attempted to draw an axis to illustrate. The
carets ("^") show where the values is located on the axis in each
case.
direction of integration ==>
| 1 | 2 | 3 | 4 | 5 | 6 |
@RSUM ^ ^ ^ ^ ^ ^
"correct" ^ ^ ^ ^ ^ ^
So there is a 1/2 cell shift -- @RSUM (or equivalently @IIN) would
be "correctly" placed1/2 of a cell to the right of its coordinate
value. There is also a 1/2 grid cell shift in the definite
integral for the full span -- TEST[i=1:6@SUM] is actually the
integral value up to the boundary between I=6 and I=7. I think
when you apply the integral formula above in the face of these two
1/2 cell shifts, you are seeing a full cell shift in the result.
(I haven't had time to think of a way to really visualize if this
is right ....)
Anyway there are three ways to adjust the calculation to make it
just right:
make it "theoretically correct" by correcting all of your values to
the center point of the cell. This simply involves subtracting 1/2
of the cell value of the top cell in the integration. But the
results are not going to feel "natural" for a simple sum
LET test_rsum = test[i=@rsum]-0.5*test
add the value of the low cell to the reverse integration
LET test_rsum_rev = test[i=@sum] - test[i=@rsum] + test[i=`lo`]
or
shift the result with the @SHF operator
I'm afraid I don't have time to actually test any of these out.
Hopefully they are not complete nonsense!
- steve
============================
William S. Kessler wrote:
This may be a really stupid question. How does one perform @rsum
or @iin in reverse (i.e. sum from the high-index end of the list)?
The answer I would have given before I actually looked at it in
detail would have been: subtract the running sum or integral from
the definite sum over the whole range. And indeed I have done this
many times. But the result is not quite as expected, as the
following example shows:
yes? let test = {1,2,3,4,5,6}
yes? list test, test[i=@rsum], test[i=@sum] - test[i=@rsum]
X: 0.5 to 6.5
Column 1: TEST is {1,2,3,4,5,6}
Column 2: TEST[X=@RSU] is {1,2,3,4,5,6} (running sum on X)
Column 3: EX#3 is TEST[I=@SUM]-TEST[I=@RSUM]
TEST TEST EX#3
1 / 1: 1.000 1.00 20.00
2 / 2: 2.000 3.00 18.00
3 / 3: 3.000 6.00 15.00
4 / 4: 4.000 10.00 11.00
5 / 5: 5.000 15.00 6.00
6 / 6: 6.000 21.00 0.00
The second column does what we want in a running sum: the first
value is the value of the function over interval 1. The second
value is the sum of the function at intervals 1+2. The last value
is the sum over the whole range, as it should be. But I had hoped
and expected that the third column would be the reverse: The last
value (i=6) should be the last value of the function (6), the
second-to-last should be the sum of the two last values (6+5=11),
and the first value should be the same sum as if the operation
were done the other way (21). But it isn't. The whole thing is
shifted by 1 interval, the value in position 6 is 0, and the value
in position 1 is not the whole sum.
Am I missing something obvious???? What is the proper way to take
a running sum or integral in reverse? It should be possible to get
the same qualities of the answer doing the operation in either
direction.
Billy K
-- -- Steve Hankin, NOAA/PMEL -- Steven.C.Hankin@noaa.gov 7600 Sand
Point Way NE, Seattle, WA 98115-0070 ph. (206) 526-6080, FAX (206)
526-6744
[Thread Prev][Thread Next][Index]
Dept of Commerce /
NOAA /
OAR /
PMEL /
TMAP
Contact Us | Privacy Policy | Disclaimer | Accessibility Statement