Why Undefined operator '-' in function_handle?
Show older comments
When I enter ' H(3) ' in the command line, the following error is shown:
Undefined operator '-' for input arguments of type 'function_handle'.
Error in
Trial_H>@(m)d1+s*(cos(gama)+sum(cos(gama+(pi/2-phi_i))))+((2*r)-omega)*sin(B_j(m))+(r-omega)*sum(sin((1:m-1)*pi-sum(B_j(1:m-1))))
Here is the code:
% Variables
m = 3;
L = 10;
R = 1;
r = R/(m+1);
S = sqrt(2);
s = S/(m+1);
d1 = 1;
d2 = 0.25;
omega = R/(3*(m+1));
gama = atan(R/d1);
% Functions
phi_i = @(ii, m) atan( (d1+(ii*d2)./(m+1) )./(r/3) );
B_j = @(ii, m) 2*phi_i(ii, m);
H = @(m) d1 + s*( cos(gama) + sum(cos(gama+(pi/2-phi_i))) ) + ( (2*r)-omega)*sin(B_j(m) ) + (r-omega)*sum(sin((1:m-1)*pi - sum(B_j(1:m-1))));
8 Comments
Ameer Hamza
on 7 Apr 2020
This statement uses variable m
r = R/(m+1);
But m is not defined in your code.
KSSV
on 7 Apr 2020
Give the input to phi_i in H.
Jay
on 7 Apr 2020
Walter Roberson
on 7 Apr 2020
Please see the discussion at
Walter Roberson
on 7 Apr 2020
We mean that when you refer to phi_i inside H, phi_i is not going to be invoked as a function: it would not have any idea where to get its inputs from. The variables ii and m that are given as its parameters are local to it, as I described in the link above, and phi_i will not look in the calling environment to see if there happens to be variables named ii or m there. Parameters to a function handle are always strictly positional, so if you do not pass something to phi_i insid H then phi_i is not going to have any idea what values it should be run on.
If you want to invoke phi_i inside H, you need to pass it particular parameters.
Walter Roberson
on 7 Apr 2020
Edited: Walter Roberson
on 7 Apr 2020
H = @(m) d1 + s*( cos(gama) + sum(cos(gama+(pi/2-phi_i))) ) + ( (2*r)-omega)*sin(B_j(m) ) + (r-omega)*sum(sin((1:m-1)*pi - sum(B_j(1:m-1))));
^^^^^^
That is a reference to the anonymous function phi_i but it is not a call to run phi_i with particular parametrs.
B_j = @(ii, m) 2*phi_i(ii, m);
That defines B_j as being a handle to an anonymous function that expects two parameters
H = @(m) d1 + s*( cos(gama) + sum(cos(gama+(pi/2-phi_i))) ) + ( (2*r)-omega)*sin(B_j(m) ) + (r-omega)*sum(sin((1:m-1)*pi - sum(B_j(1:m-1))));
^^^^^^ ^^^^^^^^^^
Those two places, you try to invoke B_j with one parameter.
Where is the ii value coming from that you expect to pass into B_j and phi_i ?
Answers (0)
Categories
Find more on Variables in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!