4 svar
38 visningar
Ygolopot är nöjd med hjälpen
Ygolopot 155
Postad: 10 okt 15:46

Matlab sum function

Hej, jag har

x = repmat(1/10,  1, 10) som genererar en 1x10 vektor med 1/10 för varje element.

Tar jag sen, y = ones(10,1) som ger en 10x1 vektor med 1or överallt och sen tar

x*y -1 == 0 for jag true

men sum(x) - 1 == 0 blir false. Hur kommer detta sig? Talet från sum(x)-1 blir -1.1102e-16 men det få iaf min fmincon att krascha...

Borde jag undvika att använda sum?

Tack på förhand!

Dr. G Online 7028
Postad: 10 okt 15:54

Det är väl lite farligt att använda == när det handlar om flyttal. Någonstans har du ett avrundningsfel på 1e-16, som gör att det inte blir 0. 

Varför x*y inte får avrundningsfel ver jag inte. 

Ygolopot 155
Postad: 10 okt 16:13

Tack för svar! Okej, har du någon uppfattning om hur det påverkar utfallet av användandet av fmincon om kombinationer man vet summerar till ett visst tal ändå inte gör det i Matlab?

Rolig fråga! MATLAB (och alla andra programmeringsspråk) representerar flyttal i binär form, vilket innebär att man representerar ett decimaltal som inte är ett heltal som en summa av potenser av 2. Detta betyder att MATLAB exakt kan representera t.ex 0.5 (= 2^-1), 0.25, 0.125, osv men inte 0.1. I MATLAB-fallet kommer ett decimaltal att representeras som en 'double' på 64 bitar, där (förenklat) 43 bitar är mantissan. Om du tar num2hex(0.1), vilket ger en uppfattning om hur talet ser ut så får du 3fb999999999999a, medan num2hex(0.125) blir 3fc0000000000000, vilket betyder att MATLAB kommer nära 0.1, men aldrig exakt dit. Ungefär som 1/3 går att representera på ett ungefär med decimaltal medan 1/10 går att representera exakt.

Du gör nog klokt i att ersätta == med nånting i stil med abs(...) < "något pyttelitet tal". Vill man veta vad det pyttelilla talet skall vara får man analysera lite noggrannare.

Ygolopot 155
Postad: 12 okt 11:03

Tack så jättemycket för det utförliga svaret! Jag märker att jag inte har så bra koll på vad som händer "under the hood" men nu förstår jag iaf varför det diffar som det gör :)

Svara Avbryt
Close