How to exit an optimization function without error?
Show older comments
I am using fsolve at two stages: first it finds the solution for problem A, and this solution is then used to solve problem B.
Sometimes it cannot find a solution for problem A, and then for sure i can not solve problem B, so I want fsolve (for B) to exit whenever problem A returns an exitflag < 1. How do I do this?
So far I only found that you can have the objective return an "inf" but then it will still try to backtrack, and waste time and resources. I would prefer to have something like:
if somecondition
exit fsolve
end
Answers (1)
Hi @Sargondjani
Can use return.
Update: Editted the solution by using the function approach.
%% Solving Stage A Problem first
fun1 = @problem1;
x0 = 1;
[xsol1, fval, exitflag] = fminsearch(fun1, x0)
%% Test if the solution from Stage A is admissible
if exitflag <= 0
warning('Terminated due Stage A problem is infeasible.')
return % stop if condition is satisfied
else
%% Solving Stage B Problem then
fun2 = @(x) problem2(x, xsol1);
x0 = 1;
xsol2 = fsolve(fun2, x0)
end
%% Stage A Problem
function y = problem1(x)
y = - x.^2; % infeasible
% y = 1 - x.*exp(-x.^2); % feasible
end
%% Stage B Problem
function y = problem2(x, xsol) % cost function requires xsol from Stage A
y = x.^2 + 2*x + xsol;
end
7 Comments
Sargondjani
on 6 Nov 2023
Edited: Sargondjani
on 6 Nov 2023
Dyuman Joshi
on 6 Nov 2023
Edited: Dyuman Joshi
on 6 Nov 2023
What is res? How is it defined?
Could you share the rest of your code?
Hi @Sargondjani
I have updated my answer using the function approach, splitting the 2-stage problem into two local functions. I hope this helps. If you find the updated solution helpful, please consider clicking 'Accept' ✔ on the answer and voting 👍 for it. Thanks a bunch!
Sargondjani
on 6 Nov 2023
Sam Chak
on 6 Nov 2023
Hi @Sargondjani
You can solve problem1 outside of problem2 function to obtain x1 and exitflag1.
[x1,~,exitflag1] = fsolve(@(x1)problem1(x1,x2),x1_ini)
Then, from exitflag1, apply the conditional If–Else test
if exitflag <= 0
warning('Terminated due Stage A problem is infeasible.')
return % stop if condition is satisfied
else
%% Solving Stage B Problem then
x1_ini = x1;
[x2,~,exitflag2] = fsolve(@(x2) problem2(x2, x1_ini), x2_ini)
end
Can you try out this approach?
Sargondjani
on 6 Nov 2023
Sam Chak
on 6 Nov 2023
Okay, I got it now. It's a coupled interdependent problem. Need some time to think.
Categories
Find more on Solver Outputs and Iterative Display in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!