Maxima - 区分分段函数

时间:2014-07-22 15:48:22

标签: maxima piecewise differentiation

假设您有一个由间隔定义的函数,例如

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)

有没有办法获得这样的结果?

3 个答案:

答案 0 :(得分: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)

charfungradef

你也可以尝试来自Richard Hennessy的Pw.mac包裹。

答案 1 :(得分:2)

这是一种使用简化规则的不同方法,用于&#34;如果&#34;表达式。这里未解决的部分是检测不连续性并为这些位置生成增量函数。如果你想忽略这些,你可以定义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))

答案 2 :(得分: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]]);