在Mathematica中进行计算时,我经常需要通过追加来重新定义函数。例如,如果我定义
f[n_] := n^2 + n + 1
然后过了一段时间我想从现在开始添加2n ^ 3
f[n] = 2n^3 + n^2 + n + 1.
然后我想添加Sin [n]并进一步
f[n] = 2n^3 + n^2 + n + 1 + Sin[n].
等等。
变量很容易,例如x + = 2.函数有类似的东西吗?...
编辑添加 - 是的,我这样做是为了半手动找到最适合数据的函数。我知道有这样的功能,但我想知道我是否可以自己到达那里。我做到了,但方式并不优雅,所以提出了这个问题。
答案 0 :(得分:3)
在你的问题下,有许多微妙之处。我的意思是怪物的微妙之处。
我不会进入蜿蜒曲折,但你可以这样做:
f[n] = n^2;
f[n] = f[n] + 2
(* but for evaluation *)
f[n] /. n -> 2
所以,例如,为了绘制这个:
Plot[f[n] /. n -> x, {x, 0, 1}, AxesOrigin -> {0, 0},
PlotLabel -> Framed@f[n]]
但是,你不应该这样做。详细了解delayed definition!
答案 1 :(得分:3)
您可以定义基本功能列表,然后只需选择所需数量的元素:
fList = {n^2, n, 1, 2 n^3, Sin[n]};
f[n_] = Total[Take[fList, 3]]
f[n_] = Total[Take[fList, 4]]
f[n_] = Total[Take[fList, 5]]
(*
=> 1 + n + n^2
=> 1 + n + n^2 + 2 n^3
=> 1 + n + n^2 + 2 n^3 + Sin[n]
*)
答案 2 :(得分:3)
一个迟到的解决方案:下面的代码使用辅助功能,并为所有后续使用添加一个术语,你只需要调用一次函数,第二个参数是表示您要添加的术语:
ClearAll[f];
Module[{g},
g[n_] := n^2 + n + 1;
f[n_, add_: Automatic] /; add === Automatic := g[n];
f[n_, add_: Automatic] := Block[{m}, g[m] = g[m] + add[m]; g[n]];
]
使用示例:
In[43]:= f[m]
Out[43]= 1 + m + m^2
In[44]:= f[m, 2 #^3 &]
Out[44]= 1 + m + m^2 + 2 m^3
In[45]:= f[m]
Out[45]= 1 + m + m^2 + 2 m^3
In[46]:= f[m, Sin]
Out[46]= 1 + m + m^2 + 2 m^3 + Sin[m]
In[47]:= f[m]
Out[47]= 1 + m + m^2 + 2 m^3 + Sin[m]
使用这种方法时,您应该小心,但是当您想要将该术语添加到该函数时,只调用两个参数形式 - 或者每次调用时都会添加它。
答案 3 :(得分:1)
这实际上取决于您需要重新定义函数f
的原因。如果原因是您意识到之前的定义是错误的,那么只需返回相关单元格,编辑它并重新评估它以重新定义f
。
f[n_] := n^2 + n + 1
变为
f[n_] := 2n^3 + n^2 + n + 1
请注意:=
语法和下划线。
相反,如果您希望f
采用n<=100
的第一个定义,而n>100
采用第二个定义,则使用Condition语法{{1 },如下所示。
/;
答案 4 :(得分:1)
这有效,但需要单独的功能。推广附加功能并不容易。
Clear[f]
AppendToFunction := (
a = DownValues[f];
b = Append[a[[1, 2]], 2 n^3];
f[n_] = Evaluate[b]);
AppendSinToFunction := (
a = DownValues[f];
b = Append[a[[1, 2]], Sin[n]];
f[n_] = Evaluate[b]);
f[n_] := n^2 + n + 1;
f[3] == 9 + 4
DownValues[f]
(*
->True
->{HoldPattern[f[n_]]:>n^2+n+1}
*)
AppendToFunction
f[3] == 9 + 4 + 54
DownValues[f]
(*
->1+n+n^2+2 n^3
->True
->{HoldPattern[f[n_]]:>1+n+n^2+2 n^3}
*)
AppendSinToFunction
f[3] == 9 + 4 + 54 + Sin[3]
DownValues[f]
(*
->1+n+n^2+2 n^3+Sin[n]
->True
->{HoldPattern[f[n_]]:>1+n+n^2+2 n^3+Sin[n]}
*)