Implementing a nonlinear constraint with fmincon

Hello, so my problem is implementing the condition such that c1*c4>0, c2*c5>0, and c3*c6>0
And so, when implementing in fmincon it makes sense to write it in a sense of (-1) * ci*cj <= 0
When implemented as this and calling the function handle
function [z, zeq] = nlcon_poly_ogden(c)
z = [-1*c(1)*c(4),-1*c(2)*c(5),-1*c(3)*c(6)];
zeq = [];
end
and calling @nlcon_poly_ogden in the problem declaration
nonlcon_ogden = @nlcon_poly_ogden
ogden_polyconvexity_gs_problem = createOptimProblem('fmincon', 'x0', r, 'objective', ***, ...
'lb',[],'ub',[],'nonlcon', nonlcon_ogden, 'Aeq', [], 'beq', [],'options', options);
run(gs, ogden_polyconvexity_gs_problem); % gs is a default GlobalSearch object
The resulting parameters are not satisfying the bounds.... is there something I am doing wrong?

11 comentarios

Torsten
Torsten el 5 de Oct. de 2022
Editada: Torsten el 5 de Oct. de 2022
And what are the resulting parameters and what are the bounds that are violated ?
And according to what you wrote, it should be
-1*c(2)*c(4)*c(5)
instead of
-1*c(2)*c(5)
@Torsten, you're right, I will fix the typo.... it is just pairs of two. As of now, the code isn't even running. I am getting an error of
Not enough input arguments.
Error in nlcon_poly_ogden (line 3)
z = [-1*c(1)*c(4),-1*c(2)*c(5),-1*c(3)*c(6)]
Torsten
Torsten el 5 de Oct. de 2022
Maybe you work with less than 6 parameters while you address c(1),...,c(6) in nlcon_poly_ogden ?
Reed
Reed el 5 de Oct. de 2022
Editada: Reed el 5 de Oct. de 2022
Here is my full code... the obj function has 6 paramters
ogden_gs_func = @(c) sum((c(1)*(x.^(c(4)-1)-x.^((-1)/2*c(4)-1)) + ...
c(2)*(x.^(c(5)-1)-x.^(-1/2*c(5)-1)) + ...
c(3)*(x.^(c(6)-1)-x.^((-1)/2*c(6)-1))- y).^2);
upperbound = 5;
lowerbound = -5;
r =((lowerbound- upperbound).*rand(6,1)+ upperbound)';
options = optimoptions('fmincon', 'Algorithm','interior-point', 'MaxFunctionEvaluations', 10000, 'MaxIterations', 10000);
gs_constrained = GlobalSearch("StartPointsToRun","bounds-ineqs");
nonlcon_poly_ogden = @nlcon_poly_ogden;
ogden_polyconvexity_gs_problem = createOptimProblem('fmincon', 'x0', r, 'objective', ogden_gs_func, ...
'lb',[],'ub',[],'nonlcon', nlcon_poly_ogden, 'Aeq', [], 'beq', [],'options', options);
[Global, fval, exitflag, output, solutions] = run(gs_constrained, ogden_polyconvexity_gs_problem);
Torsten
Torsten el 5 de Oct. de 2022
Where is r ?
Reed
Reed el 5 de Oct. de 2022
Editada: Reed el 5 de Oct. de 2022
@Torsten, I added it... I apologize, this is a single case of a much larger script so it has been harder than expected to grab all the pieces.
My idea is randomly generating the initial points, thereby, removing any little sensistivy to intial guess Global search may have (i am looping this chunk multiple times)....
Obviously, this generation of r is not always satisfying the bounds but also I set gs to check only relevant points
gs_constrained = GlobalSearch("StartPointsToRun","bounds-ineqs");
x = rand(20,1);
y = rand(20,1);
ogden_gs_func = @(c) sum((c(1)*(x.^(c(4)-1)-x.^((-1)/2*c(4)-1)) + ...
c(2)*(x.^(c(5)-1)-x.^(-1/2*c(5)-1)) + ...
c(3)*(x.^(c(6)-1)-x.^((-1)/2*c(6)-1))- y).^2);
upperbound = 5;
lowerbound = -5;
r =((lowerbound- upperbound).*rand(6,1)+ upperbound)';
options = optimoptions('fmincon', 'Algorithm','interior-point', 'MaxFunctionEvaluations', 10000, 'MaxIterations', 10000);
gs_constrained = GlobalSearch("StartPointsToRun","bounds-ineqs");
nonlcon_poly_ogden = @nlcon_poly_ogden;
ogden_polyconvexity_gs_problem = createOptimProblem('fmincon', 'x0', r, 'objective', ogden_gs_func, ...
'lb',lowerbound*ones(6,1),'ub',upperbound*ones(6,1),'nonlcon', nonlcon_poly_ogden, 'options', options);
[Global, fval, exitflag, output, solutions] = run(gs_constrained, ogden_polyconvexity_gs_problem);
GlobalSearch stopped because it analyzed all the trial points. All 3 local solver runs converged with a positive local solver exit flag.
function [z, zeq] = nlcon_poly_ogden(c)
z = [-1*c(1)*c(4),-1*c(2)*c(5),-1*c(3)*c(6)];
zeq = [];
end
Reed
Reed el 5 de Oct. de 2022
Well, this seems to work now and satisfy the constraint.. not sure why adding the lb/ub in the declaration is important but hey.... Ill take it
I appreciate your help!
Torsten
Torsten el 5 de Oct. de 2022
Editada: Torsten el 5 de Oct. de 2022
They are important because GlobalSearch refers to them ("bounds-ineqs"):
gs_constrained = GlobalSearch("StartPointsToRun","bounds-ineqs");
Reed
Reed el 5 de Oct. de 2022
@Torsten and so if instead i set "StartPointsTOrun" = "all" without the added lb and ub arguments in the problem declaration, then the parameters could take on any number but still satisfying our nonlcon constraint?
Torsten
Torsten el 5 de Oct. de 2022
I don't know of these specific settings - sorry.

Iniciar sesión para comentar.

Respuestas (0)

Categorías

Productos

Versión

R2022a

Preguntada:

el 5 de Oct. de 2022

Comentada:

el 5 de Oct. de 2022

Community Treasure Hunt

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

Start Hunting!

Translated by