binomial theorem and MATLAB

조회 수: 2 (최근 30일)
MaJoBo
MaJoBo 2017년 5월 4일
편집: John D'Errico 2017년 5월 4일
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 :)

채택된 답변

Steven Lord
Steven Lord 2017년 5월 4일
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
  댓글 수: 1
MaJoBo
MaJoBo 2017년 5월 4일
Thank you very much!

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

John D'Errico
John D'Errico 2017년 5월 4일
편집: John D'Errico 2017년 5월 4일
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
MaJoBo
MaJoBo 2017년 5월 4일
I'm sorry. I mean (x-1)^7 of course.. Otherwise this whole thing would not make sense :)
John D'Errico
John D'Errico 2017년 5월 4일
편집: John D'Errico 2017년 5월 4일
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.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Mathematics에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by