Minimizing a multivariable anonymous function that contains vectors using fminsearch
Show older comments
I am trying to minimize I0 and a in the function handle below. rBes and rCutFit are vectors with the same dimensions. The variables, wave, a, C, u, and r are constants that have already been defined in the script.
R2=@(I0,a) (rBes(u)-I0*((2*rCutFit((((2*pi)/wave)*a*sin(atan((u*C)/r))))/(((2*pi)/wave)*a*sin(atan((u*C)/r))))^.2)).^2; MIN=fminsearch(R2,[1,10^-6]);
I keep getting the error below everytime I run the code. Please let me know if you have any advice for fixing this.
"Not enough input arguments.
Error in @(I0,a)(rBes(u)-I0*((2*rCutFit((((2*pi)/wave)*a*sin(atan((u*C)/r))))/(((2*pi)/wave)*a*sin(atan((u*C)/r))))^.2)).^2
Error in fminsearch (line 189) fv(:,1) = funfcn(x,varargin{:});"
Answers (1)
James Tursa
on 22 Jul 2017
0 votes
Make R2 accept a vector input. E.g., use x as the argument and replace I0 with x(1) and a with x(2)
R2=@(x) (rBes(u)-x(1)*((2*rCutFit((((2*pi)/wave)*x(2)*sin(atan((u*C)/r))))/(((2*pi)/wave)*x(2)*sin(atan((u*C)/r))))^.2)).^2;
MIN=fminsearch(R2,[1,10^-6]);
9 Comments
Walter Roberson
on 22 Jul 2017
What is rCutFit ?
James Tursa
on 22 Jul 2017
You didn't replace that 2nd "a" with x(2)
Also, the error you are getting typically indicates you are shadowing a function with a variable. E.g., maybe you have a variable named "sin" or "atan" or "rCutFit" or "rBes" in your workspace that is shadowing those functions.
Tana Si
on 23 Jul 2017
Tana Si
on 23 Jul 2017
Walter Roberson
on 23 Jul 2017
rCutFit((((2*pi)/wave)*x(2)*sin(atan((u*C)/r))))
mean that you want to calculate (((2*pi)/wave)*x(2)*sin(atan((u*C)/r))) and use that as an index into rCurFit . That is going to fail except under unlikely circumstances that the computation produces a positive integer.
Did you need a multiplication between rCurFit and the following expression?
Tana Si
on 23 Jul 2017
Tana Si
on 23 Jul 2017
Walter Roberson
on 23 Jul 2017
Arrays (and vectors) have particular sizes at any one time, and are indexed with () notation and what follows in the () must be a list of positive integers, possibly together with colons.
Functions also use () notation to invoke them, and can have non-integral arguments that are function parameters.
You cannot use non-integral values (other than colon) in the () after a vector name (except in intermediate calculations provided the overall result of the calculation is positive integer).
If you need to perform a calculation on a non-integral argument and get a vector or array output, then you should make rCutFit into a function that does the appropriate bessel calculation and removes whatever and reshapes as is suitable.
Categories
Find more on Programming 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!