最大值 - 函数定义(定义语句)

时间:2016-03-01 21:56:36

标签: function maxima

从以下来自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);

我想创建一个能够接受itvspfun等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

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)