Function optimization meeting conditions
古いコメントを表示
How can i optimize the I function, i want to find the values of h(j) that minimize I, meetentig the conditions h(j+1)>h(j), h(end)<120 and h(j+1)-h(j)<1.25 ?
ht is a array beiing its size ht(lt,lc) or the same ht(i,j) and it is calculated in another function. The formula of Ins is Ins=ht(i,j)-h(j).
Thanks for the help
function [h] = hp(ht, Lc, Lt)
lt = 0:0.5:Lt;
lc = 0:0.5:Lc;
Ins = cell(length(lt), length(lc));
h= cell(length(Lc));
for i = 1:length(lt)
for j = 1:length(lc)
Ins{i,j} = @(h) (ht(i,j) - h);
end
end
h0 = zeros(size(lc));
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
nonlcon = @constraints;
h = fmincon(@(h) Ins, h0, A, b, Aeq, beq, lb, ub, nonlcon);
end
function [c] = constraints(h)
c>0;
c = h(2:end) - h(1:end-1);
end
10 件のコメント
Torsten
2023 年 6 月 7 日
Ins is a matrix of size (length(lt), length(lc)). If I assume that with "minimize I" you mean "minimize Ins", what do you mean with "minimizing a matrix" ?
Jon Bilbao
2023 年 6 月 7 日
"Ins" must be a single number, not a vector or matrix of values because you cannot minimize vector-valued functions.
But your problem formulation seems to be bad. Note that the matrix elements of "Ins" can become arbitrarily small:
If M > 0 is a very big number, use
h(1) = M
h(2) = M+1
...
h(length(lt)) = M + length(lt)
Jon Bilbao
2023 年 6 月 7 日
Don't you have to add the additional constraints ht(i,j) - h(i) >= 0 for all i and j ? Think about it.
I gave you a solution that can make all matrix elements of ht(i,j) - h(i) arbitrarily small (if these expressions are allowed to become negative).
Maybe your problem can be written as
min: max_i,j (ht(i,j)-h(i)))
s.c.
ht(i,j) - h(i) >= 0 for all i,j
h(1) <= h(2) <= ... <= h(end)
?
Jon Bilbao
2023 年 6 月 8 日
If you mean that your problem turns into
min sum_i,j (ht(i,j)-h(i))
s.c.
h(1) <= h(2) <= ... <= h(end)
then - as shown above - you can construct solutions for h with arbitrary small value for the objective function. Thus the problem is unbounded.
Try to state your problem properly in its mathematical form.
Jon Bilbao
2023 年 6 月 8 日
If ht is nxm, the linear constraints can be defined by A and b as in the code below.
A and b are then used in the call to the optimizer, e.g.
Now it's your turn to define the objective function and the call to "fmincon" (or some similar optimizer).
(And incidentally the .^2 appears for the summands in the objective :-) )
m = 4;
v1 = ones(m,1);
w1 = -ones(m-1,1);
A1 = diag(v1) + diag(w1,1)
b1 = [zeros(m-1,1);120];
v2 = -ones(m,1);
w2 = ones(m-1,1);
A2 = diag(v2) + diag(w2,1);
A2(end,:) = []
b2 = 1.25*ones(m-1,1);
A = [A1;A2]
b = [b1;b2]
Jon Bilbao
2023 年 6 月 8 日
採用された回答
その他の回答 (1 件)
rakshit gupta
2023 年 6 月 7 日
You can consider following changes to the code to optimize the function while meeting the condition h(j+1)>h(j).
- Modify the Ins cell array to a function handle that takes in the h array.
Ins = @(h) ht - h;
2. Modify the h array to a vector instead of a cell array.
h = zeros(size(lc));
3. Add the upper bound constraint to ensure h(j+1) > h(j).
ub = inf(size(h));
ub(end) = h(end);
4. Modify the constraints function to return the inequality constraint.
function [c, ceq] = constraints(h)
c = h(2:end) - h(1:end-1);
ceq = [];
end
5. Call the fmincon function with the changes made above.
h = fmincon(Ins, h, A, b, Aeq, beq, lb, ub, @constraints);
These changes could help in optimizing the function.
6 件のコメント
Jon Bilbao
2023 年 6 月 7 日
rakshit gupta
2023 年 6 月 8 日
編集済み: rakshit gupta
2023 年 6 月 8 日
The error indicates the objective function 'Ins' should output a scalar value that can be used with 'fmincon'.
You can modify the objective function Ins to resolve this issue by
Ins = @(h) sum((ht - h).^2);
Hope this helps!!
Jon Bilbao
2023 年 6 月 8 日
Jon Bilbao
2023 年 6 月 8 日
rakshit gupta
2023 年 6 月 8 日
Yes, you can try modifying 'h' vector by changing the creation of the 'h' vector to use the same size and data type as 'ht',
h = zeros(size(ht), 'like', ht);
This may help in making Ins scalar.
Jon Bilbao
2023 年 6 月 8 日
カテゴリ
ヘルプ センター および File Exchange で Surrogate Optimization についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!