필터 지우기
필터 지우기

Optimization with MultiStart with nonlinear constraint on some of the parameters

조회 수: 3 (최근 30일)
Hi
I have an optimization problem where I use MultiStart to regress three unknown model parameters to some experimental data. All the parameters are bounded but only two out of three of these parameters follow a nonlinear constraint which I provide using the following code:
c = @(x) 2 - x(2) * (x(3)/r_nm(1))^3;
ceq = @(x) [];
nonlcon_EMT = @(x) deal(c(x),ceq(x));
where r_nm(1) is a known number (fixed). Note that in the function nonlcon_EMT x(1) is not used in the calculation of c or ceq but it is passed to the function. Then I used the following code to perform the regression:
objFcn = @(x) extinction(lambda,Abs(:,2),T,r_nm(1),0,rho(1),rho_CV(1),eta(1),4/3,x(1),x(2),x(3),[ones(1,5),scaleFact],0,400,1000,0);
ms = MultiStart('FunctionTolerance',1e-3,'XTolerance',1e-2,'StartPointsToRun','bounds-ineqs',...
'MaxTime',600,'UseParallel',true);
problem = createOptimProblem('fmincon','x0',[1e-4,0.3,500].*scaleFact,'objective',objFcn,...
'lb',[1e-6,1e-3,25].*scaleFact,...
'ub',[1,0.5,1000].*scaleFact,...
'nonlcon',nonlcon_EMT);
[x,fval(2),exitflag(2)] = run(ms,problem,10);
When I run the code above with 'StartPointsToRun','bounds' there is no problem. Yet, using 'StartPointsToRun','bounds-ineqs' it gives the following error:
Unable to perform assignment because the left and right sides have a different
number of elements.
I was wondering if someone could help me with this problem. Thank you.

답변 (1개)

Alan Weiss
Alan Weiss 2018년 8월 15일
편집: Alan Weiss 2018년 8월 15일
Try writing a function file to represent your nonlinear constraints:
function [c,ceq] = nonlcon_EMT(x,r_nm)
ceq = [];
c = 2 - x(2) * (x(3)/r_nm(1))^3;
In your script, after defining r_nm in the workspace, set
nlcon = @(x)nonlcon_EMT(x,r_nm);
and, of course, set nlcon as the nonlinear constraint in your problem structure.
Why might this work? The deal function insists on having two outputs, but when you set inequalities as the start points, MultiStart calls the nonlinear constraint for only the inequality, ignoring the equality constraint (it doesn't matter that your equality constraint is null). By ignoring the equality constraint, I believe that deal throws an error.
Alan Weiss
MATLAB mathematical toolbox documentation
  댓글 수: 1
Reza Andalibi
Reza Andalibi 2018년 8월 15일
Dear Alan
Thanks for the answer. I implemented what you suggested but it still gives the following error as before:
Unable to perform assignment because the left and right sides have a different number of elements.
Is it possible that it's because of not having all elements of x, i.e., all but x(1), in the constraints?

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Linear Programming and Mixed-Integer Linear Programming에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by