# How to use gradient?

18 views (last 30 days)

Show older comments

what is the problem with the following code?

f=input('enter function: ','s')

[DX,DY] = -gradient(f);

f = str2func(['@(x,y)' vectorize(f)]);

[DX,DY] = -gradient(f);

hold on

quiver(X,Y,DX,DY)

hold off

I get the following errors:

Error using zeros CLASSNAME input must be a valid numeric or logical class name.

Error in gradient (line 56) g = zeros(size(f),class(f)); % case of singleton dimension

### Accepted Answer

Star Strider
on 13 May 2017

Edited: Star Strider
on 13 May 2017

You have to evaluate ‘f’ to calculate the gradient.

The Code —

f = 'log(x^2+y^2)';

f = str2func(['@(x,y)' vectorize(f)]);

x = -10:10;

y = x';

[DX,DY] = gradient(-f(x,y));

quiver(x,y,DX,DY,0); % The ‘0’ Argument Turns Off Arrow Scaling

The Plot —

EDIT — Added plot.

##### 7 Comments

Star Strider
on 15 May 2017

Consider using the symvar function (in core MATLAB as well as the Symbolic Math Toolbox) to determine the variables in an expression. You can then use the size or length of that result with appropriate if or similar blocks to calculate the appropriate gradient of your function.

Example —

f = 'log(x^2+y^2)';

vars1 = symvar(f)

f = str2func(['@(x,y)' vectorize(f)]);

syms f(x,y) x y

f(x,y) = x^4 + tan(x);

vars2 = symvar(f)

vars1 =

2×1 cell array

'x'

'y'

vars2 =

x

Note that symvar will not work on function handles, so you must put it before your str2func call for it to work.

### More Answers (1)

Stephen23
on 13 May 2017

Edited: Stephen23
on 13 May 2017

You need to start reading the MATLAB documentation, because guessing how to use MATLAB will not be an efficient use of your time. MATLAB has very accessible documentation: learn to use it:

When you actually open the gradient documentation and read the input description, it clearly describes the first argument as "F — Input array vector | matrix | multidimensional array"

So far you have tried two different inputs, neither of which are numeric arrays:

f=input('enter function: ','s')

[DX,DY] = -gradient(f); % <- here the input is a string

f = str2func(['@(x,y)' vectorize(f)]);

[DX,DY] = -gradient(f); % <- here the input is a function handle

The gradient documentation does not state that it accepts strings or function handles. It accepts numeric data only. In fact, the subtitle at the very top of the page states quite clearly "Numerical gradient", and it does not state symbolic or functional gradient.

Perhaps you were trying to do something like this (note that this is a numeric calculation):

>> [X,Y] = meshgrid(0:9);

>> Z = X.^2 + sqrt(Y); % function of X and Y

>> [DX,DY] = gradient(Z); % input numeric array to gradient

>> quiver(X,Y,DX,DY)

##### 2 Comments

Stephen23
on 14 May 2017

### See Also

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!