Path: news.mathworks.com!not-for-mail
From: <HIDDEN>
Newsgroups: comp.soft-sys.matlab
Subject: Re: Problems with Logs and the gradient function
Date: Fri, 13 Aug 2010 17:40:20 +0000 (UTC)
Organization: The Mitre Corp
Lines: 63
Message-ID: <i44024$dv$1@fred.mathworks.com>
References: <i41o6t$1l3$1@fred.mathworks.com> <i41thj$7q2$1@fred.mathworks.com> <i43uf0$i1r$1@fred.mathworks.com>
Reply-To: <HIDDEN>
NNTP-Posting-Host: webapp-02-blr.mathworks.com
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
X-Trace: fred.mathworks.com 1281721220 447 172.30.248.37 (13 Aug 2010 17:40:20 GMT)
X-Complaints-To: news@mathworks.com
NNTP-Posting-Date: Fri, 13 Aug 2010 17:40:20 +0000 (UTC)
X-Newsreader: MATLAB Central Newsreader 2318
Xref: news.mathworks.com comp.soft-sys.matlab:661834

"Adrian " <adrianb_remove_this@uga.edu> wrote in message <i43uf0$i1r$1@fred.mathworks.com>...
> "Roger Stafford" <ellieandrogerxyzzy@mindspring.com.invalid> wrote in message <i41thj$7q2$1@fred.mathworks.com>...
> > "Adrian " <adrianb_remove_this@uga.edu> wrote in message <i41o6t$1l3$1@fred.mathworks.com>...
> > > I am trying to understand the gradient function in Matlab. As I understand it, 
> > > 
> > > gradient(y)
> > > 
> > > for y a vector, will calculate the gradient of y assuming a unit interval between the points. In other words, it will calculate dy/dx assuming dx=1 for all points in the series. 
> > > 
> > > This works as expected if I have 
> > > 
> > > x = 1:20;
> > > y = x.^2;
> > > dydx = 2*x;
> > > 
> > > disp([dydx; gradient(y)]);
> > > 
> > > in which case dydx and gradient(y) produce the same vales (except at the end points which is to be expected). 
> > > 
> > > Now let's take the same function but have the x values geometrically spaced
> > > 
> > > n = 1:10;
> > > x = 2.^(n-1);
> > > y = x.^2;
> > > 
> > > If I use the gradient function, it will still assume a unit spacing of x between the data points. 
> > > 
> > > My question is: why isn't gradient(y) = dy/dlog2(x)?
> > > 
> > > log2(x) is equally spaced with unit interval but the gradient function is producting something different. In this case, dy/dlog2(x) = 2*log(2)*x.*x but this is not equal to the values produced by gradient(y). However, the ratio between the two is constant (except at the endpoints)
> > > 
> > > (dy/dlog2(x))./gradient(y) = 0.73936
> > > 
> > > I'm obviously missing something somewhere, can someone help me out here?
> > > 
> > > Thanks,
> > > 
> > > Adrian
> > - - - - - - - -
> >   The gradient function has provision for a second argument that specifies the x spacing.  If it is a scalar, that scalar is the constant spacing assumed.  If it is a vector the same length as the first argument, that gives the actual values of your x variable.  Check it out.
> 
> Hi Roger,
> 
> Thanks for the reply, but I don't think that's the case. According to the help page for the function gradient
> 
> [...] = gradient(F,h) where h is a scalar uses h as the spacing between points in each direction.
> 
> [...] = gradient(F,h1,h2,...) with N spacing parameters specifies the spacing for each dimension of F.
> 
> For for F being a vector, there is only one h and it is a scalar. If F were a 2 x 2 matrix, then I could specify two scalar values of h, one for the "x-direction" and one for the "y-direction". 
> 
> This still doesn't explain why gradient(y) in the above example is not   dy/dlog2(x). It seems it should be, but it isn't.
> 
> Adrian

Yes, that is what the documentation says.  But did you try Rodger's suggestion?

gradient(y, dydx)

where dydx is a vector the same length as y seems to work for me.

Perhaps the MATLAB documentation shoud be upgraded 
for the case(s) when h is NOT a vector.