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

  • Thread starter Thread starter FrancescoMi
  • Start date Start date
  • Tags Tags
    Matlab
AI Thread Summary
The error in the MATLAB code arises because the 'diff' function is being applied to a function handle instead of a symbolic expression. In MATLAB, 'diff' calculates differences for numeric arrays, while in the Symbolic Math Toolbox, it differentiates symbolic expressions. To fix the code, the definitions of D, psi, and Theta should be symbolic expressions rather than function handles, while x should remain a function handle for the integral. Additionally, the expression for eta in psi needs to be corrected to ensure proper multiplication. Implementing these changes allows the code to run without errors.
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 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
Views
2K
Replies
4
Views
1K
Replies
10
Views
3K
Replies
4
Views
1K
Replies
9
Views
5K
Replies
6
Views
2K
Replies
5
Views
2K
Replies
4
Views
2K
Replies
3
Views
3K
Back
Top