I am interested in expanding a vector expression in terms of the scalar parameter, but it doesn't give the expected result

$Assumptions = (ϵ) ∈ Reals;
$Assumptions = (r | k) ∈ Vectors[3, Reals];

A[r_] := Module[{M},
$Assumptions = r ∈ Vectors[3, Reals];
M = r + k*ϵ // Simplify;

q[r_] := Module[{M},
$Assumptions = r ∈ Vectors[3, Reals];
M = ϵ*(r\[Cross]A[r]) + ϵ*r // Simplify;


Coefficient[Expand[TensorReduce[q[r]], ϵ], ϵ, 1]

Coefficient[Expand[TensorReduce[q[r]], ϵ], ϵ, 2]


Output of the first Coefficient is

    r + r\[Cross](r + k ϵ)

and should be

   r+ r\[Cross]r (* same as just r *)

and output of the second Coefficient is


and should be

  • $\begingroup$ "doesn't give the expected result" - what is the expected result? $\endgroup$
    – Jason B.
    Commented Aug 28, 2018 at 13:36
  • $\begingroup$ You really don't need to use Module for these functions, you could rewrite them as A[r_] := Assuming[r ∈ Vectors[3, Reals], r + k*ϵ // Simplify ]; q[r_] := Assuming[r ∈ Vectors[3, Reals], ϵ*(r\[Cross]A[r]) + ϵ*r // Simplify ]; $\endgroup$
    – Jason B.
    Commented Aug 28, 2018 at 13:39
  • $\begingroup$ same problem with this. The expected result is r for the first Coefficient and r x k for the second one. $\endgroup$ Commented Aug 28, 2018 at 13:54
  • 2
    $\begingroup$ I can't really help on that, just trying to help formulate the question better. It doesn't really have anything to do with the Module, so the title of the question should be changed. Next, you should edit the question to show what output you do get and what output you expect. $\endgroup$
    – Jason B.
    Commented Aug 28, 2018 at 14:02
  • 1
    $\begingroup$ You need to use $Assumptions = ϵ∈Reals && (r|k)∈Vectors[3,Reals] at the top, and remove the redefinitions of $Assumptions in your code. $\endgroup$
    – Carl Woll
    Commented Aug 28, 2018 at 14:27

1 Answer 1


When you set the value of $Assumptions, the old value of $Assumptions is lost. Instead, use Assuming:


Assuming[assum, expr] evaluates expr with assum appended to $Assumptions, so that assum is included in the default assumptions used by functions such as Refine, Simplify, and Integrate.

In your case you need to use Assuming when you call TensorReduce. So:

$Assumptions = ϵ∈Reals && (r|k)∈Vectors[3, Reals];

A[r_] := r + k ϵ

q[r_] := ϵ (r \[Cross] A[r]) + ϵ r

expanded = Assuming[rp ∈ Vectors[3, Reals], Expand @ TensorReduce[q[rp]]]

Coefficient[expanded, ϵ, 1]

Coefficient[expanded, ϵ, 2]

rp ϵ - ϵ^2 k \[Cross] rp


-k \[Cross] rp


Your Answer

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

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