 
 
 
 
 
 
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

