2012-05-24 67 views
1

我想在Mathematica中的一个点(3,5,1)评估函数的导数。所以,这是我的输入:在Mathematica中评估三个变量的函数的衍生物

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)处评估衍生物的任何提示?

回答

6

您收到的Out[124]的结果让我相信f未被清除以前的定义。特别是,它似乎有通过执行

g = 5; 
OwnValues[g] 
所谓由所述形式

f = 1/8 

(注意缺乏结肠的。)可以验证这一点的一种表达设置OwnValue

返回

{HoldPattern[g] :> 5} 

不幸的是,OwnValuessupersede任何其他定义,像一个函数定义(被称为DownValue或者其变体UpValue)。因此,定义

g[x_] := x^2 

会导致g[5],以评估5[5];显然不是你想要的。因此,您打算在定义之前将其用作函数的任何符号。也就是说,你的f的定义仍然会遇到问题。

问题在于,在定义f时,您是否使用SetDelayed:=)。这可以防止赋值的右侧获得一个值,直到稍后执行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[%] 
+0

谢谢。非常详细的答案。 – Koba

+2

@Dostre Mathematica的大多数专家已转到他们自己的stackexchange站点:[Mathematica.se]。如果您对Mathematica有任何疑问,那就值得在这里发布。 – rcollyer

+0

哦,我不知道。好。 – Koba