我试图在Mathematica中评估函数在(3,5,1)处的导数。所以,这就是我的意见:
In[120]:= D[Sqrt[(z + x)/(y - 1)] - z^2, x]
Out[121]= 1/(2 (-1 + y) Sqrt[(x + z)/(-1 + y)])
In[122]:= f[x_, y_, z_] := %
In[123]:= x = 3
y = 5
z = 1
f[x, y, z]
Out[124]= (1/8)[3, 5, 1]
正如你所看到的,我得到了一些奇怪的输出。有关在(3,5,1)处评估该衍生物的任何提示吗?
答案 0 :(得分:6)
Out[124]
获得的结果让我相信f
未被清除之前的定义。特别是,它似乎具有所谓的OwnValue
,它由表单的表达式设置
f = 1/8
(注意缺少冒号。)您可以通过执行
来验证这一点g = 5;
OwnValues[g]
返回
{HoldPattern[g] :> 5}
不幸的是,OwnValues
supersede任何其他定义,例如函数定义(称为DownValue
或其变体,UpValue
)。所以,定义
g[x_] := x^2
会导致g[5]
评估为5[5]
;显然不是你想要的。因此,Clear
您打算在定义之前用作函数的任何符号。也就是说,您对f
的定义仍会遇到问题。
问题在于,您在定义:=
时使用SetDelayed
(f
)。这可以防止赋值的右侧在稍后执行f
之前取值。例如,
D[x^2 + x y, x]
f[x_, y_] := %
x = 5
y = 6
f[x, y]
返回6
。这是因为6
是最后生成的结果,f
实际上是%
的同义词。有两种方法可以使用Set
(=
)
Clear[f, x, y]
D[x^2 + x y, x];
f[x_, y_] = %
f[5, 6]
按预期返回16
,或确保%
在SetDelayed
获取之前被Clear[f, x, y]
D[x^2 + x y, x];
f[x_, y_] := Evaluate[%]
替换,
{{1}}