Mathematica中如何定義f[x+y]=f[x]+f[y]?
我直接輸入f[x+y]:=f[x]+f[y],然後輸入f[3+1]輸出的是f[4]
我用的是10.4版本
f[Verbatim[Plus][a__]] := Plus @@ f /@ {a}
SetAttributes[f, HoldAll]
題主看來是 mathematica 新手啊…這貌似是 mathematica 里非常基礎的一個問題(當然我剛玩的時候也老犯這類錯誤)。題主定義的函數 f 的問題在於:f 作用的內容只有是『x+y』的時候才有定義,注意是準確的『x+y』這個表達式而不是『任意的 x 和 y』。因此,你換一個對象它就不認識了:
In[1]:= f[x + y] := f[x] + f[y];
In[2]:= f[a + b]
Out[2]= f[a + b]
解決方案是:用一個簡單的模式:
In[1]:= f[x_ + y_] := f[x] + f[y];
SetAttributes[f, HoldAll]
In[2]:= f[a + b]
Out[2]= f[a] + f[b]
In[3]:= f[1 + 3]
Out[3]= f[1] + f[3]
下劃線 _(Blank) 的意思是『任意表達式』,它可以匹配單個的表達式,這樣就解決了。
樓上 @happy fish 的答案比較高端,直接給出了任意表達式序列的 f。
其他模式還有__、___ 等等,題主可以看看官方教程:[模式](Patterns | Wolfram Language Fast Introduction for Programmers)、[函數定義](Function Definitions)注意要『 SetAttributes[f, HoldAll] 』,不然 f[1+3]會先計算1+3=4.我也剛玩 mathematica 沒多久,歡迎指正。希望對題主有幫助。Attributes@f = HoldAll;
f[a_Plus] := f /@ Unevaluated@a
……寫完了才想起來上面這種複雜的寫法其實毫無必要。最簡單的就足夠了:
ClearAll[f];
Attributes@f = HoldAll;
f[x_ + y_] := f[x] + f[y]
f[a + b + c]
(* f[a] + f[b] + f[c] *)
因為Plus擁有屬性Flat和OneIdentity。
推薦閱讀:
※如何在Unity中實現MVC模式?
※同名的全局變數在循環體中怎麼引用?
※請問你們能熟練使用的編程語言有那些?
※學編程的時候都會先學進位轉換,請問在實際編程過程中,這些東西有用么?
※為什麼google編程風格指南設置縮進為2個空格?
TAG:數學 | 編程 | WolframMathematica |