필터 지우기
필터 지우기

Nonlinear constraint function with the optimization toolbox

조회 수: 3 (최근 30일)
Kai Krickmann
Kai Krickmann 2020년 2월 7일
편집: Kai Krickmann 2020년 12월 4일
First of all thank you for your time!
My goal is to set up a nonlinear constraint related to fluid dynamics. This is about a hydrostatic model, which should be in balance. I would like to calculate all pressures and flows with the help of some measured values. Since the resistance depends on the flow velocity and the pressure, in my opinion the resistances would have to be recalculated after each iteration step.
For this reason, I had to include the calculation of the resistance in the nonlinear function "nonlcon", but the function apparently cannot access the variables in the workspace.
Does anyone have an approach on how to solve this problem?
Error message:
Not enough input arguments.
Error in Main>nonlcon (line 224)
for i = 1 : anzahlpipes * 2
Error in Main (line 217)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);

채택된 답변

Gifari Zulkarnaen
Gifari Zulkarnaen 2020년 2월 7일
편집: Gifari Zulkarnaen 2020년 2월 7일
Seems you have extra parameters beside the optimization input variables.
See these explanation:
I personally like to define those extra parameters as global variables because of the convenience, although others say global variables is somehow troublesome.
For your case, try this (global method):
%% In main script:
global anzahlpipes anzahlnodes pipesmatlaberweitert inzierweitert xgv
% ...
% your main code
% ...
%% In constraint function
function [c,ceq] = nonlcon(x)
global anzahlpipes anzahlnodes pipesmatlaberweitert inzierweitert xgv
% ...
% your constraint function code
% ...
end

추가 답변 (1개)

Karthi Ramachandran
Karthi Ramachandran 2020년 2월 7일
  1. Is your function "nonlcon" or "unitdisk" , unit disk has no option to call "anzahlpipes"
  2. if your nonlcon is a function of 'x' and the others are constants('glgew' and 'xgv') calculated, then supply as '@(x) nonlcon(x,....)'
  3. The constarint looks like a linear constarint of the form Ax+b . Check it
  댓글 수: 2
Kai Krickmann
Kai Krickmann 2020년 2월 7일
Thank you for your answer!
I thought since the resistance changes with each iteration it has to be non-linear. How could I put the recalculation of the resistance in a linear constraint?
Karthi Ramachandran
Karthi Ramachandran 2020년 2월 7일
편집: Karthi Ramachandran 2020년 2월 7일
If your constriant is of the form Ax=b use "Aeq and beq" option for constarint, instead of nonlinear constarint
for a constarint of this form 2x(1)+x(2)=1 Aeq = [1 2] and beq = 1;
In your case Aeq = glgew and beq = -xgv; if I have understood it right . Pls check your function and pass the parameters correctly . It should work.
Also pls check if it is really necesaru to calvulate the constants inside the function file.

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

카테고리

Help CenterFile Exchange에서 Solver Outputs and Iterative Display에 대해 자세히 알아보기

제품


릴리스

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by