Borrar filtros
Borrar filtros

Nonlinear constraint function with the optimization toolbox

2 visualizaciones (últimos 30 días)
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);

Respuesta aceptada

Gifari Zulkarnaen
Gifari Zulkarnaen el 7 de Feb. de 2020
Editada: Gifari Zulkarnaen el 7 de Feb. de 2020
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

Más respuestas (1)

Karthi Ramachandran
Karthi Ramachandran el 7 de Feb. de 2020
  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 comentarios
Kai Krickmann
Kai Krickmann el 7 de Feb. de 2020
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 el 7 de Feb. de 2020
Editada: Karthi Ramachandran el 7 de Feb. de 2020
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.

Iniciar sesión para comentar.

Categorías

Más información sobre Solver Outputs and Iterative Display en Help Center y File Exchange.

Productos


Versión

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by