Error in MATLAB Code: Fixing 'Function 'diff' is Not Supported

  • Context: MATLAB 
  • Thread starter Thread starter FrancescoMi
  • Start date Start date
  • Tags Tags
    Matlab
Click For Summary

Discussion Overview

The discussion revolves around an error encountered in MATLAB code related to the use of the 'diff' function with function handles. Participants explore the implications of using symbolic and numeric variables within function handles and the requirements for the 'diff' function in both MATLAB and the Symbolic Math Toolbox.

Discussion Character

  • Technical explanation
  • Debate/contested

Main Points Raised

  • One participant describes an error message indicating that "Function 'diff' is not supported for class 'function_handle'" when attempting to use 'diff' on a function handle.
  • Another participant suggests replacing the argument of 'diff' with a direct call to the function, such as psi(p), instead of using a function handle.
  • It is noted that the 'diff' function behaves differently in MATLAB compared to the Symbolic Math Toolbox, with the former calculating differences for numeric arrays and the latter differentiating symbolic expressions.
  • A participant explains that combining symbolic and numeric variables in a function handle leads to the error, as 'diff' does not accept function handles in this context.
  • Several changes to the original code are proposed, including converting certain expressions from function handles to symbolic expressions and ensuring that 'fzero' receives a function handle input.
  • A typo in the definition of psi is pointed out, specifically regarding the use of eta, which should be multiplied rather than indexed.

Areas of Agreement / Disagreement

Participants generally agree on the nature of the error and the necessary changes to the code, but there is no explicit consensus on the best approach to resolve the issue, as multiple perspectives on the use of function handles and symbolic expressions are presented.

Contextual Notes

Participants highlight the importance of understanding the distinctions between numeric and symbolic contexts in MATLAB, as well as the specific requirements for the 'diff' function in each context. There are unresolved aspects regarding the exact nature of the changes needed for the code to function correctly.

FrancescoMi
Messages
5
Reaction score
0
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.
 
Physics news on Phys.org
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
 
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 into 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
 
  • Like
Likes   Reactions: jedishrfu
kreil said:
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 into 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 :)
 

Similar threads

  • · Replies 1 ·
Replies
1
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 10 ·
Replies
10
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 6 ·
Replies
6
Views
4K
  • · Replies 9 ·
Replies
9
Views
5K
  • · Replies 6 ·
Replies
6
Views
2K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 3 ·
Replies
3
Views
3K