6

这是一个奇怪的结果,在这个例子中定义为“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}]
 ]

functionB[x]必须不同于functionB[Sqrt[x]],但在这种情况下,两行是相同的(这是不正确的)。

4

2 回答 2

10

如果您尝试?functionB,您会看到它存储为functionB[x_]:=model/.fit. 因此,只要您现在拥有functionB[y],对于任何y,Mathematica 都会评估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。

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

于 2011-05-18T14:56:52.807 回答
3

您可能想尝试在 functionB 中定义模型,因此两个地方的 x 都是相关的:

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