Function optimization meeting conditions
    7 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Jon Bilbao
 el 7 de Jun. de 2023
  
    
    
    
    
    Comentada: Jon Bilbao
 el 8 de Jun. de 2023
            How can i optimize the I function, i want to find the values of h(j) that minimize I, meetentig the conditions h(j+1)>h(j), h(end)<120 and         h(j+1)-h(j)<1.25 ?
ht is a array beiing its size ht(lt,lc) or the same ht(i,j) and it is calculated in another function. The formula of Ins is Ins=ht(i,j)-h(j).
Thanks for the help
function [h] = hp(ht, Lc, Lt)
lt = 0:0.5:Lt;
lc = 0:0.5:Lc;
Ins = cell(length(lt), length(lc));
h= cell(length(Lc));
for i = 1:length(lt)
    for j = 1:length(lc)
        Ins{i,j} = @(h) (ht(i,j) - h);
    end
end
h0 = zeros(size(lc)); 
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
nonlcon = @constraints;
h = fmincon(@(h) Ins, h0, A, b, Aeq, beq, lb, ub, nonlcon);
end
function [c] = constraints(h)
    c>0;
    c = h(2:end) - h(1:end-1); 
   end
10 comentarios
  Torsten
      
      
 el 8 de Jun. de 2023
				
      Editada: Torsten
      
      
 el 8 de Jun. de 2023
  
			If ht is nxm, the linear constraints can be defined by A and b as in the code below.
A and b are then used in the call to the optimizer, e.g.
Now it's your turn to define the objective function and the call to "fmincon" (or some similar optimizer).
(And incidentally the .^2 appears for the summands in the objective :-) )
m = 4;
v1 = ones(m,1);
w1 = -ones(m-1,1);
A1 = diag(v1) + diag(w1,1)
b1 = [zeros(m-1,1);120];
v2 = -ones(m,1);
w2 = ones(m-1,1);
A2 = diag(v2) + diag(w2,1);
A2(end,:) = []
b2 = 1.25*ones(m-1,1);
A = [A1;A2]
b = [b1;b2]
Respuesta aceptada
  Torsten
      
      
 el 8 de Jun. de 2023
        
      Movida: Torsten
      
      
 el 8 de Jun. de 2023
  
      ht = rand(401,51);
[n,m]=size(ht);
I=@(h) sum(sum((ht-h).^2));
h0 = zeros(1,m);
v1 = ones(m,1);
w1 = -ones(m-1,1);
A1 = diag(v1) + diag(w1,1);
b1 = [zeros(m-1,1);120];
v2 = -ones(m,1);
w2 = ones(m-1,1);
A2 = diag(v2) + diag(w2,1);
A2(end,:) = [];
b2 = 1.25*ones(m-1,1);
A = [A1;A2];
b = [b1;b2];
[h,fval,exitflag] = fmincon(I,h0,A,b)
Más respuestas (1)
  rakshit gupta
      
 el 7 de Jun. de 2023
        You can consider following changes to the code to optimize the function while meeting the condition h(j+1)>h(j).
- Modify the Ins cell array to a function handle that takes in the h array.
Ins = @(h) ht - h;
         2. Modify the h array to a vector instead of a cell array.
h = zeros(size(lc));
         3. Add the upper bound constraint to ensure h(j+1) > h(j).
ub = inf(size(h));
ub(end) = h(end);
         4. Modify the constraints function to return the inequality constraint.
function [c, ceq] = constraints(h)
    c = h(2:end) - h(1:end-1);
    ceq = [];
end
         5. Call the fmincon function with the changes made above.
h = fmincon(Ins, h, A, b, Aeq, beq, lb, ub, @constraints);
These changes could help in optimizing the function.
6 comentarios
  rakshit gupta
      
 el 8 de Jun. de 2023
				Yes, you can try modifying 'h' vector by changing the creation of the 'h' vector to use the same size and data type as 'ht', 
h = zeros(size(ht), 'like', ht);
This may help in making Ins scalar. 
Ver también
Categorías
				Más información sobre Surrogate Optimization en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


