Refine
vs Simplify
Mathematica is a term rewriting system, whenever we enter an expression, then it is evaluated by term rewriting using (built-in or user-defined) rewrite rules (see e.g. Evaluation) , so by default it "simplifies" some expressions, e.g. :
a + b - a
b
So this makes an impression, that Refine
performs some simplifications, although documentation states that it yields the form of an expression which would be obtained if symbols in it were replaced by explicit numerical expressions satisfying the assumptions (defualt if not specified).
However, sometimes algorithms behind Simplify
appear not easily adjusting to do simple tasks unlike Refine
, although they contain transformations done by Refine
. A direct example :
{Refine, Simplify, FullSimplify} @@ {-Re[x + y], (x | y) \[Element] Reals} // Through
{-x - y, -Re[x + y], -Re[x + y]}
We can get -(x+y)
with Simplify
and FullSimplify
as well if we choose an appropriate ComplexityFunction
(not accessible with Refine
), you may look here. Simplification techniques offered by Simplify
and FullSimplify
include options like Trig
, TransformationFunctions
,ExcludedForms
etc. unlike for Refine
, where we can specify only assumptions or TimeConstraint
.
Simplify
vs FullSimplify
Expressions involving special functions
FullSimplify
allows simplifications involving special functions unlike Simplify
. There is no general definition of special functions, but basic ones are solutions of second order linear ordinary differential equations like e.g. hypergeometric functions, Bessel functions, Gegenbauer polynomials etc. on the other hand i.e. Riemann zeta function $\zeta\;$, one of the most amazing special functions is not a solution of any differential equation, however there is e.g. a functional equation relating it to Euler $\Gamma\;$ function :
$$ \zeta(z) = 2^z\pi^{z-1}\ \sin\left(\frac{\pi z}{2}\right)\ \Gamma(1-z)\ \zeta(1-z)$$
which helps to find easily trivial zeros of $\zeta$.
A = Through /@ {Simplify, FullSimplify} /@ {2^z Pi^(z - 1) Sin[Pi z/2] Gamma[1 - z] Zeta[1 - z],
Gamma[1 - x] Gamma[x] Sin[Pi x]};
Grid[ Array[ InputField[ Dynamic[ A[[#1, #2]]], FieldSize -> 20] &, {2, 2}]]

Elementary expressions
Simplify
is clearly more limited than FullSimplify
and the differences are distingushible not only for special functions. See for example this post for an apparent difference of behaviors for simple polynomials.
Here is another difference for quite elementary expressions :
Through @ { Simplify, FullSimplify } @
(Sqrt[ a^2 - 2 a b c + b^2 c^2] /. {a -> 8, b -> Sqrt[2], c -> 3})
{ Sqrt[ 82 - 48 Sqrt[2]], 8 - 3 Sqrt[2]}
Clearly, if we assume e.g. b -> Sqrt[2]
, then Simplify
cannot tackle such a simple expression,
although it can do it on a more general symbolic level if an appropriate assumption is given :
{Simplify, FullSimplify} @@ {Sqrt[a^2 - 2 a b c + b^2 c^2], a - b c > 0} // Through
{a - b c, a - b c}
and we see that Refine
does not simplify anything here.
Another slightly more involved example, where Simplify
works with assumptions only on the symbolic level :
Column @
Through @
({Refine, Simplify, FullSimplify} @@
{a + b + c - Sqrt[a^2 + b^2 + c^2 + 2 b c + 2 Sqrt[a^2 b^2 + a^2 c^2 + 2 (a^2) b c]],
a > 0 && b + c > 0})

but not for numeric values :
Column @ Through @ {Refine, Simplify, FullSimplify} @
(Sqrt[2] + 2 Sqrt[3] + 3 Sqrt[5] - Sqrt[ 12 Sqrt[15] + 2 Sqrt[24 Sqrt[15] + 114] + 59])

Refine
dosen't do anything here, i.e. it works here just like Identity
, Simplify
here only groups terms (24 Sqrt[15] + 114 -> 6( 19 + 4 Sqrt[15]
), while FullSimplify
does the full simplification.
Using Simplify
is of course advantageous (because of time needed to perform a task) when we want to deal with large expressions and apply some simple algebraic transformations, e.g. for tensors in general relativity.