how to optimize a sweep for solving inequalities?
Show older comments
Solution of inequalities. For a project I need to solve systems of inequalities. The script below works, however it is very slow, it takes several minutes to resolve. How can I make it more efficient?
% ki < 0 && -kd + ki + 1 > 0 && -15*kd + ki -55 < 0
syms ki kd
i0 = 1
i1 = -1
i2 = -1
eqn1 = ki*i0
eqn2 = (-kd + ki + 1)*i1
eqn3 = (-15*kd + ki -55)*i2
x_min = -100;
x_max = 100;
y_min = -100;
y_max = 100;
% Define o passo de busca para x e y
step = 1;
for ki_ = x_min:step:x_max
for kd_ = y_min:step:y_max
eqn1_subs_ki_kd = subs(eqn1, {ki}, {ki_});
eqn2_subs_ki_kd = subs(eqn2, {ki kd}, {ki_ kd_});
eqn3_subs_ki_kd = subs(eqn3, {ki kd}, {ki_ kd_});
if eqn1_subs_ki_kd > 0 && eqn2_subs_ki_kd > 0 && eqn3_subs_ki_kd > 0
disp("solution found!")
ki_
kd_
end
end
end
Accepted Answer
More Answers (1)
Sulaymon Eshkabilov
on 16 Jan 2023
One of the possible ways to speed up your code is to get rid of display of resuts. Instead storing them, e.g.:
syms ki kd
i0 = 1;
i1 = -1;
i2 = -1;
eqn1 = ki*i0;
eqn2 = (-kd + ki + 1)*i1 ;
eqn3 = (-15*kd + ki -55)*i2;
x_min = -100;
x_max = 100;
y_min = -100;
y_max = 100;
% Define o passo de busca para x e y
step = 1;
ii=1;
for ki_ = x_min:step:x_max
for kd_ = y_min:step:y_max
eqn1_subs_ki_kd = subs(eqn1, {ki}, {ki_});
eqn2_subs_ki_kd = subs(eqn2, {ki kd}, {ki_ kd_});
eqn3_subs_ki_kd = subs(eqn3, {ki kd}, {ki_ kd_});
if eqn1_subs_ki_kd > 0 && eqn2_subs_ki_kd > 0 && eqn3_subs_ki_kd > 0
%disp("solution found!")
KI(ii) = ki_;
KD(ii)=kd_;
ii=ii+1;
end
end
end
1 Comment
Alex Muniz
on 17 Jan 2023
Categories
Find more on Assumptions in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!