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 <address@hidden> 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
> address@hidden
> 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/