Re: Derivative of Dot[]

*To*: mathgroup at smc.vnet.net*Subject*: [mg91085] Re: Derivative of Dot[]*From*: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>*Date*: Wed, 6 Aug 2008 05:02:18 -0400 (EDT)*Organization*: The Open University, Milton Keynes, UK*References*: <g791cq$9hc$1@smc.vnet.net>

Eitan Grinspun wrote: > I would like to compute the gradient F' of a scalar-valued function F > of a vector-valued argument, without knowing a-priori the dimensions > of the vector. > > I am having some trouble with a very simple case. > > Consider the following function: > > F[x_] := Dot[x,x] > > Evaluating this function works as expected: F[{1,2}] evaluates to 5. > > I differentiate this function w.r.t. its sole argument, F' evaluates > to 1.#1+#1.1& > > This is reasonable, and as expected. I would think that, since the The above expression make sense only for one dimensional vectors, say on the real line; in other words, a vector space where the unit vector is {1} and any vector {x} has only one component x. Also, keep in mind that Mathematica does not have the notion of "vector." Vectors, in the mathematical sense, are represented by one dimensional lists in Mathematica. (Note that there is no explicit notion of row or column vectors.) Moreover, Mathematica usually manipulates -- rewrites -- expressions at the syntactic level. For instance, exact -- infinite precision -- zero times a string returns zero, while multiplying floating-point zero by a string returns unevaluated. In[1]:= 0*Infinity During evaluation of In[1]:= \[Infinity]::indet: Indeterminate \ expression 0 \[Infinity] encountered. >> Out[1]= Indeterminate In[2]:= 0*"Infinity" Out[2]= 0 In[3]:= 0.*"Infinity" Out[3]= 0. "Infinity" > argument of Dot must be a list, the derivative of Dot would have been > designed to return something that is useful. While I presume that this > is the case, I have been unable to move ahead. > > I evaluate the derivative at {1,2}: F'[{1, 2}] returns 1.{1,2}+{1,2}.1 > > The Dot is not defined for scalar arguments, and therefore Simplify > does not reduce this further. I could of course program a rule so that > Dot[1,x_]->x, but my intent here is to understand why the derivative > of Dot was designed the way it was---presumably there is a reason, and > there is a proper way to make use of the derivative. > > Once I have the derivative, I should be able to contract it with a > (tangent) vector to obtain the (linearized) change the (scalar) > function value: > > F'[{1, 2}].{3,4} > > Alas, this returns (1.{1,2}+{1,2}.1).{3,4} which does not simplify > (even after Distribute) because Dot does not operate on scalar > arguments. > > I'd like some help in understanding how to use Derivative with Dot (it > was evidently designed to be used, or there would not be a rule built > in). You may want to write you own differentiating function such as the following: In[1]:= SetAttributes[myDiff, HoldFirst] myDiff[fun_[x_?VectorQ]] := Module[{v = Array[a, Length[x]]}, D[fun[v], {v}] /. Thread[v -> x]] f[x_?VectorQ] := Dot[x, x] myDiff[f[{1, 2}]] myDiff[f[{1, 2}]].{3, 4} g[y_] := 2 f[y] myDiff[g[{1, 2}]] myDiff[g[{1, 2}]].{3, 4} Out[4]= {2, 4} Out[5]= 22 Out[7]= {4, 8} Out[8]= 44 Regards, -- Jean-Marc

**Follow-Ups**:**Re: Re: Derivative of Dot[]***From:*"Jean-Marc Gulliet" <jeanmarc.gulliet@gmail.com>

**Re: Re: Derivative of Dot[]***From:*"Eitan Grinspun" <eitan@grinspun.com>