2
$\begingroup$

Possible Duplicate:
Composition of mappings not working as expected

I am new to Mathematica and I am having trouble defining a certain composition of functions.

Let m1 and m2 be maps such that $m_1: \mathbb{R}^2 \to \mathbb{R}^2$ and $m_2: \mathbb{R}^2 \to \mathbb{R}^2$ where $\mathbb{R}$ is the real line

m1[eta_, zeta_] = {eta^3, zeta^3} 
m2[x_, y_] = x^2 + y^2

m3[eta_, zeta_]  = Composition[m2, m1][eta, zeta]

On evaluating the last line, I get the output

(* m2[{eta^3, zeta^3}] *)

But the anwer to this should be m3[eta,zeta]=eta^6 + zeta^6

How can I do this?

$\endgroup$
2
  • $\begingroup$ m3[eta_, zeta_] = m2 @@ m1[eta, zeta] see documentation about Apply $\endgroup$
    – ssch
    Commented Jan 10, 2013 at 15:36
  • $\begingroup$ Composition is only meaningful for single-argument functions. Make your functions take a single list-argument instead of several scalar arguments. $\endgroup$
    – Szabolcs
    Commented Jan 10, 2013 at 15:44

2 Answers 2

2
$\begingroup$

If your m1 function outputs a list of 2 values, your m2 function should take that as input. Makes sense, right?

m1[eta_, zeta_] = {eta^3, zeta^3}
m2[{x_, y_}] = x^2 + y^2

Otherwise, make it return a Sequence

m1[eta_, zeta_] = Sequence[eta^3, zeta^3]
m2[x_, y_] = x^2 + y^2

Now

m3[eta_, zeta_] = Composition[m2, m1][eta, zeta]

(*eta^6 + zeta^6*)
$\endgroup$
2
  • $\begingroup$ but then why shouldn't m1 take a list of 2 values, too? $\endgroup$ Commented Jan 10, 2013 at 16:12
  • $\begingroup$ @RolfMertig I agree, both getting a list may be a cleaner design $\endgroup$
    – Rojo
    Commented Jan 10, 2013 at 16:47
1
$\begingroup$

Maybe this is clearer? :

m1[{eta_,zeta_}]={eta^3,zeta^3};
m2[{x_,y_}]=x^2+y^2;
m3[{eta_,zeta_}]=Composition[m2,m1][{eta,zeta}]
$\endgroup$

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