I want to find the real roots of a polynomial that are 0<=roots<=1, for example:
>> rts=roots([16 -32 116 0 -100])
rts =
0.9050 + 2.6262i
0.9050 - 2.6262i
1.0000 + 0.0000i
-0.8100 + 0.0000i
I should be able to find that rts(3) satisfies these requirements. However,
>> myrt=rts(logical(~imag(rts) & real(rts)>=0 & real(rts)<=1))
myrt =
Empty matrix: 0-by-1
This is because real(rts(3))<=1 yields false, which is a bug so far as I can tell since complex(1,0)<=1 yields true. If I open the variable rts and double click rts(3) (which shows that it really is stored just like complex(1,0)), I can then execute real(rts(3))<=1 and it produces the correct result. What gives?
How do I find that rts(3) is the correct answer when I write a script? I am using MATLAB R2015b.

 採用された回答

James Tursa
James Tursa 2016 年 11 月 21 日
編集済み: James Tursa 2016 年 11 月 21 日

0 投票

R2016b:
>> rts=roots([16 -32 116 0 -100])
rts =
0.904997916303652 + 2.626226923351172i
0.904997916303652 - 2.626226923351172i
1.000000000000000 + 0.000000000000000i
-0.809995832607303 + 0.000000000000000i
>> rts(logical(~imag(rts) & real(rts)>=0 & real(rts)<=1))
ans =
1.000000000000000
>> num2hex(rts(3))
ans =
3feffffffffffffc
>> polyval([16 -32 116 0 -100],rts(3))
ans =
-8.526512829121202e-14
>> polyval([16 -32 116 0 -100],1)
ans =
0
R2011a:
>> rts=roots([16 -32 116 0 -100])
rts =
0.904997916303650 + 2.626226923351169i
0.904997916303650 - 2.626226923351169i
1.000000000000000
-0.809995832607303
>> rts(logical(~imag(rts) & real(rts)>=0 & real(rts)<=1))
ans =
Empty matrix: 0-by-1
>> num2strexact(rts(3))
ans =
1.000000000000000444089209850062616169452667236328125
>> num2hex(rts(3))
ans =
3ff0000000000002
>> polyval([16 -32 116 0 -100],rts(3))
ans =
8.526512829121202e-014
>> polyval([16 -32 116 0 -100],1)
ans =
0
So it looks like the roots function (which uses eig in the background) has different behavior depending on the version. The versions missed being exactly 1.0 by 2-3 least significant bits (one version less than and the other version greater than). You will have to adjust your code to account for this.

2 件のコメント

Bryce Inman
Bryce Inman 2016 年 11 月 22 日
Thank you for the reply! It's frustrating how misleading matlab's 'long' format can be. And I still wonder, why would double clicking on the variable cause the equality to evaluate correctly?
James Tursa
James Tursa 2016 年 11 月 22 日
Not sure what you are saying here. How do you get real(rts(3))<=1 to evaluate as true? You double clicked on rts in the Workspace list and then that brings up the Variable Editor. Then what did you do?

サインインしてコメントする。

その他の回答 (1 件)

Walter Roberson
Walter Roberson 2016 年 11 月 21 日

1 投票

You will find that real(rts(3))-1 is not 0.
When I test on my Mac, in R2015b, rts(3) is 1+2*eps but in R2016b, rts(3) is 1-2*eps

1 件のコメント

Bryce Inman
Bryce Inman 2016 年 11 月 22 日
Good point, I should have subtracted 1 to see the error.

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeMATLAB についてさらに検索

製品

質問済み:

2016 年 11 月 21 日

コメント済み:

2016 年 11 月 22 日

Community Treasure Hunt

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

Start Hunting!

Translated by