2
$\begingroup$

For example, suppose I wanted to define a function, f that is $f(x)=x^2$ except at $x=1$, where $f(x)=5$

Two ways I can define this are

f[1]=5;
f[x_]:=x

or

g[x_]:= Piecewise[{{5,x==1}},x^2]

What are the benefits/pitfalls of one approach vs the other? Or are they the same?

$\endgroup$
3
  • 1
    $\begingroup$ You didn't mention using If[] statement or Which[] They are different. The first method uses two patterns. There are several benefits/pitfalls, but that requires much explaining. $\endgroup$ – Somos Nov 12 '20 at 0:23
  • $\begingroup$ @Somos Sorry for not mentioning. $\endgroup$ – user106860 Nov 12 '20 at 0:59
  • $\begingroup$ Another way: f[x_]:=Which[x==1,5,True,x^2] $\endgroup$ – wuyudi Nov 12 '20 at 4:19
3
$\begingroup$

They differ in how they handle the function's derivative.

Clear["Global`*"]

f1[1] = 5;
f1[x_] := x^2

f1'[x]

(* 2 x *)

f1'[1]

(* 2 *)

f2[x_] := Piecewise[{{5, x == 1}}, x^2]

f2'[x]

(* Piecewise[{{0, x == 1}}, 2*x] *)

f2'[1]

(* 0 *)

f3[x_] := Piecewise[{{x^2, x < 1 || x > 1}}, 5]

f3'[x]

(* Piecewise[{{2*x, x < 1 || x > 1}}, Indeterminate] *)

f3'[1]

(* Indeterminate *)
$\endgroup$
2
  • $\begingroup$ Oof. Thanks. Wouldn't the second technically be better if we cared about derivatives then? $\endgroup$ – user106860 Nov 12 '20 at 0:57
  • 2
    $\begingroup$ I would think that the third is better. $\endgroup$ – Bob Hanlon Nov 12 '20 at 1:11
3
$\begingroup$

When you write

f[1] = 5;
f[x_] := x

you are specifying how expressions will be rewritten during evaluation. f[1] is just a pattern: any expression that matches that pattern will be rewritten as 5. The 'Blank' pattern represents anything else, so:

f[y]
(* y *)

The possibility that y might take the value 1 at some later stage of the computation isn't taken into account.

One the other hand:

g[x_] := Piecewise[{{5, x == 1}}, x^2]
g[y]
(* Piecewise[{{5, y == 1}}, y^2] *)

This treats y properly as a variable.

Note that symbolic mathematics in Mathamatica can "reason" about Piecewise expressions, but cannot do so with collections of rewriting rules, so f is not a suitable function to feed to symbolic methods.

$\endgroup$
2
  • $\begingroup$ Thanks for the response. Quick clarifying question on one sentence in your answer: you say f[1] is just a pattern, any expression that matches that pattern will be rewritten as 5". Isn't f[1] the only expression that matches that pattern? $\endgroup$ – user106860 Nov 12 '20 at 1:31
  • 1
    $\begingroup$ @user106860 Yes. Of course, it could be a subexpression of some more complicated expression. $\endgroup$ – John Doty Nov 12 '20 at 1:36

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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