这是一个奇怪的结果,在这个例子中定义为“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]]
不同,但在这种情况下,两行相同(不正确)。
答案 0 :(得分: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
(即:=
)有关。每次Mathematica看到模式functionB[x_]:=model/.fit
时,都会重新评估f[_]
的rhs。您已将模式x
命名为无关紧要。
你想要的是通过例如functionC[x_] = model /. fit
。也就是说,使用Set
(=
)而不是SetDelayed
(:=
),以便评估rhs。
希望这很清楚(可能不是)......
答案 1 :(得分: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
]