Re: if-expression and variables

"William Sit" <[email protected]> Thu, 05 May 2011 00:23:15 -0400
Newsgroups gmane.comp.mathematics.axiom.general
Message-ID <[email protected]>
Dear Stefan:

You posed a legitimate problem: how should symbolic 
computation handle piecewise defined functions, and in 
particular, how to integrate such a function.

Maple and Mathematica both can handle piecewise functions. 
Look up "piecewise" from Maple Help. You can easily define 
a piecewise function, and differentiate or integrate it. 
Indeed, Maple says:

The piecewise function can be differentiated, integrated, 
simplified, plotted, and used in the following types of 
differential equations: constant coefficients and 
discontinuous perturbation function, general first-order 
linear, Riccati, and some other classes which are handled 
by integration or variation of parameter. See 
dsolve[piecewise] for more details. series, limit, abs, 
and signum can handle the piecewise function.

As example, the desired solution the problem of 
integrating f(x) from 0 to t, where f(x) is 2x if x < 10 
and 5x^2 otherwise, should be the function g(t), defined 
as t^2 if t < 10 and -4000/3 +(5 t^3)/3 otherwise. Maple 
does exactly that. In fact, I even tried to integrate 
f(f(x)) and f(f(x+1)) and Maple does it with no problems 
with all the cases covered.

Mathematica has a similar function called Piecewise to 
construct piecewise functions, and like Maple, Piecewise 
can be used in such functions as Integrate, Minimize, 
Reduce, DSolve and Simplify, as well as their numeric 
analogs.

This may be an uncovered domain in Axiom. A search for 
"piecewise" shows no hits. I think piecewise functions 
have to be separately handled, particularly in case 
analysis (possibly involving semi-algebraic sets and CAD) 
if there is any indefiniteness in the answer (like an 
indefinite integral). There is some evidence that if the 
user does not use the built-in "piecewise" or "Piecewise" 
function, but uses an if-then-else construction, neither 
Maple nor Mathematica can handle subsequent mathematical 
calculations. For example, the system would not do the 
case analysis, much less the "simplification" 
automatically, but would present the result as the 
integral of If[x < 10, 2 x, 5 x^2] (in Mathematica; I did 
not try Maple). Even when the case analysis is done, it 
would still not simplify or evaluate the integrals:

h[x_] := If[x < 10, Integrate[2 y, {y, 0, x}],
   Integrate[2 y, {y, 0, 10}] + Integrate[5 y^2, {y, 10, 
x}]]

when h[x] is called. It will evaluate on numerical inputs.

In our earlier discussions, we were "lured" into using 
"if-the-else" constructions and thus got the feeling that 
this is difficult to handle. The confusion is that we 
interpret "x < 10" as an binary relation, whereas it 
should be handled as a semi-algebraic set (in one 
dimension, this is just an interval)!

However, the algorithms seem to be there, and someone 
should implement them in Axiom if it is not already done 
but hidden in some obscure packages.

William

On Wed, 04 May 2011 22:37:48 +0200
  Stefan Karrmann <[email protected]> wrote:
> Dear all,
> 
> thanks for your answers. They clears a lot.
> 
> I actually want to integrate test1 and solve an 
>differential equation
> with it.
> 
> E.g.
> test2 x == rho * test1 x
> y = operator 'y
> odeq := D(y x) = test2 x
> solve(odeq, y, x)
> 
> Obviously, the solution is "formally"
> 
> y_sol x == integrate(test2 x,x)
> 
> Kind regards,
> Stefan
> 
> Am Dienstag, den 03.05.2011, 11:21 +0200 schrieb Ralf 
>Hemmecke:
>> Dear Stefan,
>> 
>> as others already have pointed out, for Axiom, your 
>>question is not 
>> really well posed.
>> 
>> In Axiom
>> 
>>    if x<10 then 2*x else 5*x^2
>> 
>> is *not* an expression (as you might know it from other 
>>untyped CAS like 
>> Mathematica or Maple), but rather a programming language 
>>construct. In 
>> other words, if Axiom sees this, it is evaluated. So the 
>>result is 
>> either 2*x or 5*x^2 depending on the (boolean) outcome 
>>of the evaluation 
>> of x<10.
>> 
>> I think, Bill suggested to use something like InputForm. 
>>There it would 
>> be possible to represent an if-expression unevaluated.
>> 
>> But you should rather say what you actually want (it's 
>>not the same what 
>> you expect).
>> 
>> In order for us to suggest you a proper way to handle 
>>your use case, you 
>> should tell us why you want a piecewise function and 
>>(more important) 
>> what you later want to do with that function.
>> 
>> Until we have that information, everything would be just 
>>digging in the 
>> dark.
>> 
>> Ralf
>> 
>> On 04/30/2011 08:40 PM, Stefan Karrmann wrote:
>> > Dear all,
>> >
>> > I'm new to axiom and have a problem with piecewise 
>>functions.
>> >
>> > test1 (x | x<  10) == 2*x
>> > test1 (x | x >= 10) == 5*x^2
>> > [was typo: test1 (x | x<  10) == 5*x^2]
>> > test1
>> > ->
>> >     test1 (x | x<  10) == 2x
>> >     test1 (x | ^ x<  10) == 5x
>> > 
>>                                                    Type: 
>>FunctionCalled
>> > test1 y
>> > ->
>> >       2
>> >     5y
>> >
>> > I expected something like (if y<  10 then 2*y else 
>>5*y**2).
>> >
>> > How is it possible to pass a Variable to a piecewise 
>>function respecting
>> > the pieces?
>> >
>> > PS: Using a block and =>  or explicit if-then-else 
>>does not help.
> 
> 
> _______________________________________________
> Axiom-math mailing list
> [email protected]
> https://lists.nongnu.org/mailman/listinfo/axiom-math

William Sit, Professor Emeritus
Mathematics, City College of New York
Office: R6/291D Tel: 212-650-5179
Home Page: http://scisun.sci.ccny.cuny.edu/~wyscc/