Skip to content

Commit 8595262

Browse files
author
Marek P
committed
Fix inaccurate roots: different companion matrix
Triggered by #70 Changed construction of companion matrix to a more proven form. Test case 1: r=[1.0e-6;1.0e6]; roots(poly(p)) Test case 2: r=randn(5); e=sort(r)-sort(roots(poly(r))) ..gives generally better results by means of max(abs(e)) after change.
1 parent bda6924 commit 8595262

File tree

1 file changed

+3
-10
lines changed

1 file changed

+3
-10
lines changed

src/Polynomials.jl

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -499,31 +499,24 @@ roots(poly([1,2,3,4])) # [1.0,2.0,3.0,4.0]
499499
function roots{T}(p::Poly{T})
500500
R = promote_type(T, Float64)
501501
length(p) == 0 && return zeros(R, 0)
502-
503502
num_leading_zeros = 0
504503
while abs(p[num_leading_zeros]) <= 2*eps(T)
505504
if num_leading_zeros == length(p)-1
506505
return zeros(R, 0)
507506
end
508507
num_leading_zeros += 1
509508
end
510-
511509
num_trailing_zeros = 0
512510
while abs(p[end - num_trailing_zeros]) <= 2*eps(T)
513511
num_trailing_zeros += 1
514512
end
515-
516513
n = endof(p)-(num_leading_zeros + num_trailing_zeros)
517-
518514
n < 1 && return zeros(R, length(p) - num_trailing_zeros - 1)
519515

520-
companion = zeros(R, n, n)
516+
companion = diagm(ones(R, n-1), -1)
521517
an = p[end-num_trailing_zeros]
522-
for i = 1:n-1
523-
companion[i,n] = -p[num_leading_zeros + i - 1] / an
524-
companion[i+1,i] = 1;
525-
end
526-
companion[end,end] = -p[end-num_trailing_zeros-1] / an
518+
companion[1,:] = -p[(end-num_trailing_zeros-1):-1:num_leading_zeros] / an
519+
527520
D = eigvals(companion)
528521
r = zeros(eltype(D),length(p)-num_trailing_zeros-1)
529522
r[1:n] = D

0 commit comments

Comments
 (0)