2016-03-01 25 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好的。我會提出一個單獨的答案來解決這個問題。 –