# Setting up linear optimization problem

1 view (last 30 days)

Show older comments

Hi,

I have two 100x1 arrays, X and Y. How do I set this linear problem to run using the optimization toolbox solver?

I want to find the minimum postive value of X, call it M, subject to these constraints:

(1) when the value of X is greater than M, a new variable, Z equals 1

(2) when the value of X is less than -M, the new variable Z equals -1

(3) if -M<X<M, then the new variuable Z equals 0.

I want to find the that maximizes the sum of Y*Z.

Any help would be appreciated!

IP

##### 5 Comments

Walter Roberson
on 27 May 2022

### Accepted Answer

Matt J
on 27 May 2022

Edited: Matt J
on 27 May 2022

X=rand(100,1);

Y=rand(100,1);

timeit(@()doOptimization(X,Y))

function doOptimization(X,Y)

fun=@(M)objective(M,X,Y);

Xs=sort(X(:).');

n=numel(X);

Msamps=abs( interp1( Xs, linspace(1,n,2*n-1) ) ); %optimal M must be one of these

Fsamps=arrayfun(fun,Msamps);

Foptimal=max(Fsamps); %optimal objective

Moptimal=min( Msamps(Fsamps==Foptimal) ); %optimal M

end

function fval=objective(M,X,Y)

Z=(abs(X)>=M);

Z(X<-M)=-1;

fval = Y(:).'*Z(:);

end

##### 2 Comments

Matt J
on 28 May 2022

I guess the optimizer can only take simple contraints.

It has nothing to do with the ability to implement constraints. Because your objective is piecewise constant, the above is what an optimizer would have to do anyway.

### More Answers (1)

Torsten
on 27 May 2022

Edited: Torsten
on 27 May 2022

Since your vectors X and Y are of moderate size, don't use an optimization tool.

I think it's best to proceed as follows:

- Extract all positive entries of the X-vector.

2. For each of these x-values, calculate the Z vector and evaluate sum(Z*Y).

3. From the sums obtained, choose the maximum sum. If the maximum sum is only attained once, the

corresponding x-value is the solution. If there are several x-values with the maximum sum, choose the

smallest.

##### 6 Comments

Walter Roberson
on 28 May 2022

I have a vectorized method mentally outlined that (if I have not overlooked something) would take time and memory proportional to numel(X) * numel(unique(abs(X)). It is not clear to me that any algorithm could improve the big-O() time but non-vectorized could probably improve the memory usage.

If there is a more time-efficient method it would probably require dynamic programming. There just might possibly be an approach that is numel(X) * log(numel(unique(abs(X)))

### See Also

### Categories

### Products

### Community Treasure Hunt

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

Start Hunting!