假设您有一个由间隔定义的函数,例如
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)
有没有办法获得这样的结果?
答案 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)
你也可以尝试来自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]]);