3

次のような間隔で定義された関数があるとします。

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)

そのような結果を得る方法はありますか?

4

3 に答える 3

3

これは、単純なケースで役立つ場合があります。

(%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パッケージも試すことができます。

于 2014-07-23T16:18:53.920 に答える
2

「if」式の単純化規則を使用した別のアプローチを次に示します。ここで未解決の部分は、不連続点を検出し、それらの場所のデルタ関数を生成することです。それらを無視したい場合は、FOO0 を返すように定義できます。関数を実装しようとしていないことに注意してください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))
于 2014-08-10T22:09:43.160 に答える