Suppose I have two functions $h_1(x)$ and $h_2(x)$, for which we know their sum and their difference: $$ h_1(x)+h_2(x) = d(x) \qquad h_1(x)-h_2(x) = i f(x) $$

I have a complicated expression, in which I'd like to replace these sums and subtractions. In principle, I could just define

h1[x_]:= 1/2 (d[x] + I f[x])
h2[x_]:= 1/2 (d[x] - I f[x])

and use Simplify. However, this is not an option as I'd like to keep the $h_i(x)$ when they appear alone (i.e. not as a sum/subtraction). So I defined a function simp as follows:

simp[a_. (b_. h1[x_] + b_. h2[x_]) + e_.] := simp[2 a b d[x] + e]
simp[a_. (b_. h1[x_] - b_. h2[x_]) + e_.] := simp[2 a b I f[x] + e]

This works for the addition, but not for the subtraction, as can be seen with the test expressions:

simp[1/2 a h1[x] + 1/2 a h2[x]]
simp[1/2 a h1[x] - 1/2 a h2[x]]

Why is this? Any idea how I can solve it?


1 Answer 1


The problem is that the pattern -b_. h2[x_] doesn't match the expression -1/2 a h2[x].

The reason is that putting a minus sign in front of a symbol means Times[-1, symbol] whereas a negative number is atomic (i.e. it is not represented as a positive number multiplied by -1). So a pattern like -x_ will not match a negative number:

MatchQ[-2, -x_]
(* False *)

In your case the pattern looks like Times[-1, b_. h2[x_]] and the expression looks like Times[Rational[-1,2], a h2[x], so they don't match.

One way to proceed is to use a pattern with different factors in front of the two terms and a Condition that one is the negative of the other:

simp[a_. (b_. h1[x_] + c_. h2[x_]) + e_.] /; b == -c := simp[2 a b I f[x] + e]

simp[1/2 a h1[x] - 1/2 a h2[x]]
(* simp[I a f[x]] *)
  • $\begingroup$ Perfect! This works, thanks. $\endgroup$ Jun 14, 2013 at 11:05

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.