Facing error in the optimization part. Kindly suggest solution

2 views (last 30 days)
clc;
clear;
a=[241.0, 301.0, 261.0, 221.0, 281.0, 361.0, 401.0, 361.0, 301.0, 321.0, 221.0, 281.0, 201.0, 201.0, 261.0, 141.0, 181.0, 201.0, 161.0, 121.0, 161.0, 221.0, 141.0, 161.0, 201.0, 221.0, 221.0, 201.0, 221.0, 221.0, 241.0, 301.0, 281.0, 221.0];
b=[130.0, 150.0, 190.0, 170.0, 210.0, 130.0, 170.0, 230.0, 210.0, 190.0, 230.0, 270.0, 290.0, 330.0, 330.0, 150.0, 130.0, 150.0, 150.0, 170.0, 190.0, 210.0, 230.0, 230.0, 70.0, 90.0, 110.0, 110.0, 130.0, 50.0, 110.0, 110.0, 70.0, 70.0];
lb_w=[1e-04, 1e-04, 1e-04,1e-04, 1e-04, 1e-04,1e-04];
ub_w=[10000,10000,10000,10000,10000,10000,10000];
reg1=[11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11];
reg2=[10,10,10,10,10,11,11,11,11,11,12,12,12,12,12,17,17,17,17,18,18,18,18,18,38,38,38,38,38,39,39,39,39,39];
lb_x=[283.6939,203.9050,179.9683,134.7546,100.1794, 177.3087,207.4512];
ub_x=[419.3351 313.8364 296.1055 210.9974 231.3879 242.9129 325.3615];
lb_y=[123.6309 109.4000 209.0163 122.7415 153.8715 53.3659 19.5675];
ub_y=[259.7138 215.2423 360.2195 165.4341 240.1463 144.0878 138.7512];
initial_x = zeros(1, 7);
initial_y = zeros(1, 7);
initial_w = zeros(1, 7);
disp(['initial_x: ', num2str(initial_x)])
initial_x: 0 0 0 0 0 0 0
% Concatenating initial guesses, lower bounds, and upper bounds
%initialVars = [initial_x, initial_y, initial_w];
initialVars = [lb_x, lb_y, lb_w];
lb = [lb_x, lb_y, lb_w];
ub = [ub_x, ub_y, ub_w];
disp(lb);
Columns 1 through 19 283.6939 203.9050 179.9683 134.7546 100.1794 177.3087 207.4512 123.6309 109.4000 209.0163 122.7415 153.8715 53.3659 19.5675 0.0001 0.0001 0.0001 0.0001 0.0001 Columns 20 through 21 0.0001 0.0001
disp(ub);
1.0e+04 * Columns 1 through 19 0.0419 0.0314 0.0296 0.0211 0.0231 0.0243 0.0325 0.0260 0.0215 0.0360 0.0165 0.0240 0.0144 0.0139 1.0000 1.0000 1.0000 1.0000 1.0000 Columns 20 through 21 1.0000 1.0000
% Optimization options
options = optimoptions('fmincon', 'Display', 'iter', 'Algorithm', 'interior-point');
% Defining the objective function
objFun = @(vars) objective(vars, a, b, reg1, reg2);
% Run optimization
[optimalVars, fval] = fmincon(objFun, initialVars, [], [], [], [], lb, ub, [], options);
Initial point X0 is not between bounds LB and UB; FMINCON shifted X0 to strictly satisfy the bounds.
Index exceeds the number of array elements. Index must not exceed 7.

Error in solution>objective (line 59)
p(i)=((x(r1)-a(i))^2 + (y(r1)-b(i))^2)-abs(w(r1));

Error in solution>@(vars)objective(vars,a,b,reg1,reg2) (line 29)
objFun = @(vars) objective(vars, a, b, reg1, reg2);

Error in fmincon (line 563)
initVals.f = feval(funfcn{3},X,varargin{:});

Caused by:
Failure in initial objective function evaluation. FMINCON cannot continue.
% Extract optimal x, y, and w
optimal_x = optimalVars(1:7);
optimal_y = optimalVars(8:14);
optimal_w = optimalVars(15:end);
% Display results
disp('Optimal x:');
disp(optimal_x);
disp('Optimal y:');
disp(optimal_y);
disp('Optimal w:');
disp(optimal_w);
disp('Objective function value:');
disp(fval);
hold on
scatter(a,b,"blue","filled")
scatter(optimal_x, optimal_y, '*','red');
grid on;
hold off
% Objective function
function f = objective(vars, a, b, reg1, reg2)
x = vars(1:7);
y = vars(8:14);
w = vars(15:end);
f = 0;
for i = 1:a(1:5)
r1=reg1(i);
p(i)=((x(r1)-a(i))^2 + (y(r1)-b(i))^2)-abs(w(r1));
for j=1:a(6:34)
r2 = reg2(j);
q(j)=((x(r2)-a(j))^2 + (y(r2)-b(j))^2)-abs(w(r2));
f = f + p(i)-q(j);
end
end
end
error: Index exceeds the number of array elements. Index must not exceed 7.
Error in grid_weight>objective (line 106)
p(i)=((x(r1)-a(i))^2 + (y(r1)-b(i))^2)-abs(w(r1));
Error in grid_weight>@(vars)objective(vars,a,b,reg1,reg2) (line 71)
objFun = @(vars) objective(vars, a, b, reg1, reg2);
Error in fmincon (line 568)
initVals.f = feval(funfcn{3},X,varargin{:});
Error in grid_weight (line 74)
[optimalVars, fval] = fmincon(objFun, initialVars, [], [], [], [], lb, ub, [], options);

Answers (1)

Cris LaPierre
Cris LaPierre on 27 Feb 2024
You have an indexing issue. Namely, w(r1).
  • r1=reg1(i)
  • reg1(1) = 11
  • w only has 7 elements
reg1=[11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11];
w = [1e-04, 1e-04, 1e-04,1e-04, 1e-04, 1e-04,1e-04]
w = 1×7
1.0e-04 * 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000
r1 = reg1(1)
r1 = 11
w(r1)
Index exceeds the number of array elements. Index must not exceed 7.
You need to adjust your code so that your index does not exceed the length of your vector.
  1 Comment
Cris LaPierre
Cris LaPierre on 27 Feb 2024
Also note that the following line of code is likely not doing what you think it is doing
for i = 1:a(1:5)
The end result will be the same as if you had written for i = 1:a(1)

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!