Problem with Matlab

  • MATLAB
  • Thread starter FrancescoMi
  • Start date
  • #1

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.
 

Answers and Replies

  • #2
11,280
4,741
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
 
  • #3
kreil
Insights Author
Gold Member
668
67
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
 
  • #4
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 :)
 

Related Threads for: Problem with Matlab

  • Last Post
Replies
2
Views
1K
  • Last Post
Replies
2
Views
2K
  • Last Post
Replies
4
Views
8K
Replies
2
Views
4K
  • Last Post
Replies
4
Views
6K
  • Last Post
Replies
0
Views
7K
Replies
0
Views
3K
Replies
2
Views
2K
Top