binomial theorem and MATLAB

2 Ansichten (letzte 30 Tage)
MaJoBo
MaJoBo am 4 Mai 2017
Bearbeitet: John D'Errico am 4 Mai 2017
Hello,
I habe 3 variables:
x= 0.988:0.0001:1.012;
y= (x-1).^7
y2=x.^7-7*x.^6+21*x.^5-35*x.^4+35*x.^3-21*x.^2+7*x-1;
y2 is the therm (x-1)^2 calculated with the binomial theorem.
So, to my understanding the solution for every x should be the same in y and y2:
But this is my Result:
Would be awesome if someone could explain this odd result to me :)

Akzeptierte Antwort

Steven Lord
Steven Lord am 4 Mai 2017
Cleve Moler, the original author of MATLAB, wrote am article about this (with this specific example) in 1996.
https://www.mathworks.com/company/newsletters/articles/floating-points-ieee-standard-unifies-arithmetic-model.html

Weitere Antworten (1)

John D'Errico
John D'Errico am 4 Mai 2017
Bearbeitet: John D'Errico am 4 Mai 2017
Actually, what you wrote for y2 is NOT (x-1)^2. It is (x-1)^7. 2 and 7 are not the same thing. Well, they look alike in some fonts and the way some people write the numbers. But 2 and 7 are in fact different numbers.
syms x
expand((x-1)^7)
ans =
x^7 - 7*x^6 + 21*x^5 - 35*x^4 + 35*x^3 - 21*x^2 + 7*x - 1
The plot you got is entirely reasonable for what you did, computing the result (x-1)^7 where x is in the interval [1-0.012,1+0.012].
So then x-1 lies in the interval [-0.012,0.012]. And seince:
0.012^7
ans =
3.5832e-14
that plot should be scaled entirely in the range of +/- 5e-14. The fuzziness of the curve is due to floating point trash on the computation, sometimes called massive subtractive cancellation.
  2 Kommentare
MaJoBo
MaJoBo am 4 Mai 2017
I'm sorry. I mean (x-1)^7 of course.. Otherwise this whole thing would not make sense :)
John D'Errico
John D'Errico am 4 Mai 2017
Bearbeitet: John D'Errico am 4 Mai 2017
The plot you generated is quite correct. The difference between the two curves is simply due to massive subtractive cancellation. That does not happen for
(x-1)^7
But it does so when you try to compute things in the expanded form:
x^7 - 7*x^6 + 21*x^5 - 35*x^4 + 35*x^3 - 21*x^2 + 7*x - 1
It is MUCH more accurate to compute things using the form (x-1)^7, because there you subtract off 1 FIRST.
While the two forms are symbolically identical, in floating point arithmetic they are not. Look at the individual terms, for x=1.012.
format long g
x = 1.012;
(x-1)^7
ans =
3.58318080000002e-14
x^7
ans =
1.08708521100641
-7*x^6
ans =
-7.51936410775185
21*x^5
ans =
22.2906050625055
-35*x^4
ans =
-36.71048264576
35*x^3
ans =
36.27518048
-21*x^2
ans =
-21.507024
7*x
ans =
7.084
-1
ans =
-1
Remember that each of those terms has a tiny amount of noise in the least significant bits. But the least significant bits of each of those numbers vary by quite a bit.
eps(35*x^3)
ans =
7.105427357601e-15
eps(-1)
ans =
2.22044604925031e-16
So, when you add up all of those terms, you get noise that will be on the order of 1.e-14. Again, this is the concept of massive subtractive cancellation.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Mathematics finden Sie in Help Center und File Exchange

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by