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”表达式使用简化规则的另一种方法。这里未解决的部分是检测不连续性并为这些位置生成增量函数。如果你想忽略这些,你可以定义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))
于 2014-08-10T22:09:43.160 回答
0

基于slitinov的回答,我为具有两个以上“片段”的函数编写了这个非常简单的实现:

gradef(charfun(dummy),0)$

/* piecewise function definition */
itv: [[x<0],[x>=0,x<1], [x>=1]]; /* intervals */
fi:  [ 1,    x^2+1,      2*x  ]; /* local functions */

/* creation of global function f and its derivative df */
f:0;
for i: 1 thru 3 do f:f+charfun(apply("and",itv[i]))*fi[i];
df:diff(f,x);

/* display of local functions and derivatives */
for i: 1 thru 3 do (
  apply(assume,itv[i]),
  newline(),
  print(itv[i]),
  print("f = ",ev(f)),
  print("df = ",ev(df)),
  apply(forget,itv[i])
  );

plot2d([f,df],[x,-2,3],[y,-1,5],[style,[lines,4,3],[lines,2,2]]);
于 2016-02-12T02:43:53.400 回答