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

Wolfram mathematica 如何在Mathematica中通过附加函数来重新定义函数?,wolfram-mathematica,Wolfram Mathematica,在使用Mathematica进行计算时,我经常需要通过附加函数来重新定义函数。例如,如果我定义 f[n_] := n^2 + n + 1 过了一段时间,我想加上2n^3,从现在开始 f[n] = 2n^3 + n^2 + n + 1. 然后我想加上罪[n]并进一步说明 f[n] = 2n^3 + n^2 + n + 1 + Sin[n]. 等等 使用变量很容易,例如x+=2。函数有类似的东西吗 编辑添加–是的,我这样做是为了半手动地找到一个最适合数据的函数。我知道有一些功能可以做到这一

在使用Mathematica进行计算时,我经常需要通过附加函数来重新定义函数。例如,如果我定义

f[n_] := n^2 + n + 1
过了一段时间,我想加上2n^3,从现在开始

f[n] = 2n^3 + n^2 + n + 1. 
然后我想加上罪[n]并进一步说明

f[n] = 2n^3 + n^2 + n + 1 + Sin[n]. 
等等

使用变量很容易,例如x+=2。函数有类似的东西吗


编辑添加–是的,我这样做是为了半手动地找到一个最适合数据的函数。我知道有一些功能可以做到这一点,但我想看看我是否能自己做到。我这样做了,但方式并不优雅,因此提出了这个问题。

在你的问题下有许多微妙之处。我是说,怪物的微妙之处

我不会进入蜿蜒的河流,但你可以这样做:

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


但是,您不应该这样做。阅读更多关于

的信息,这实际上取决于为什么需要重新定义函数
f
。如果原因是您意识到前面的定义是错误的,那么无论如何,只需返回有问题的单元格,对其进行编辑并重新计算,以重新定义
f

f[n_] := n^2 + n + 1
变成

f[n_] := 2n^3 + n^2 + n + 1 
注意
:=
语法和下划线

相反,如果您希望
f
获取第一个定义,例如
n100
,则可以使用语法
/,如下所示

f[n_] := n^2 + n + 1 /; n<=100
f[n_] := 2n^3 + n^2 + n + 1 /; n>100
f[n_]:=n^2+n+1/;n100

您可以定义一个基函数列表,然后只选择所需数量的元素:

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]
*)

这是可行的,但需要单独的功能。推广append函数并不是那么容易

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]}
*)

迟到解决方案:下面的代码使用一个辅助函数,要为所有后续使用添加一个术语,只需调用一次函数,第二个参数是表示要添加术语的纯函数:

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]

在这种方法中,当您想向函数中添加术语时,您应该注意只调用两个参数表单一次,否则每次调用时都会添加。

了解导致您添加术语的标准是什么确实有帮助的。是不是不同的定义适用于不同的
n
?@Verbeia看起来OP只是试图选择一个基函数组合,该组合适合在实验误差范围内拟合一些实验数据。也许这是一个家庭作业。@AlexeyPopkov-没错,但为什么要把多项式基函数和三角基函数混在一起呢?我是一个简单的经济学家,但在我看来这很奇怪。@Verbeia如果已知实验数据包含(或可能包含)周期性和非周期性成分,使用多项式和三角函数的组合进行拟合是非常合乎逻辑的。@Alexey,以防你仍然手工进行:)我认为这最适合我的需要,因为如果需要,我可以附加到列表中。谢谢+1、你想出了一个简单聪明的解决办法,我并不感到惊讶。@rcollyer花了我一段时间。事实上,这更像是一个设计问题。谢谢你的投票。