MathGroup Archive 1999

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: "f[x_]:= 2 x" vs. "f = 2 #&"

  • To: mathgroup at smc.vnet.net
  • Subject: [mg16497] Re: [mg16365] "f[x_]:= 2 x" vs. "f = 2 #&"
  • From: "Allan Hayes" <hay at haystack.demon.co.uk>
  • Date: Tue, 16 Mar 1999 03:59:47 -0500
  • References: <7cd7qh$o8i@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Ersek, Ted R wrote in message <7cd7qh$o8i at smc.vnet.net>...
>Kevin Jaffe wrote:

snip

>-------------------------------
>Suppose you are writing a program with the form
>  func[x_]:= (*****algorithm*****)
>and (algorithm) has to make a function that will be used at later stages of
>(algorithm).
>
>It's illegal to use patterns on the right side of a definition.
>So (algorithm) can't make the function with the approach
>  f[x_]:= 2 x
>It also can't make the function with the approach
>  f[x_]= 2 x
>Instead (algorithm) must make the function with one of the following
>  f=2#&
>  f=Function[2#]
>  f=Function[x,2x]


>So when would you need to do this?
>One such case is the function below.  This function will plot a function
>using arbitrary precision arithmetic to sample the function.  This is
useful
>in special cases when a function must be sampled using arbitrary precision
>arithmetic.
>
>(***********)
>PrecisionPlot[f_,{x_,xmin_,xmax_},opts___?OptionQ]:=
> Module[{g,h},
>  (g=Function[f/.x->#];
>     h=(g[SetPrecision[#,17]]&);
>     Plot[h[x],{x,xmin,xmax},opts]
>   )
> ]
>(***********)
>
>As far as I can tell there was no way to get PrecisionPlot working without
>using a pure function as I do with   g=Function[f/.x->#]

Ted,

(1)------------------

We can use patterns on the right of definitions - but we do need to be
careful, and as you indicate, scoping can loom large.
For example

Clear["`*"]

func[x_] := (g[y_] := x + y)
func[a]
g[b]

    a + b


func2[y_] := (h[y_] := x + y)

RuleDelayed::"rhs": "Pattern \!\(y_\) appears on the right-hand side of rule
\
\!\(\(func2[y_]\) :> \(\(h[y_]\) := \(x + y\)\)\)."

Despite the warnings we get:

func2[a]

h[b]

    b + x

Some problems are shown by

func2[3]

Pattern::"patvar": "First element in pattern \!\(Pattern[\(3, _\)]\) is not
a \
valid pattern name."

and

func3[x_] := Block[{x, y}, x + y]

func3[y]

Block::"dup": "Duplicate local variable \!\(y\) found in local variable \
specification \!\({y, y}\)."

Block[{y, y}, y + y]

(2) -------------------------

Here is a ways of avoiding using a pure function in your PrecisePlot code

PrecisePlot2[f_, {x_, xmin_, xmax_}, opts___] :=
Module[{g}, g[x_] := f;
          Plot[ g[SetPrecision[x, 17]], {x, xmin, xmax},
         Compiled -> False, opts
      ]]

I'll  test this with

f1 = Sin[x]*10^x*Log[1 + 10^(-x)];

Plot does not do well with it

Plot[f1, {x, 15, 20}]

but try


PrecisePlot2[f1, {x, 15, 20}];

Two more versions - the first one  using a pure function-

PrecisePlot3[f_, {x_, xmin_, xmax_}, opts___] :=
 Plot[
      Function[x, f][SetPrecision[x, 17]],
     {x, xmin, xmax},
    Compiled -> False, opts]

PrecisePlot3[f1, {x, 15, 20}];

and

PrecisePlot4[f_, {x_, xmin_, xmax_}, opts___] :=
 Plot[
     Unevaluated[f] /. HoldPattern[x] :> SetPrecision[x, 17],
     {x, xmin, xmax},
    Compiled -> False, opts
    ]

PrecisePlot4[f1, {x, 15, 20}];

(3)------------------

Similar problems with precision have recently been discussed in
Mathematic in Education and Research:
Volume 7 No 2, Spring 1998, p 50
Volume 7 No 4, Fall 1998, p 64


Allan

---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565











  • Prev by Date: Re: Abs Symbol
  • Next by Date: symbolic integration - algorithms used
  • Previous by thread: RE: RE: "f[x_]:= 2 x" vs. "f = 2 #&"
  • Next by thread: Re: "f[x_]:= 2 x" vs. "f = 2 #&"