Borrar filtros
Borrar filtros

Exhaustion method with a condition

1 visualización (últimos 30 días)
Zoe Lin
Zoe Lin el 20 de Mayo de 2018
Editada: Zoe Lin el 22 de Mayo de 2018
Dear :
I have a set of weight number [weight1 weight2 weight3 weight4],I want to use a exhaustion method with a condition find all of them satisfied the condition:
Both of their value are 0:0.01:0.28 condition is 0.5*(weight1^2+weight2^2+weight3^2+weight4^2)==0.125 (or (weight1^2+weight2^2+weight3^2+weight4^2)==0.25 )
Following is my code :
close all clc
%%wieght constraining
cont=0;
weight=zeros(1,4);
for weight1=0:0.01:0.28
for weight2=0:0.01:0.28
for weight3=0:0.01:0.28
for weight4=0:0.01:0.28
check =(weight1^2+weight2^2+weight3^2+weight4^2);
if check == 0.25
cont= cont+1;
weight(cont,:)=[weight1,weight2,weight3,weight4];
end
end
end
end
end
But the value only show : [0.16 0.28 0.28 0.26] [0.25 0.25 0.25 0.25] and [0.28 0.16 0.28 0.26] ,but it should have more value for sure:[0.16 0.26 0.28 0.28] [0.16 0.28 0.26 0.28]......
What's wrong is my code?or could someone help me,maybe I ignored some parts.
Thanks a lot!!
  2 comentarios
John D'Errico
John D'Errico el 20 de Mayo de 2018
Editada: John D'Errico el 20 de Mayo de 2018
NEVER test for exact equality between floating point numbers. Always use a tolerance on something like this.
Double precision numbers use a BINARY mantissa to store the number, but values like 0.01 are not exactly representable in binary.
Zoe Lin
Zoe Lin el 20 de Mayo de 2018
Dear John D'Errico:
Got it,Thx.

Iniciar sesión para comentar.

Respuesta aceptada

Ameer Hamza
Ameer Hamza el 20 de Mayo de 2018
Editada: Ameer Hamza el 20 de Mayo de 2018
As pointed out by @John in the comments, you are getting this error because of finite precision of floating point numbers in the computer systems. A way around this is to compare numbers with tolerance. To do that here is one option, replace
if check == 0.25
with
if ismembertol(check, 0.25, 1e-6)
the third number to ismembertol() is the tolerance value i.e. how much difference from 0.25 on the left side of comparison will be considered equal to 0.25. For your code, this gives following a total of 13 combinations of weights
weight =
0.1600 0.2600 0.2800 0.2800
0.1600 0.2800 0.2600 0.2800
0.1600 0.2800 0.2800 0.2600
0.2500 0.2500 0.2500 0.2500
0.2600 0.1600 0.2800 0.2800
0.2600 0.2800 0.1600 0.2800
0.2600 0.2800 0.2800 0.1600
0.2800 0.1600 0.2600 0.2800
0.2800 0.1600 0.2800 0.2600
0.2800 0.2600 0.1600 0.2800
0.2800 0.2600 0.2800 0.1600
0.2800 0.2800 0.1600 0.2600
0.2800 0.2800 0.2600 0.1600
If you increase the tolerance
if ismembertol(check, 0.25, 1e-3)
then even more elements will satisfy the equality. 1e-3 gives 61 points
weight =
0.1600 0.2600 0.2800 0.2800
0.1600 0.2700 0.2700 0.2800
0.1600 0.2700 0.2800 0.2700
0.1600 0.2800 0.2600 0.2800
0.1600 0.2800 0.2700 0.2700
0.1600 0.2800 0.2800 0.2600
0.1900 0.2500 0.2700 0.2800
0.1900 0.2500 0.2800 0.2700
0.1900 0.2700 0.2500 0.2800
0.1900 0.2700 0.2800 0.2500
0.1900 0.2800 0.2500 0.2700
0.1900 0.2800 0.2700 0.2500
0.2400 0.2500 0.2500 0.2600
0.2400 0.2500 0.2600 0.2500
0.2400 0.2600 0.2500 0.2500
0.2500 0.1900 0.2700 0.2800
0.2500 0.1900 0.2800 0.2700
0.2500 0.2400 0.2500 0.2600
0.2500 0.2400 0.2600 0.2500
0.2500 0.2500 0.2400 0.2600
0.2500 0.2500 0.2500 0.2500
0.2500 0.2500 0.2600 0.2400
0.2500 0.2600 0.2400 0.2500
0.2500 0.2600 0.2500 0.2400
0.2500 0.2700 0.1900 0.2800
0.2500 0.2700 0.2800 0.1900
0.2500 0.2800 0.1900 0.2700
0.2500 0.2800 0.2700 0.1900
0.2600 0.1600 0.2800 0.2800
0.2600 0.2400 0.2500 0.2500
0.2600 0.2500 0.2400 0.2500
0.2600 0.2500 0.2500 0.2400
0.2600 0.2800 0.1600 0.2800
0.2600 0.2800 0.2800 0.1600
0.2700 0.1600 0.2700 0.2800
0.2700 0.1600 0.2800 0.2700
0.2700 0.1900 0.2500 0.2800
0.2700 0.1900 0.2800 0.2500
0.2700 0.2500 0.1900 0.2800
0.2700 0.2500 0.2800 0.1900
0.2700 0.2700 0.1600 0.2800
0.2700 0.2700 0.2800 0.1600
0.2700 0.2800 0.1600 0.2700
0.2700 0.2800 0.1900 0.2500
0.2700 0.2800 0.2500 0.1900
0.2700 0.2800 0.2700 0.1600
0.2800 0.1600 0.2600 0.2800
0.2800 0.1600 0.2700 0.2700
0.2800 0.1600 0.2800 0.2600
0.2800 0.1900 0.2500 0.2700
0.2800 0.1900 0.2700 0.2500
0.2800 0.2500 0.1900 0.2700
0.2800 0.2500 0.2700 0.1900
0.2800 0.2600 0.1600 0.2800
0.2800 0.2600 0.2800 0.1600
0.2800 0.2700 0.1600 0.2700
0.2800 0.2700 0.1900 0.2500
0.2800 0.2700 0.2500 0.1900
0.2800 0.2700 0.2700 0.1600
0.2800 0.2800 0.1600 0.2600
0.2800 0.2800 0.2600 0.1600
So it depends on how much tolerance is acceptable for your problem.
  4 comentarios
Jan
Jan el 20 de Mayo de 2018
Editada: Jan el 20 de Mayo de 2018
Be careful with ismembertol. I think it uses a strange definition of "tolerance":
abs(u-v) <= TOL * max(abs([A(:); B(:)]))
Using the maximum values of all inputs is less intuitive in my opinion. An elementwise application of the tolerance would be smarter:
abs(u-v) <= TOL * max(abs(A), abs(B))
In the case of this thread, this does not matter, because it is a scalar comparison. Then this might be easier:
if abs(check - 0.25) < 0.0001
Zoe Lin
Zoe Lin el 21 de Mayo de 2018
Dear Jan :
Thanks,learned a lot!!

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by