Mathematica:定义替换的功能控制顺序

时间:2017-11-17 11:10:43

标签: wolfram-mathematica

我想定义一个函数s [t,n],它返回给定函数f(t)的n个项的FourierTrigSeries的t点处的值。例如,对于f(t)= t ^ 2:

s[t_, n_] = FourierTrigSeries[t^2, t, n];  (* 2nd input = indep. variable *)
s[t, 3]
    Out =   Pi^2 / 3 + 4 (-Cos[t] + 1/4 Cos[2 t] - 1/9 Cos[3 t])

很好(t的函数)。在t = 0评估它:

s[t, 3] /. t -> 0
    Out =   -31 / 9 + Pi^2 / 3

这是我希望看到的s [0,3]的输出,意思是"在t = 0时评估3个术语的傅立叶特里格系列"。

然而,s [0,3]使得t = 0"太早",所以原始函数f(t)= t ^ 2变为相同的0;即使是自变量t(FourierTrigSeries的第二个输入)也变为0,这没有任何意义。结果是Mathematica无法读懂我的想法并返回如下:

s[0, 3]
    Out =     FourierTrigSeries[0,0,3]

总结:我想定义函数s [t,n],使得n首先替换它的值,并且只有在此之后,t才被其值用于评估。

我尝试过s [n,t]而不是s [t,n];也试过:=(延迟评价)而不是以不同的方式,并结合像

这样的东西
ss[tdelay_, n_] = s[t, n] /. t -> tdelay

但似乎没有任何效果。我怎样才能得到我想要的行为?

提前谢谢!

2 个答案:

答案 0 :(得分:1)

使用SetDelayed和临时(本地)变量。

s[t_, n_] := Module[{t0}, FourierTrigSeries[t0^2, t0, n] /. t0 -> t]

s[0, 3]
-(31/9) + Pi^2/3

答案 1 :(得分:0)

在看到克里斯的回答之后,我试图了解为什么需要Module,我找到了另一种方式,出于某种原因,在我第一次尝试时逃过了我:

f[t_] = t^2;    (* or write t0^2 in line below *)
s[t_, n_] := FourierTrigSeries[f[t0], t0, n] /. t0 -> t
s[0, 3]
    Out =   -(31/9) + Pi^2 / 3

显然可以在没有Module的情况下完成......

无论如何,谢谢!