15504x5
+
4845x4
+
1140x3
+
190x2
+
20x
+
1
Obviously, there are 20 repeated roots of -1, but proots() returns (approximately) these roots in about
100 seconds:
-1.49339 ± 0.102038i
-0.848193 ± 0.295003i
-1.40133 ± 0.280223i
-0.843498 ± 0.25989i
-1.24788 ± 0.388669i
-0.750275 ± 0.212911i
-1.08333 ± 0.41496i
-0.703918 ± 0.130283i
-0.945259 ± 0.38717i
-0.682926 ± 0.043651i
If we substitute these roots in the original polynomial, we get 20 complex results near zero, but proots()
has returned 10 complex root pairs, instead of the expected 20 real results. In about the same 100
seconds, polyroot() (Laguerre's method) returns the correct roots as a list of twenty 1's. The results
from proots() are disturbed from the correct solutions by round-off error in calculating the eigenvalues
of a 20 x 20 element matrix.
TI offers a flash application, Polynomial Root Finder, (I'll call it TI PRF) which also uses this eigenvalue
method according to its PDF documentation. TI PRF also fails in a rather spectacular fashion with the
20-degree polynomial above, but with different results than proots(). The flash application returns two
real roots of about -1.49821 and -0.869716, and 9 complex conjugate pairs. If these roots are
evaluated in the polynomial, we again get real and complex results that are in the vicinity of zero. The
magnitudes range from about 1E-6 to 2E-10.
The real drawback to these eigenvalue methods is that they give no estimate for the root errors, and no
warning that the roots are wrong. Since we usually do not know in advance what the roots are, we
might be led to believe that the returned roots were correct. The main advantage to polyroot() is that it
attempts to find the roots to meet an error criteria, and, if it cannot, it returns an error message instead
of a wrong solution.
Comments
This procedure can be used to find polynomial roots with a fair degree of success:
1. First, try solve() or csolve() (or zeros() or czeros()) to find the roots. If they work, they will be
faster than polyroot(), and they can find some complex solutions which polyroot() cannot.
2. Check the solutions with the sign test method (proot_t1()), or by creating the original
polynomial with the roots, or just by evaluating y(x) at each root. You can also plot the
polynomial in the vicinity of the roots for additional assurance.
3. If the tests in step 2 fail, try proots() and repeat the tests.
4. If proots() fails, try polyroots().
The limited floating-point resolution can result in an effect called destructive cancellation, the symptom
of which is that the polynomial may not be strictly monotonic (increasing or decreasing) over a very
narrow range of x. For this reason, the sign test is not always conclusive. Plotting f(x) - f(xc), where xc
is a point in the center of the x-range, may help indicate this problem.
Solving polynomials is not trivial, particularly when the polynomial is ill-conditioned, and polynomials
with multiple identical roots are always ill-conditioned. An ill-conditioned polynomial has a large
dynamic range of coefficients, and the coefficient signs alternate. Forman S. Acton (reference below),
has this to say about polynomial-solving systems in general:
6 - 124
Содержание TI-92+
Страница 52: ...Component side of PCB GraphLink I O connector detail 1 41...
Страница 53: ...LCD connector detail PCB switch side 1 42...
Страница 54: ...Key pad sheet contact side Key pad sheet key side 1 43...
Страница 55: ...Key cap detail 1 44...
Страница 57: ...Component side of PCB with shield removed A detail view of the intergrated circuits 1 46...
Страница 59: ...Keypad rubber sheet key cap side Inside front cover showing keycaps in place Detail of a key cap 1 48...
Страница 410: ...void extensionroutine2 void Credit to Bhuvanesh Bhatt 10 4...