Mathematica 8中的一个问题,带有函数声明

Nam*_*yen 6 wolfram-mathematica mathematica-8

这是一个奇怪的结果,在这个例子中定义为"functionB"的函数.有人可以解释一下吗?我想绘制functionB[x]functionB[Sqrt[x]],它们必须是不同的,但是这个代码表示functionB[x] = functionB[Sqrt[x]],这是不可能的.

model = 4/Sqrt[3] - a1/(x + b1) - a2/(x + b2)^2 - a3/(x + b3)^4;
fit = {a1 -> 0.27, a2 -> 0.335, a3 -> -0.347, b1 -> 4.29, b2 -> 0.435,
    b3 -> 0.712};
functionB[x_] := model /. fit

Show[
 ParametricPlot[{x, functionB[x]}, {x, 0, 1}],
 ParametricPlot[{x, functionB[Sqrt[x]]}, {x, 0, 1}]
 ]
Run Code Online (Sandbox Code Playgroud)

functionB[x]必须与之不同functionB[Sqrt[x]],但在这种情况下,两条线是相同的(这是不正确的).

acl*_*acl 10

如果你尝试?functionB,你会看到它存储为functionB[x_]:=model/.fit.因此,只要你现在functionB[y],对于任何y,数学计算model/.fit,获取4/Sqrt[3] - 0.335/(0.435 + x)^2 + 0.347/(0.712 + x)^4 - 0.27/(4.29 + x).

这与使用SetDelayed(即:=)有关.functionB[x_]:=model/.fit每次Mathematica看到模式时,都会重新评估rhs f[_].您已将该模式命名x为无关紧要.

你想要什么可以通过例如functionC[x_] = model /. fit.也就是说,通过使用Set(=)而不是SetDelayed(:=)来评估rhs.

希望这很清楚(可能不是)......

  • @rcollyer我确信Mma版本4到8都支持以这种方式使用`Set`.我怀疑这种行为会一直回到v1,但也许旧的(呃)计时器可以让我直截了当. (2认同)