MATLAB Answers

Error with using fminsearch

2 views (last 30 days)
I am working on finding the point that is the closest to 15 locations (minimum distance from all). The x- and y-coordinates are stored in 2 variables. I created the function and extracted the scalar variables from the vector but I am getting an error stating that there are not enough input arguments. The function definition and code are below:
function distance=mindistance(xv)
x=xv(1);
y=xv(2);
% extracting scaler variables from vector in fminsearch
sources = readtable('Data.xlsx','Sheet','PROJECT');
xcoordinates=table2array(sources(:,3));
ycoordinates=table2array(sources(:,4));
distance=sqrt(((x-xcoordinates).^2)+((y-ycoordinates).^2));
end
point to start with for fminsearch
xvg=[-2000 1500];
[xvmin,minD]=fminsearch(mindistance,xvg);

  0 Comments

Sign in to comment.

Accepted Answer

Walter Roberson
Walter Roberson on 22 Dec 2019
Edited: Walter Roberson on 22 Dec 2019
For one definition of "minimum distance from all":
function [xvmin, minD] = mindistance_driver
sources = readtable('Data.xlsx','Sheet','PROJECT');
xcoordinates = sources{:,3};
ycoordinates = source{:,4};
xvg=[mean(xcoordinates), mean(ycoordinates)];
[xvmin, minD]=fminsearch( @(x) mindistance(x, xcoordinates, ycoordinates), xvg);
end
function distance = mindistance(xv, xcoordinates, ycoordinates)
x=xv(1);
y=xv(2);
distance = sum( sqrt(((x-xcoordinates).^2)+((y-ycoordinates).^2)) );
end
There are other definitions that can be computed much more efficiently. In particular, if you use
distance = sqrt( sum( ((x-xcoordinates).^2)+((y-ycoordinates).^2) ) );
then you can demonstrate that mean(x) and mean(y) are the optimal coordinates, without needing to do any searching.

  1 Comment

Berenice Oseguera
Berenice Oseguera on 23 Dec 2019
Thank you! This worked!

Sign in to comment.

More Answers (1)

per isakson
per isakson on 22 Dec 2019
Edited: per isakson on 22 Dec 2019
Replace
[xvmin,minD]=fminsearch(mindistance,xvg);
by
[xvmin,minD]=fminsearch('mindistance',xvg);
or
[xvmin,minD]=fminsearch(@mindistance,xvg);

  5 Comments

Show 2 older comments
Walter Roberson
Walter Roberson on 22 Dec 2019
If the coordinates in the Data.xlsx are real-valued, then sqrt(((x-xcoordinates).^2)+((y-ycoordinates).^2)) will be strictly real valued given those real-valued initial conditions. The problem is that it is a vector of distances, and you need to go from the vector to "minimum distance from all", which could mean several different things. For example it might correspond to max() of the distances, or it might be the sum of the distances, or it might be sum-of-squared distances.
per isakson
per isakson on 22 Dec 2019
I try to help OP find his/her programming mistakes. To that end I believe that reading documentation and the debugging process are important.

Sign in to comment.

Sign in to answer this question.

Tags