- r1=reg1(i)
- reg1(1) = 11
- w only has 7 elements
Facing error in the optimization part. Kindly suggest solution
1 view (last 30 days)
Show older comments
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)])
% 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);
disp(ub);
% 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);
% 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);
0 Comments
Answers (1)
Cris LaPierre
on 27 Feb 2024
You have an indexing issue. Namely, w(r1).
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]
r1 = reg1(1)
w(r1)
You need to adjust your code so that your index does not exceed the length of your vector.
1 Comment
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)
See Also
Categories
Find more on Get Started with Optimization Toolbox 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!