fmincon implementing nonlinear constraints

I am trying to fit my objective function (ogden_funct) to the following constraints and am running into errors.
For constraint 1) I get an error of 'Error using fmincon
Supplied objective function must return a scalar value'
For constraint 2) I am not sure where/how to implement this.
My ideal solution will implement constraint 1) and 2)
Any ideas help.
%objective
ogden_funct = @(c) c(1)*(xdata.^(c(4)-1)-xdata.^((-1)/2*c(4)-1)) + ...
c(2)*(xdata.^(c(5)-1)-xdata.^(-1/2*c(5)-1)) + ...
c(3)*(xdata.^(c(6)-1)-xdata.^((-1)/2*c(6)-1))- ydata;
% Constraint 1)
c(1)*c(4) + c(2)*c(5) + c(3)*c(6) = 2;
% my attempt, writing a function nlcon(c) in a new file
function [z, zeq] = nlcon(c)
z = 2 - (c(1)*c(4) + c(2)*c(5) + c(3)*c(6));
zeq = [];
end
% then calling fmincon
x = fmincon(ogden_funct, Initial_Guess,A,b,Aeq,beq,[],[],nonlincon); % Where Initial_Guess...[] in this case dont matter
% Constraint 2)
c(1)*c(4)>0; c(2)*c(5)>0; c(3)*c(6)>0; % no ideas on how to implement this

5 个评论

Objective for fmincon must be
ogden_funct = @(c) sum(c(1)*(xdata.^(c(4)-1)-xdata.^((-1)/2*c(4)-1)) + ...
c(2)*(xdata.^(c(5)-1)-xdata.^(-1/2*c(5)-1)) + ...
c(3)*(xdata.^(c(6)-1)-xdata.^((-1)/2*c(6)-1))- ydata).^2;
Constraints are
function [z, zeq] = nonlincon(c)
zeq = 2 - (c(1)*c(4) + c(2)*c(5) + c(3)*c(6));
z = [-c(1)*c(4),-c(2)*c(5),-c(3)*c(6)];
end
c(1)*c(4)>0; c(2)*c(5)>0; c(3)*c(6)>0 is hard to archieve - try >=0 instead.
c(1)*c(4)>0
You are probably not going to be able to achieve that with fmincon(). It creates discontinuous regions, c1 and c4 both positive or c1 and c4 both negative. fmincon() cannot support discontinuous regions like that.
Okay, I really appreciate that. Could you describe to me, in the function script, what the z = [.....] is achieving? I really appreciate your answer @Torsten
Objective for fmincon must be ogden_funct = @(c) sum(c(1)*(xdata.^(c(4)-1)....).^2;
mean() would be better:
ogden_funct = @(c) mean(c(1)*(xdata.^(c(4)-1)-xdata.^((-1)/2*c(4)-1)) + ...
c(2)*(xdata.^(c(5)-1)-xdata.^(-1/2*c(5)-1)) + ...
c(3)*(xdata.^(c(6)-1)-xdata.^((-1)/2*c(6)-1))- ydata).^2;
That way, your optimoptions needn't depend so much on the size of xdata.
Could you describe to me, in the function script, what the z = [.....] is achieving?
It's an attempt to implement your constraints
-c(1)*c(4) <= 0
-c(2)*c(5) <= 0
-c(3)*c(6) <= 0

请先登录,再进行评论。

回答(0 个)

类别

帮助中心File Exchange 中查找有关 Nonlinear Optimization 的更多信息

产品

版本

R2022a

提问:

2022-7-5

编辑:

2022-7-6

Community Treasure Hunt

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

Start Hunting!

Translated by