2
$\begingroup$

Consider the relations

$$ g_{k}(x) = c(x)\cdot g_{k-1}(x)+d(x), \quad f_{k}(x) = a(x)\cdot f_{k-1}(x)+c(x) g_{k-1}(x) $$ With $g_{0} = G, f_{0}=F$.

How can I get an arbitrary element $g_{k}(x)$ using Mathematica syntax?

$\endgroup$
2

2 Answers 2

4
$\begingroup$

Using RSolve

Clear["Global`*"]

sol = RSolve[{g[k] == c*g[k - 1] + d, f[k] == a*f[k - 1] + c*g[k - 1], 
      g[0] == G, f[0] == F}, {f, g}, k][[1]] /. {a -> a[x], c -> c[x], 
    d -> d[x]};

f[k_, x_] = f[k, x] /. sol // FullSimplify

(* (F a[x]^(2 + k) (-1 + c[x]) - a[x]^(1 + k) (-1 + c[x]) (F + (F - G) c[x]) + 
   a[x]^k (-1 + c[x]) c[x] (F - G + d[x]) + 
   a[x] c[x] (d[x] - c[x]^k (G (-1 + c[x]) + d[x])) + 
   c[x] (-c[x] d[x] + c[x]^k (G (-1 + c[x]) + d[x])))/((-1 + a[x]) (a[x] - 
     c[x]) (-1 + c[x])) *)

g[k_, x_] = g[k, x] /. sol // FullSimplify

(* (-d[x] + c[x]^k (G (-1 + c[x]) + d[x]))/(-1 + c[x]) *)

Verifying,

{g[k, x] == c[x]*g[k - 1, x] + d[x],
  f[k, x] == a[x]*f[k - 1, x] + c[x]*g[k - 1, x],
  f[0, x] == F, g[0, x] == G} // Simplify

(* {True, True, True, True} *)
$\endgroup$
5
$\begingroup$

The recursion strategy seems independent of the x dependence, so I omit it.

My solution is not efficient, but there are many explanations of how to define Factorial recursively for efficiency (storing values already computed). I omit that small step for clarity too. The Simplify below is not necessary.

Define

g[0] = G; f[0] = F
g[k_Integer] := Simplify[c*gk[k-1] + d]
f[k_Integer] := Simplify[a+f[k-1]+c*g[k-1]]

Then

f[2] //InputForm

Gives

2*a + F + c^2*G + c*(d + G)

Rather than Integer, you could test for positive integers.

Bob's answer is better as it solves the recurrence relations once and for all. Depends on what you want.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.