从以下千里马代码起价here千里马 - 函数的定义(定义语句)
/* piecewise function definition */
itvs: [[x<0],[x>=0,x<1], [x>=1]]; /* intervals */
pfun: [ a, x^2+b, c*x ]; /* local functions */
/* piecewise function constructor */
f:0$
for i: 1 thru 3 do f:f+charfun(apply("and",itvs[i]))*pfun[i]$
f;
/* differentiation of piecewise function */
gradef(charfun(dummy),0)$
diff(f,x);
采取我想提出一个功能能够利用2个参数,像itvs
和pfun
,并返回像分段函数f
,但由于符号评估错误,我无法做到这一点。例如在下面的尝试,我得到错误“不正确的语法:独立电视是不是中缀操作符”:
define(pfc(itvs,pfun),(
f:0,
for i: 1 thru length(itvs) do f:f+charfun("and" itvs[i])*pfun[i],
f
));
我如何定义这样的功能? 我发现的文档非常简洁,无法帮助我,是否有一些关于此主题的较少知道的文档?
编辑
输入参数的另一种格式,也许更简单,更灵活,可以是:
/* piecewise function definition */
pfd: [
[a, x<0],
[x^2+b, x>=0 and x<1],
[c*x, x>=1]
];
写一个函数的构造与这种说法可能比较简单。
跟进
如果你实际上并不需要分段功能因为分段表达就够了(因为 - 我后来发现 - 在我的情况),写一个分段式构造函数(使用输入参数的替代格式)变得简单:
/* pec=piecewise expression constructor */
/* argument is an array of [expression,interval] couples */
pec(x) := sum(x[i][1]*charfun(x[i][2]), i,1,length(x));
f: pec([[(1+x)/2, x>=-1 and x<1],[3, x<-1 or x>=1]])
(f) 3*charfun(x<-1 or x>=1)+((x+1)*charfun(x>=-1 and x<1))/2
它的工作原理,谢谢!改变参数的格式(如我的问题编辑)'pfc'变得更简单:'pfc(x):= buildq([body] sum(x [i] [1] * charfun(x [i] [2] ),i,1,length(x))],lambda([x],body));'。您可能希望将这个更简单的版本添加到您的答案中,以提高其可见度。 – mmj