【问题标题】:Maxima - function definition (define statement)Maxima - 函数定义(定义语句)
【发布时间】:2016-03-02 23:51:59
【问题描述】:

从以下取自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

【问题讨论】:

    标签: function maxima


    【解决方案1】:

    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).

    【讨论】:

    • 它有效,谢谢!更改参数的格式(如我的问题编辑)pfc 变得更加简单:pfc (x) := buildq ([body:sum( x[i][1]*charfun(x[i][2]), i, 1, length(x))], lambda ([x], body));。您可能希望将此更简单的版本添加到您的答案中,以使其更具可见性。
    【解决方案2】:

    几件事。 (1) 你想要charfun(apply("and", itvs[i])) 而不是charfun("and" itvs[i])。 (2) 你想要pfc(x) 而不是pfc(itvs,pfun)。另外 (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));
    

    【讨论】:

    • 这行得通,但不是我想要的。事实上,我希望这样的函数成为一个构造函数,因为返回的分段(数学)函数应该由我传递给pfc 函数的参数“定义”。每次我传递不同的参数时,都应该返回一个不同的分段(数学)函数。
    • @mmj 好的。我会单独给出一个答案来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 2018-09-21
    • 2011-01-26
    相关资源
    最近更新 更多