2016-03-01 35 views
0

从以下千里马代码起价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个参数,像itvspfun,并返回像分段函数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 

回答

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)

+0

它的工作原理,谢谢!改变参数的格式(如我的问题编辑)'pfc'变得更简单:'pfc(x):= buildq([body] sum(x [i] [1] * charfun(x [i] [2] ),i,1,length(x))],lambda([x],body));'。您可能希望将这个更简单的版本添加到您的答案中,以提高其可见度。 – mmj

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)); 
+0

这有效,但不是我想要的。事实上,我希望这样的函数是一个构造函数,因为返回的分段(数学)函数应该由我传递给“pfc”函数的参数“定义”。每次我传递不同的参数时,都应返回不同的分段(数学)函数。 – mmj

+0

@mmj好的。我会提出一个单独的答案来解决这个问题。 –