次のような間隔で定義された関数があるとします。
f(x):=block(if x<0 then x^2 else x^3);
で微分すると
diff(f(x),x);
我々が得る
d/dx (if x<0 then x^2 else x^3)
一方、私は取得したい
(if x<0 then 2*x else 3*x^2)
そのような結果を得る方法はありますか?
次のような間隔で定義された関数があるとします。
f(x):=block(if x<0 then x^2 else x^3);
で微分すると
diff(f(x),x);
我々が得る
d/dx (if x<0 then x^2 else x^3)
一方、私は取得したい
(if x<0 then 2*x else 3*x^2)
そのような結果を得る方法はありますか?
これは、単純なケースで役立つ場合があります。
(%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)
Richard Hennessy のPw.macパッケージも試すことができます。
「if」式の単純化規則を使用した別のアプローチを次に示します。ここで未解決の部分は、不連続点を検出し、それらの場所のデルタ関数を生成することです。それらを無視したい場合は、FOO
0 を返すように定義できます。関数を実装しようとしていないことに注意してくださいdiscontinuities
。その部分はここでは未解決です。興味があればやってみます。
(%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))