从以下来自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);
我想创建一个能够接受itvs
和pfun
等2个参数的函数并返回像f
这样的分段函数,但我无法做到这一点,因为由符号评估引起的错误。例如,在下面尝试我得到错误“语法不正确:itvs不是中缀运算符”:
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
答案 0 :(得分:2)
一些事情。 (1)而不是charfun("and" itvs[i])
你想要charfun(apply("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));
答案 1 :(得分:2)
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)
。