如何通过附加在Mathematica中重新定义函数?

时间:2011-10-04 01:34:41

标签: wolfram-mathematica

在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.函数有类似的东西吗?...

编辑添加 - 是的,我这样做是为了半手动找到最适合数据的函数。我知道有这样的功能,但我想知道我是否可以自己到达那里。我做到了,但方式并不优雅,所以提出了这个问题。

5 个答案:

答案 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]]

enter image description here

但是,你不应该这样做。详细了解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]}
*)