Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Maxima - differentiating a piecewise function

Suppose you have a function defined by intervals, such as

f(x):=block(if x<0 then x^2 else x^3);

When we differentiate it with

diff(f(x),x);

we get

d/dx (if x<0 then x^2 else x^3)

whereas I'd like to get

(if x<0 then 2*x else 3*x^2)

Is there a way to obtain such result?

like image 618
mmj Avatar asked Oct 19 '25 08:10

mmj


2 Answers

This may help in a simple case:

(%i1) f(x):= charfun(x<0)*x^2 + charfun(x>=0)*x^3$

(%i2) gradef(charfun(y), 0)$

(%i3) diff(f(x),x);
                                           2
(%o3)              2 x charfun(x < 0) + 3 x  charfun(x >= 0)

charfun, gradef

You can try also Pw.mac package from Richard Hennessy.

like image 68
slitvinov Avatar answered Oct 21 '25 14:10

slitvinov


Here's a different approach using a simplification rule for "if" expressions. The unsolved part here is to detect discontinuities and generate delta functions for those locations. If you want to ignore those, you can define FOO to return 0. Note that I didn't attempt to implement the function discontinuities; that part is unsolved here. I can give it a try if there is interest.

(%i1) display2d : false $
(%i2) matchdeclare ([aa, bb, cc], all, xx, symbolp) $
(%i3) 'diff (if aa then bb else cc, xx) $
(%i4) tellsimpafter (''%, apply ("if", [aa, diff (bb, xx), true, diff (cc, xx)]) + FOO (aa, bb, cc, xx)) $
(%i5) FOO (a, b, c, x) := 'lsum ((ev (c, x = d) - ev (b, x = d)) * delta (d, x), d, discontinuities (a, x)) $
(%i6) diff (if x > 0 then x^2 else x^3, x);
(%o6) (if x > 0 then 2*x else 3*x^2)+'lsum((d^3-d^2)*delta(d,x),d,
                                           discontinuities(x > 0,x))
like image 27
Robert Dodier Avatar answered Oct 21 '25 14:10

Robert Dodier



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!