axiom-math
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Axiom-math] if-expression and variables


From: William Sit
Subject: Re: [Axiom-math] if-expression and variables
Date: Thu, 05 May 2011 00:23:15 -0400

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/



reply via email to

[Prev in Thread] Current Thread [Next in Thread]