1

我正在尝试在 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) 处评估该导数的任何提示?

4

1 回答 1

6

你得到的结果让Out[124]我相信f以前的定义没有被清除。特别是,它似乎有所谓的OwnValue由形式的表达式设置的

f = 1/8 

(请注意缺少冒号。)您可以通过执行来验证这一点

g = 5;
OwnValues[g]

返回

 {HoldPattern[g] :> 5}

不幸的是,OwnValues 取代任何其他定义,如函数定义(称为 aDownValue或其变体 an 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[%]
于 2012-05-24T02:44:49.923 回答