Documentation |
Directional derivative of function
df = fndir(f,y)
df = fndir(f,y) is the ppform of the directional derivative, of the function f in f, in the direction of the (column-)vector y. This means that df describes the function $${D}_{y}f(x):={\mathrm{lim}}_{t\to 0}(f(x+ty)-f(x))/t$$.
If y is a matrix, with n columns, and f is d-valued, then the function in df is prod(d)*n-valued. Its value at x, reshaped to be of size [d,n], has in its jth "column" the directional derivative of f at x in the direction of the jth column of y. If you prefer df to reflect explicitly the actual size of f, use instead
df = fnchg( fndir(f,y), 'dim',[fnbrk(f,'dim'),size(y,2)] );
Since fndir relies on the ppform of the function in f, it does not work for rational functions nor for functions in stform.
For example, if f describes an m-variate d-vector-valued function and x is some point in its domain, then, e.g., with this particular ppform f that describes a scalar-valued bilinear polynomial,
f = ppmak({0:1,0:1},[1 0;0 1]); x = [0;0]; [d,m] = fnbrk(f,'dim','var'); jacobian = reshape(fnval(fndir(f,eye(m)),x),d,m)
is the Jacobian of that function at that point (which, for this particular scalar-valued function, is its gradient, and it is zero at the origin).
As a related example, the next statements plot the gradients of (a good approximation to) the Franke function at a regular mesh:
xx = linspace(-.1,1.1,13); yy = linspace(0,1,11); [x,y] = ndgrid(xx,yy); z = franke(x,y); pp2dir = fndir(csapi({xx,yy},z),eye(2)); grads = reshape(fnval(pp2dir,[x(:) y(:)].'),... [2,length(xx),length(yy)]); quiver(x,y,squeeze(grads(1,:,:)),squeeze(grads(2,:,:)))
Here is the resulting plot.