Mathematica 9 is now available
Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2007

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

Search the Archive

Re: Piecewise inside a Module or Block, I don't understand this behavior.

  • To: mathgroup at smc.vnet.net
  • Subject: [mg83308] Re: Piecewise inside a Module or Block, I don't understand this behavior.
  • From: "Jean-Marc Gulliet" <jeanmarc.gulliet at gmail.com>
  • Date: Sat, 17 Nov 2007 05:21:33 -0500 (EST)
  • References: <fhjs9v$4vg$1@smc.vnet.net> <473DA496.5050509@gmail.com>

On Nov 16, 2007 4:10 PM, W. Craig Carter <ccarter at mit.edu> wrote:
>
> >>  a[c_, d_] :=
> >>    Module[{e, f}, e = d^2; f = c^2;
> >>     Return[Piecewise[{e, 0 < x < 1/2}, {f, 1/2 < x <= 1}]]];
> >>  a[1,2] (*doen't return what I had anticipated*)
> >
> > All this is just about a syntax error you made.
> >
> > First, note that, as posted, none of the above examples works: they both
>
> Cher Jean-Marc,
> I don't get an error when I cut and paste this expression.
> Math6.01
>
> And, the posted work-around works just fine:
> aAlt[c_, d_] :=
> Module[{e, f}, e = d^2; f = c^2;
> {{e, 0 < x < 1/2}, {f, 1/2 < x <= 1}}];
> Piecewise@aAlt[1,2]
>
> Note, that this seems to be peculiar to Piecewise: e.g,

No.

> a[c_, d_] :=
>      Module[{e, f}, e = d^2; f = c^2;
>       Return[MyUnAssignedFunction[{e, 0 < x < 1/2}, {f, 1/2 < x <= 1}]]];
> `  a[1,2]
>
> works as I hoped.

Yes, because MyUnAssignedFunction being not defined, it does not
expect or check for any particular argument structure.

> PS: My goal here was to write a function that made a calculation of the
> bounds, and then returned a piecewise function of x that had the bounds
> as explicitly calculated.

I have clearly understood what you tried to achieve. I gave you the
reason why the syntax you used erroneous and I also gave you the fixed
code (i.e. using the correct syntax for Piecewise, no trick or
work-around involve here) that returns a piecewise function with its
bounds evaluated.

So, the following expression returns a piecewise function with its
bounds correctly evaluated, doesn't it?

In[1]:= a[c_, d_] := Module[{e, f}, e = d^2; f = c^2;
   Piecewise[{{e, 0 < x < 1/2}, {f, 1/2 < x <= 1}}]];
a[1, 2]

Out[2]= Piecewise[{{4, 0 < x < 1/2}, {1, Inequality[1/2, Less, x, LessEqual,
         1]}}]

The above result is identical to what is returned by the function aAlt
(with "work-around").

Indeed, aAlt[1, 2] returns the list of pairs {{4, 0 < x < 1/2}, {1,
1/2 < x <= 1}} which is exactly the format required by Piecewise. Your
original code passed the sequence {4, 0 < x < 1/2}, {1, 1/2 < x <= 1}
(two separate lists, and not one list of lists) to Piecewise.

In other words, {{4, 0 < x < 1/2}, {1, 1/2 < x <= 1}} is not the same
as {4, 0 < x < 1/2}, {1, 1/2 < x <= 1}, and

In[10]:= Piecewise[{{4, 0 < x < 1/2}, {1, 1/2 < x <= 1}}]

Out[10]= \[Piecewise] {
  {4, 0 < x < 1/2},
  {1, 1/2 < x <= 1}
 }

is syntactically correct, whereas

In[11]:= Piecewise[{4, 0 < x < 1/2}, {1, 1/2 < x <= 1}]

During evaluation of In[11]:= Piecewise::pairs: The first argument \
{4,0<x<1/2} of Piecewise is not a list of pairs. >>

Out[11]= Piecewise[{4, 0 < x < 1/2}, {1, 1/2 < x <= 1}]

is not.

You can get the code I used as well as a pdf file at

http://homepages.nyu.edu/~jmg336/mathematica/piecewisemodule.nb

http://homepages.nyu.edu/~jmg336/mathematica/piecewisemodule.pdf

I hope this clarifies the issue.

Best regards,
-- 
Jean-Marc


  • Prev by Date: Re: memory release problem in mathematica6.0
  • Next by Date: Re: Re: Message: "Numerical interation converging too slowly"
  • Previous by thread: Re: Piecewise inside a Module or Block, I don't understand this behavior.
  • Next by thread: Re: Piecewise inside a Module or Block, I don't understand this behavior.