AN ENROLMENT PROJECTION PROBLEM

Discussion in 'Python' started by Ajith Prasad, Jun 29, 2003.

  1. Ajith Prasad

    Ajith Prasad Guest

    I would appreciate advice on how best to formulate the following
    problem in Python. I have originally posted the problem to the J
    Programming forum and received a one-line formulation ((#s)
    (|.s)&(+/@:*)\ I)! I was wondering what the equivalent Python
    formulation would be.

    The Problem:

    The enrolment E(n) of an institution at the beginning of year n is the
    sum of the intake for year n, I(n), and the survivors from the intakes
    of previous r years. Thus, if s(1) is the 1-year intake survival rate,
    s(2) is the 2-year survival rate, etc, we have:

    E(n)= I(n)+I(n-1)*s(1)+ I(n-2)*s(2)+...+I(n-r)*s(r)
    E(n+1)= I(n+1)+I(n)*s(1)+I(n-1)*s(2)+... +I(n-r-1)*s(r)
    ..
    ..
    ..
    E(n+k)= I(n+k)+I(n+k-1)*s(1)+I(n+k-2)*s(2)+...+I(n+k-r)*s(r)

    Given:
    (a) the actual intakes for the current and previous r years, I(n),
    I(n-1),I(n-2),..,I(n-r), and the planned intakes for the next n+k
    years: I(n+1), I(n+2),..., I(n+k), we have the intake vector I =
    (I(n-r), I(n-r-1),...,I(n),I(n+1),..., I(n+k)); and
    (b) the survival rate vector, s = (1,s(1), s(2),...,s(r))
    Find:
    The k*1 enrolment projection column vector, E =
    (E(n+1),E(n+2),...,E(n+k)) in terms of a k*(r+1) matrix P (derived
    from
    I) and the (r+1)*1 column vector, s.

    I = P*s

    Is there a compact Python representation of the relevant matrix P
    where:

    P = [I(n+1) I(n) I(n-1).. . I(n-r)
    I(n+2) I(n+1) I(n)... I(n-r-1)
    .
    .
    I(n+k) I(n+k-1) I(n+k-2)... I(n+k-r)]

    Alternatively, a non-matrix formulation of the problem would be
    acceptable. Thanks in advance for any suggestions on how to proceeed.
    Ajith Prasad, Jun 29, 2003
    #1
    1. Advertising

  2. Ajith Prasad

    Ajith Prasad Guest

    Donald 'Paddy' McCarthy <> wrote in message news:<>...
    > Ajith Prasad wrote:
    > > I would appreciate advice on how best to formulate the following
    > > problem in Python. I have originally posted the problem to the J
    > > Programming forum and received a one-line formulation ((#s)
    > > (|.s)&(+/@:*)\ I)! I was wondering what the equivalent Python
    > > formulation would be.

    >
    > Wow! that one line formulation is dense.
    > Why do you *want* a compact answer?
    > I'm curious, if you put it down, do you have problems undestanding the
    > above program in a weeks time?
    > Or in a days time?
    >
    > Cheers, Pad.
    >
    >
    > >
    > > The Problem:
    > >
    > > The enrolment E(n) of an institution at the beginning of year n is the
    > > sum of the intake for year n, I(n), and the survivors from the intakes
    > > of previous r years. Thus, if s(1) is the 1-year intake survival rate,
    > > s(2) is the 2-year survival rate, etc, we have:
    > >
    > > E(n)= I(n)+I(n-1)*s(1)+ I(n-2)*s(2)+...+I(n-r)*s(r)
    > > E(n+1)= I(n+1)+I(n)*s(1)+I(n-1)*s(2)+... +I(n-r-1)*s(r)
    > > .
    > > .
    > > .
    > > E(n+k)= I(n+k)+I(n+k-1)*s(1)+I(n+k-2)*s(2)+...+I(n+k-r)*s(r)
    > >
    > > Given:
    > > (a) the actual intakes for the current and previous r years, I(n),
    > > I(n-1),I(n-2),..,I(n-r), and the planned intakes for the next n+k
    > > years: I(n+1), I(n+2),..., I(n+k), we have the intake vector I =
    > > (I(n-r), I(n-r-1),...,I(n),I(n+1),..., I(n+k)); and
    > > (b) the survival rate vector, s = (1,s(1), s(2),...,s(r))
    > > Find:
    > > The k*1 enrolment projection column vector, E =
    > > (E(n+1),E(n+2),...,E(n+k)) in terms of a k*(r+1) matrix P (derived
    > > from
    > > I) and the (r+1)*1 column vector, s.
    > >
    > > I = P*s
    > >
    > > Is there a compact Python representation of the relevant matrix P
    > > where:
    > >
    > > P = [I(n+1) I(n) I(n-1).. . I(n-r)
    > > I(n+2) I(n+1) I(n)... I(n-r-1)
    > > .
    > > .
    > > I(n+k) I(n+k-1) I(n+k-2)... I(n+k-r)]
    > >
    > > Alternatively, a non-matrix formulation of the problem would be
    > > acceptable. Thanks in advance for any suggestions on how to proceeed.

    I do not require an equally compact Python formulation - any solution
    that works will do. The J solution works but I do not why! It was
    formulated by a J expert and if one is very competent in J, I suppose
    one could follow the logic. In Python, I look forward to a readable
    and comprehensible solution. Thanks.
    Ajith Prasad, Jun 30, 2003
    #2
    1. Advertising

  3. Quoth Ajith Prasad:
    > I would appreciate advice on how best to formulate the following
    > problem in Python. [...]


    If you really want to bring out the linear algebra guns, I'm sure
    Numeric has everything you need. But for a problem this simple,
    I'd just write

    def enrollment(year, intake, survivalrate):
    return sum([intake[year-i]*rate
    for i, rate in enumerate(survivalrate)])

    That's for Python 2.3. In 2.2 you could write

    def enrollment(year, intake, survivalrate):
    sum = 0
    for i in range(len(survivalrate)):
    sum = sum + intake[year-i]*survivalrate
    return sum

    In either case, using it might look something like this:

    # survivalrate[n] is proportion of students who survive n years.
    survivalrate = [1, 0.5, 0.25, 0.1]

    # intake[n] is the number of students intook in year n.
    actualintake = {
    1993: 980, 1994: 1019, 1995: 1038, 1996: 1046, 1997: 1043,
    1998: 970, 1999: 954, 2000: 980, 2001: 952, 2002: 1047,
    }
    plannedintake = {2003: 1000, 2004: 1000, 2005: 1100, 2006: 1200}

    intake = actualintake.copy()
    intake.update(plannedintake)

    print enrollment(2004, intake, survivalrate)

    Note that the intake vectors are dicts, not lists; I do this so I
    can avoid index-twiddling. I find the code to be easier to read
    and write this way.

    --
    Steven Taschuk
    Every public frenzy produces legislation purporting to address it.
    (Kinsley's Law)
    Steven Taschuk, Jun 30, 2003
    #3
  4. Ajith Prasad

    Ajith Prasad Guest

    Steven Taschuk <> wrote in message news:<>...
    > Quoth Ajith Prasad:
    > > I would appreciate advice on how best to formulate the following
    > > problem in Python. [...]

    >
    > If you really want to bring out the linear algebra guns, I'm sure
    > Numeric has everything you need. But for a problem this simple,
    > I'd just write
    >
    > def enrollment(year, intake, survivalrate):
    > return sum([intake[year-i]*rate
    > for i, rate in enumerate(survivalrate)])
    >
    > That's for Python 2.3. In 2.2 you could write
    >
    > def enrollment(year, intake, survivalrate):
    > sum = 0
    > for i in range(len(survivalrate)):
    > sum = sum + intake[year-i]*survivalrate
    > return sum
    >
    > In either case, using it might look something like this:
    >
    > # survivalrate[n] is proportion of students who survive n years.
    > survivalrate = [1, 0.5, 0.25, 0.1]
    >
    > # intake[n] is the number of students intook in year n.
    > actualintake = {
    > 1993: 980, 1994: 1019, 1995: 1038, 1996: 1046, 1997: 1043,
    > 1998: 970, 1999: 954, 2000: 980, 2001: 952, 2002: 1047,
    > }
    > plannedintake = {2003: 1000, 2004: 1000, 2005: 1100, 2006: 1200}
    >
    > intake = actualintake.copy()
    > intake.update(plannedintake)
    >
    > print enrollment(2004, intake, survivalrate)
    >
    > Note that the intake vectors are dicts, not lists; I do this so I
    > can avoid index-twiddling. I find the code to be easier to read
    > and write this way.


    Thank you very much. This does what I require.
    Ajith Prasad, Jul 1, 2003
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    1
    Views:
    340
    Roedy Green
    Nov 3, 2005
  2. Replies:
    0
    Views:
    561
  3. Bapaiah Katepalli
    Replies:
    1
    Views:
    1,494
    Mike Treseler
    Jun 23, 2006
  4. Projection of fractal surfaces

    , Feb 25, 2005, in forum: C Programming
    Replies:
    1
    Views:
    348
    Hans-Bernhard Broeker
    Feb 25, 2005
  5. Giuseppe Ottaviano

    Named tuples and projection

    Giuseppe Ottaviano, Jun 20, 2008, in forum: Python
    Replies:
    2
    Views:
    275
    Giuseppe Ottaviano
    Jun 20, 2008
Loading...

Share This Page