Translating (Transforming) a recursive function

  1. Hi,

    I am having trouble understanding how this works.

    I am giving the following:
    y[k+2] - y[k+1] + 0.24y[k] = f[k+2] - 2f[k+1];

    y[-2] = 1, y[-1] = 2;

    f[k] = 0 for k < 0;
    f[k] = k for k >= 0;

    I would like to have a program compute the next values in the sequence, so, I need y[-2] = 1 to become y[1] = 1 and y[-1] = 2 to become y[2] = 1 (so that the array indexing works, e.g., I can access a negative location of an array).

    I let k' = k + 1 so that I'd get:
    y[k'+3] - y[k'+2] + 0.24y[k'+1] = f[k'+3] - 2f[k'+1];
    Then I made:
    f[k] = 0 for k < 0;
    f[k] = k for k >= 0;
    become
    f[k'] = 0 for k' < 3;
    f[k'] = k for k' >= 3;
    and
    y[-2] = 1, y[-1] = 2;
    become
    y[1] = 1, y[2] = 2;

    So now I have:
    y[k'+3] - y[k'+2] + 0.24y[k'+1] = f[k'+3] - 2f[k'+1];
    f[k'] = 0 for k' < 3;
    f[k'] = k for k' >= 3;
    y[1] = 1, y[2] = 2;

    And now when I let k = 0, k[3] gives me the value that k[0] gave me in the old equation, which is exactly what I want.

    My issue is, I don't understand how, mathematically, this works. For example, I don't understand how I went from:
    f[k] = 0 for k < 0;
    f[k] = k for k >= 0;
    to
    f[k'] = 0 for k' < 3;
    f[k'] = k for k' >= 3;

    if k' = k + 1.

    It seems as though I've shifted the equation (y[k+2] - y[k+1] + 0.24y[k] = f[k+2] - 2f[k+1];) over by 1 unit in the positive x direction; however, I've shifted the initial values (y[-2] = 1, y[-1] = 2;) and the f's restrictions (k < 0; and k >= 0) over by 3 units.


    What I'm thinking is:
    The original question should be:
    f[k'] = 0 for k < k[0];
    f[k'] = k for k' >= k[0];
    y[k[0]-2] = 1, y[k[0]-1] = 2;

    What would be the correct, more formal approach to achieving what I want. Also, should the original question be as I've written above?

    I'm pretty sure that the equation, as it's give, only produces the 'correct' answer, when k[0] = -2.

    Thank you for your time, I realise that this question is rather lengthy.
     
    Last edited: Oct 30, 2011
  2. jcsd
  3. HallsofIvy

    HallsofIvy 40,800
    Staff Emeritus
    Science Advisor

    You simply shouldn't worry about "f(k) for k< -3" at all. Include, in your program,
    "Double f(Double x)
    {
    Double y= 0;
    if (x>= 0) y= x;
    return y;
    }
    and let the program handle shifts.
     
  4. Thanks for the reply. What do you mean by, "let the program handle the shift"?

    Do you mean by changing adding k+n to the original equation so that it works out?

    Also, I know that I didn't say, but I'm actually doing this with MATLAB, I dont think that makes a difference. On know C++ though so I understand your code.
     
Know someone interested in this topic? Share a link to this question via email, Google+, Twitter, or Facebook

Have something to add?