# Problem with Matlab

• MATLAB

## Main Question or Discussion Point

Hi, I have a problem with my matlab code. The error is: "Function 'diff' is not supported for class 'function_handle'."
I have installed the toolbox Symbolic Math Toolbox after the installation of Matlab, but I think that it works, so my code is this:

Matlab:
t=2;
alpha=2;
p_0=20;
c=10;
eta=0.2;
mu=10;
sigma=0.5;

syms p;
x=@(p) t^(-alpha-1)*exp(-((t^2)/2)-p*t);
D=@(p)(exp(-(p^2)/4)/gamma(alpha))*integral(x,0,Inf);
psi=@(p) exp(eta((p-mu)^2/2*(sigma)^2))*D*(((p-mu)/sigma)*sqrt(2*eta));
Theta=@(p) (p-c)*diff(psi)-psi;
fzero(Theta,p_0)
Can you see the mistake? Thank you for your help. Bye.

Related MATLAB, Maple, Mathematica, LaTeX News on Phys.org
jedishrfu
Mentor
Here's one comment I found that said to replace the diff argument with something like psi(p) ? The original post said diff(f) --> diff(f(x)

Here's the MATLAB docs on diff where they mention that the diff argument must be a vector not a function:

http://www.mathworks.com/help/matlab/ref/diff.html

kreil
Gold Member
The diff function has different uses in MATLAB vs. Symbolic Math Toolbox. In MATLAB, diff calculates differences between the elements in a vector or matrix. You can then use those numeric differences to find a numerical approximation to the derivative, assuming the values in the vector or matrix represent function values for some unknown function.

In Symbolic Math Toolbox, diff differentiates a symbolic expression to obtain the derivative. This necessarily requires that you input a valid symbolic expression.

So the problem you're encountering is due to the fact that you're combining symbolic and numeric variables in a function handle expression, then expecting diff to know what to do with it. When diff sees a function handle input, it calls the MATLAB version of the function, which is not defined for function handles, hence the error you receive.

The below code runs but you'll have to double check it because you had a typo in the definition of psi. I made the following changes:

1. D, psi, and Theta do not need to be function handles. Removing the @(p) from the beginning turns them into symbolic expressions.
2. x does need to be a function handle because you're feeding it in to the integral function.
3. fzero wants a function handle input. The function matlabFunction() turns a symbolic expression into a function handle, so you just need to convert Theta and then fzero works nicely.
4. In your definition of psi, you have a symbolic expression inside parentheses for eta(),
Code:
eta((p-mu)^2/2*(sigma)^2)
This produces an error because eta is equal to 0.2, and the indexing doesn't make sense in that case. In my code below I added eta*() to multiply, but you should double check what this expression should actually be.

Code:
t=2;
alpha=2;
p_0=20;
c=10;
eta=0.2;
mu=10;
sigma=0.5;

syms p;
x = @(p) t^(-alpha-1)*exp(-((t^2)/2)-p*t);
D = (exp(-(p^2)/4)/gamma(alpha))*integral(x,0,Inf);
psi = exp(eta*((p-mu)^2/2*(sigma)^2))*D*(((p-mu)/sigma)*sqrt(2*eta));
Theta = (p-c)*diff(psi)-psi;
fzero(matlabFunction(Theta),p_0)
Hope this helps.
Josh

The diff function has different uses in MATLAB vs. Symbolic Math Toolbox. In MATLAB, diff calculates differences between the elements in a vector or matrix. You can then use those numeric differences to find a numerical approximation to the derivative, assuming the values in the vector or matrix represent function values for some unknown function.

In Symbolic Math Toolbox, diff differentiates a symbolic expression to obtain the derivative. This necessarily requires that you input a valid symbolic expression.

So the problem you're encountering is due to the fact that you're combining symbolic and numeric variables in a function handle expression, then expecting diff to know what to do with it. When diff sees a function handle input, it calls the MATLAB version of the function, which is not defined for function handles, hence the error you receive.

The below code runs but you'll have to double check it because you had a typo in the definition of psi. I made the following changes:

1. D, psi, and Theta do not need to be function handles. Removing the @(p) from the beginning turns them into symbolic expressions.
2. x does need to be a function handle because you're feeding it in to the integral function.
3. fzero wants a function handle input. The function matlabFunction() turns a symbolic expression into a function handle, so you just need to convert Theta and then fzero works nicely.
4. In your definition of psi, you have a symbolic expression inside parentheses for eta(),
Code:
eta((p-mu)^2/2*(sigma)^2)
This produces an error because eta is equal to 0.2, and the indexing doesn't make sense in that case. In my code below I added eta*() to multiply, but you should double check what this expression should actually be.

Code:
t=2;
alpha=2;
p_0=20;
c=10;
eta=0.2;
mu=10;
sigma=0.5;

syms p;
x = @(p) t^(-alpha-1)*exp(-((t^2)/2)-p*t);
D = (exp(-(p^2)/4)/gamma(alpha))*integral(x,0,Inf);
psi = exp(eta*((p-mu)^2/2*(sigma)^2))*D*(((p-mu)/sigma)*sqrt(2*eta));
Theta = (p-c)*diff(psi)-psi;
fzero(matlabFunction(Theta),p_0)
Hope this helps.
Josh
Thanks a lot, very clear explenation!! And thank you for the remark of eta, that was a multiplication :)