Exhaustion method with a condition

Illustration
Zoe Lin - 2023-08-16T12:04:19+00:00
Question: Exhaustion method with a condition

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.  

Expert Answer

Profile picture of Prashant Kumar Prashant Kumar answered . 2025-11-20

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.


Not satisfied with the answer ?? ASK NOW

Get a Free Consultation or a Sample Assignment Review!