TransWikia.com

Replacing variable in function definition

Mathematica Asked by Wizzerad on June 8, 2021

I would like to have a series of functions that depend one another, indexed by a number, and that are defined via a Do loop. However, Mathematica seems unable to replace the index in the loop. My trial code:

Do[
  If[i == 1,
    ff[i, x_, y_] := x + y;,
    ff[i, x_, y_] := (x - y)*ff[i - 1, x, y];
    ];
  , {i, 1, 2}];
ff[2, x, y]

Output:
(x – y) ff[-1 + i, x, y]

Desired output is however:
(x – y)(x + y)

This thing surprises me since if I manually define

ff[2, x_, y_] := (x - y)*ff[1, x, y];

then I get the desired output. It seems that the Do loop is not replacing inside the function.

Is this normal? 😮

One Answer

In your Do loop use Set rather than SetDelayed for the RHS to be evaluated.

Clear["Global`*"]

Using RSolve to directly obtain a closed-form solution for the nth function

ff[n_, x_, y_] = 
 f[n] /. RSolve[{f[1] == x + y, f[n] == (x - y)*f[n - 1]}, f[n], n][[1]]

(* (x - y)^(-1 + n) (x + y) *)

Alternatively, using explicit recursion

f2[1] = x + y;
f2[n_] := f2[n] = (x - y)*f2[n - 1]

Generating a sequence from the recursion

seq = f2 /@ Range[5]

(* {x + y, (x - y) (x + y), (x - y)^2 (x + y), (x - y)^3 (x + y), 
    (x - y)^4 (x + y)} *)

Then using FindSequenceFunction to generalize from the sequence, the result is identical to that provided by RSolve

FindSequenceFunction[seq, n] === ff[n, x, y]

(* True *)

Answered by Bob Hanlon on June 8, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP