Find independent variables that minimize function

7 views (last 30 days)
Hey,
I have a mathematical function with around 5 independent variables. I want to find the values of the independent variables for which the function is minimal. All the independent variables have certain boundaries that need to be satisfied.
Up until now I use the Excel plugin "Solver" for this. But my task becomes a bit too complex for Excel, thus I want to switch to Matlab.
This is my function:
st1_l = ((a-real(0.5*(a-(sqrt(a*(a-4*b))))))*(b^2))/((b^2)-(1.22*(0.0004)*c*(1-((-d/(a - b1)) * e)/d))*c*((a - real(0.5*(a-(sqrt(a*(a-4*b))))))+b))
Boundaries are something like this:
318<a<1000
10<b<100
...
The parameters should now be changed within these boundaries, so that st1_l becomes minimal. I already tried fmincon. However, I can't find a way to pass all the parameters and boundaries to fmincon. Just in case it makes clearer what I want to do, here an screenshot from the Excel solver I am using at the moment:
Thank you for any help.
  2 Comments
Mario Malic
Mario Malic on 3 Mar 2020
Edited: Mario Malic on 3 Mar 2020
fmincon(fun,x0,A,b)
Refer to documentation, with ~~variables A and b, you supply inequalities.~~
Edit: I am sorry, I made a silly mistake suggesting you inequalities. Better option is to use bounds as Fabio suggested.
dev3011
dev3011 on 3 Mar 2020
Edited: dev3011 on 3 Mar 2020
Thank you for your help. I tried to follow your suggenstion and the documentation and produced this code (the formula is shortened to only 2 IVs):
fun = @(x) ((x(1)-real(0.5*(x(1)-(sqrt(x(1)*(x(1)-4*x(2)))))))*(x(2)^2))/((x(2)^2)-(1.22*(0.0004)*(1-(10)/(x(1)))));
A = [1,0;-1,0;0,1;0,-1];
b = [1000;-318;100;-10];
I assume that with this I included the boundaries
318<a<1000
10<b<100.
However, this way seems to be overly complicated and also, when I try to introduce more than 2 independent variables by writing
fun = @(x) ((x(1)-real(0.5*(x(1)-(sqrt(x(1)*(x(1)-4*x(2)))))))*(x(2)^2))/((x(2)^2)-(1.22*(wellenl)*(1-(x(3))/(x(1)))));
A = [1,0,0;-1,0,0;0,1,0;0,-1,0];
b = [1000;-318;100;-10];
I get the error "A must have 2 column(s)". Any suggestions on how to use more than 2 IVs? Also, do I really have to use x(1), x(2), etc. or is there a way to use my own variable names in the formula?

Sign in to comment.

Accepted Answer

Fabio Freschi
Fabio Freschi on 3 Mar 2020
If you have only lower and upper bounds, use them directly in fmincon
% your function
fun = @(x) ((x(1)-real(0.5*(x(1)-(sqrt(x(1)*(x(1)-4*x(2)))))))*(x(2)^2))/((x(2)^2)-(1.22*(0.0004)*(1-(x(3))/(x(1)))));
% inequality constraints (none);
A = [];
b = [];
% equality constraints (none)
Aeq = [];
beq = [];
% lower and upper bounds (I assume x(3) unbounded
lb = [318; 10; -Inf];
ub = [1000; 100; Inf];
% inital guess (here: mid point)
x0 = (ub-lb)/2;
% remove Inf
x0(x0 == Inf) = 0;
% run minimization
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
Regarding the name of the variables, if you use an anonymous function you should stick with x(1), x(2), etc. If you write your function in a file, you can rename teh variables inside the function
function f = fun(x)
a = x(1);
b = x(2);
c = x(3);
f = ((a-real(0.5*(a-(sqrt(a*(a-4*b))))))*(b^2))/((b^2)-(1.22*(0.0004)*(1-(c)/(a))));
end
  1 Comment
dev3011
dev3011 on 4 Mar 2020
Awesome, thanks a lot for this extensive answer. It works very well.
While implementing it, however, I found that I oversimplified my problem. I will accept your answer as it solves the question I asked perfectly and extend my question below.

Sign in to comment.

More Answers (1)

dev3011
dev3011 on 4 Mar 2020
Edited: dev3011 on 4 Mar 2020
Fabios answer solves the problem I posted very well. However, I realized that I oversimplified my problem. Actually, some of my boundary conditions are functions rather than independent variables.
Let's assume I have the two following functions:
f = ((a-real(0.5*(a-(sqrt(a*(a-4*b))))))*(b^2))/((b^2)-(1.22*(0.0004)*(1-(c)/(a))));
d = ((a * b)^2)*g % In reality this function is more complicated
and I now want the boundary
10<d<100
to be satisfied. Thus, my boundary must be satisfied for a function that is not directly included in my initial function to be minimized but depends on independent variables of this function.
I guess I could solve every one of these boundary functions for the independent variable and then pass the result to fmincon() as a boundary condition. However, as the boundary functions are quite complex this would not be feasible. Is there any way I can pass a linear boundary function like above to fmincon()?
  1 Comment
Fabio Freschi
Fabio Freschi on 4 Mar 2020
fmincon allows the use of nonlinear constraints
look at the documentation
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

Sign in to comment.

Categories

Find more on Linear Programming and Mixed-Integer Linear Programming in Help Center and File Exchange

Products


Release

R2019b

Community Treasure Hunt

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

Start Hunting!