Wolfram mathematica 如何在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。函数有类似的东西吗 编辑添加–是的,我这样做是为了半手动地找到一个最适合数据的函数。我知道有一些功能可以做到这一
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花了我一段时间。事实上,这更像是一个设计问题。谢谢你的投票。