Maxima - 函数定义(定义语句)

Maxima - function definition (define statement)

从以下摘自 here

的 Maxima 代码开始
/* 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 个参数,比如 itvspfun 和 return 一个像 f 这样的分段函数,但我没有由于符号评估导致的错误,因此能够做到这一点。例如在下面的尝试中我得到错误 "incorrect syntax: itvs is not an infix operator":

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]
]; 

使用此参数编写函数构造函数可能更简单。

跟进

如果您实际上并不需要分段 function,因为分段 expression 就足够了(因为——我后来发现——在我的例子中),编写分段表达式构造函数(使用输入参数的替代格式)变得简单:

/* 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

两件事。 (1) 你想要 charfun(apply("and", itvs[i])) 而不是 charfun("and" itvs[i])。 (2) 而不是 pfc(itvs,pfun) 你想要 pfc(x)。另外 (3) 可能您想使 f 成为局部变量。

我认为这可能有效:

define(pfc(x), block([f:0],
    for i: 1 thru length(itvs)
        do f:f+charfun(apply("and", itvs[i]))*pfun[i],
    f));

OP 表示他们希望pfc 构造一个分段函数。这是一个尝试:

pfc (itvs, pfun) := block ([body],
    body : sum (charfun (apply ("and", itvs[i]))*pfun[i], i, 1, length(itvs)),
    buildq ([body], lambda ([x], body)));

现在pfc接受区间和表达式,并构造一个只有一个参数的未命名函数。假定参数名为 x;我想如果有人想让它更复杂一点,可以指定一个不同的变量作为 pfc 的参数,并使其成为 buildq 的另一个变量,例如buildq([body, var], lambda([var], body).