How to exit an optimization function without error?
古いコメントを表示
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
回答 (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 件のコメント
Sargondjani
2023 年 11 月 6 日
編集済み: Sargondjani
2023 年 11 月 6 日
Dyuman Joshi
2023 年 11 月 6 日
編集済み: Dyuman Joshi
2023 年 11 月 6 日
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
2023 年 11 月 6 日
Sam Chak
2023 年 11 月 6 日
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
2023 年 11 月 6 日
Sam Chak
2023 年 11 月 6 日
Okay, I got it now. It's a coupled interdependent problem. Need some time to think.
カテゴリ
ヘルプ センター および File Exchange で Solver Outputs and Iterative Display についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!