從以下千里馬代碼起價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個參數,像itvs
和pfun
,並返回像分段函數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
它的工作原理,謝謝!改變參數的格式(如我的問題編輯)'pfc'變得更簡單:'pfc(x):= buildq([body] sum(x [i] [1] * charfun(x [i] [2] ),i,1,length(x))],lambda([x],body));'。您可能希望將這個更簡單的版本添加到您的答案中,以提高其可見度。 – mmj