diff --git a/.travis.yml b/.travis.yml index ba05db29..68daee2b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,6 @@ os: - osx - linux julia: - - 0.4 - 0.5 - 0.6 - nightly diff --git a/README.md b/README.md index 3861f2a1..3700b0cc 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -[![Roots](http://pkg.julialang.org/badges/Roots_0.4.svg)](http://pkg.julialang.org/?pkg=Roots&ver=0.4) -[![Roots](http://pkg.julialang.org/badges/Roots_0.5.svg)](http://pkg.julialang.org/?pkg=Roots&ver=0.5) +[![Roots](http://pkg.julialang.org/badges/Roots_0.5.svg)](http://pkg.julialang.org/?pkg=Roots&ver=0.5) +[![Roots](http://pkg.julialang.org/badges/Roots_0.6.svg)](http://pkg.julialang.org/?pkg=Roots&ver=0.6) Linux: [![Build Status](https://travis-ci.org/JuliaMath/Roots.jl.svg?branch=master)](https://travis-ci.org/JuliaMath/Roots.jl) -Windows: [![Build status](https://ci.appveyor.com/api/projects/status/goteuptn5kypafyl?svg=true)](https://ci.appveyor.com/project/ChrisRackauckas/roots-jl) +Windows: [![Build status](https://ci.appveyor.com/api/projects/status/goteuptn5kypafyl?svg=true)](https://ci.appveyor.com/project/jverzani/roots-jl) # Root finding functions for Julia @@ -34,36 +34,10 @@ algorithm based on its argument(s): * `fzeros(f, a::Real, b::Real; no_pts::Int=200)` will split the interval `[a,b]` into many subintervals and search for zeros in each using a bracketing method if possible. This naive algorithm - will miss double zeros that lie within the same subinterval. + may miss double zeros that lie within the same subinterval and zeros + where there is no crossing of the x-axis. -For polynomials either of class `Poly` (from the `Polynomials` -package) or from functions which are of polynomial type there are -specializations: - -* The `roots` function will dispatch to the `roots` function of the - `Polynomials` package to return all roots (including - complex ones) of the polynomial. - - -* `fzeros(f::Function)` calls `real_roots` to find the real roots of - the polynomial. For polynomials with integer coefficients, the - rational roots are found first, and then numeric approximations to - the remaining real roots are returned. - -* For polynomial functions over the integers or rational numbers, the -`factor` function will return a dictionary of factors (as -`Polynomials`) and their multiplicities. - -* For polynomials over the real numbers, the `multroot` function will - return the roots and their multiplicities through a dictionary. The - `roots` function from the `Polynomials` package will find all the - roots of a polynomial. Its performance degrades when the polynomial - has high multiplicities. The `multroot` function is provided to - handle this case a bit better. The function follows algorithms due - to Zeng, - ["Computing multiple roots of inexact polynomials", Math. Comp. 74 (2005), 869-903](http://www.ams.org/journals/mcom/2005-74-250/S0025-5718-04-01692-8/home.html). - @@ -108,53 +82,6 @@ fzero(x^5 - x - 1, 1.0) -All real roots of a polynomial can be found at once: - -``` -f(x) = x^5 - x - 1 -fzeros(f) -``` - -Or using an explicit polynomial: - -``` -using Polynomials -x = poly([0]) -fzeros(x^5 -x - 1) -fzeros(x*(x-1)*(x-2)*(x^2 + x + 1)) -``` - -The `factor` command will factor a polynomial or polynomial function with integer or rational -coefficients over the integers: - -``` -factor(x -> (2x-1)^2 * (4x-3)^5) # Dict(Poly(1) => 1, Poly(-1 + 2x) =>2, Poly(-3 + 4x) => 5) -``` - - -Polynomial root finding using `multroot` is a bit better when multiple roots are present. - -``` -x = poly([0.0]) -p = (x-1)^2 * (x-3) -U = multroot(p) -collect(keys(U)) # compare to roots(p) -``` - -Again, a polynomial function may be passed in - -``` -f(x) = (x-1)*(x-2)^2*(x-3)^3 -multroot(f) -``` - -The `factor` function will factor polynomials with rational and integer coefficients over the integers: - -``` -factor(f) -``` - - The well-known methods can be used with or without supplied derivatives. If not specified, the `ForwardDiff` package is used for automatic differentiation. @@ -189,3 +116,9 @@ fzero(D(m), 0, 1) - median(as) # 0.0 ``` Some additional documentation can be read [here](http://nbviewer.ipython.org/url/github.com/JuliaLang/Roots.jl/blob/master/doc/roots.ipynb?create=1). + + +## Polynomials + +Special methods for finding roots of polynomials have been moved to +the `PolynomialZeros` package and its `polyroots(f, domain)` function. diff --git a/REQUIRE b/REQUIRE index afcbd891..aa9d594c 100644 --- a/REQUIRE +++ b/REQUIRE @@ -1,5 +1,3 @@ -julia 0.4 +julia 0.5 ForwardDiff 0.2.0 -Polynomials 0.0.5 -PolynomialFactors 0.0.3 Compat 0.17.0 diff --git a/appveyor.yml b/appveyor.yml index 38fd1fd0..d36d1a1b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,7 +1,5 @@ environment: matrix: - - JULIA_URL: "https://julialang-s3.julialang.org/bin/winnt/x86/0.4/julia-0.4-latest-win32.exe" - - JULIA_URL: "https://julialang-s3.julialang.org/bin/winnt/x64/0.4/julia-0.4-latest-win64.exe" - JULIA_URL: "https://julialang-s3.julialang.org/bin/winnt/x86/0.5/julia-0.5-latest-win32.exe" - JULIA_URL: "https://julialang-s3.julialang.org/bin/winnt/x64/0.5/julia-0.5-latest-win64.exe" - JULIA_URL: "https://julialang-s3.julialang.org/bin/winnt/x86/0.6/julia-0.6-latest-win32.exe" diff --git a/doc/roots.ipynb b/doc/roots.ipynb index 2c53fc23..74f519fc 100644 --- a/doc/roots.ipynb +++ b/doc/roots.ipynb @@ -8,33 +8,35 @@ {"cell_type":"markdown","source":"

For a function $f: R \\rightarrow R$ a bracket is a pair $ a < b $ for which $f(a) \\cdot f(b) < 0$. That is they have different signs. If $f$ is a continuous function this ensures there to be a zero (a $c$ with $f(c) = 0$) in the interval $[a,b]$, otherwise, if $f$ is only piecewise continuous, there must be a point $c$ in $[a,b]$ with the left limit and right limit at $c$ having different signs (or $0$). Such values can be found, up to floating point roundoff.

","metadata":{}}, {"cell_type":"markdown","source":"

That is, given f(a) * f(b) < 0, a value c with a < c < b can be found where either f(c) == 0.0 or at least f(prevfloat(c)) * f(nextfloat(c)) <= 0.

","metadata":{}}, {"cell_type":"markdown","source":"

To illustrate, consider the function $f(x) = \\cos(x) - x$. From the graph we see readily that $[0,1]$ is a bracket (which we emphasize with an overlay):

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":"Plot(...)","image/png":"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"},"metadata":{"image/png":{"height":480,"width":600}},"execution_count":null}],"cell_type":"code","source":["f(x) = cos(x) - x\nplot(f, -2, 2)\nplot!([0,1], [0,0], linewidth=2)"],"metadata":{},"execution_count":null}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":"Plot(...)","image/png":"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"},"metadata":{"image/png":{"height":480,"width":600}},"execution_count":null}],"cell_type":"code","source":["f(x) = cos(x) - x\nplot(f, -2, 2)\nplot!([0,1], [0,0], linewidth=2)"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

The basic function call specifies a bracket using either two values or vector notation:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(0.7390851332151607,0.0)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["x = fzero(f, 0, 1) # also fzero(f, [0, 1])\nx, f(x)"],"metadata":{},"execution_count":null}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(0.7390851332151607, 0.0)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["x = fzero(f, 0, 1) # also fzero(f, [0, 1])\nx, f(x)"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

For this function we see that f(x) == 0.0.

","metadata":{}}, {"cell_type":"markdown","source":"
","metadata":{}}, {"cell_type":"markdown","source":"

Next consider $f(x) = \\sin(x)$. A known root is $\\pi$. Trignometry tells us that $[\\pi/2, 3\\pi/2]$ will be a bracket:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(3.1415926535897936,-3.216245299353273e-16)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["f(x) = sin(x)\nx = fzero(f, pi/2, 3pi/2)\nx, f(x)"],"metadata":{},"execution_count":null}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(3.1415926535897936, -3.216245299353273e-16)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["f(x) = sin(x)\nx = fzero(f, pi/2, 3pi/2)\nx, f(x)"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

This value of x does not produce f(x) == 0.0, however, it is as close as can be:

","metadata":{}}, {"outputs":[{"output_type":"execute_result","data":{"text/plain":["true"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["f(prevfloat(x)) * f(x) < 0.0 || f(x) * f(nextfloat(x)) < 0.0"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

That is, at x the function is changing sign.

","metadata":{}}, {"cell_type":"markdown","source":"

The algorithm identifies discontinuities, not just zeros:

","metadata":{}}, {"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.0"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["fzero(x -> 1/x, -1, 1)"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

The basic algorithm used for bracketing when the values are simple floating point values is the bisection method. For big float values, an algorithm due to Alefeld, Potra, and Shi is used.

","metadata":{}}, +{"cell_type":"markdown","source":"

The endpoints can even be infinite:

","metadata":{}}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.0"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["fzero(x -> Inf*sign(x), -Inf, Inf) # Float64 only"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

Using an initial guess

","metadata":{"internals":{"slide_type":"subslide","slide_helper":"subslide_end"},"slideshow":{"slide_type":"slide"},"slide_helper":"slide_end"}}, {"cell_type":"markdown","source":"

Bracketing methods have guaranteed convergence, but in general require many more function calls than are needed to produce an answer. If a good initial guess is known, then the fzero function provides an interface to some different iterative algorithms that are more efficient. Unlike bracketing methods, these algorithms may not converge to the desired root if the initial guess is not well chosen.

","metadata":{}}, -{"cell_type":"markdown","source":"

The basic algorithm is modeled after an algorithm used for HP-34 calculators. This algorithm is more forgiving of the quality of the initial guess. In many cases it satisfies the criteria for a bracketing solution, as it will use bracketing if within the algorithm a bracket is identified.

","metadata":{}}, +{"cell_type":"markdown","source":"

The default algorithm is modeled after an algorithm used for HP-34 calculators. This algorithm is designed to be more forgiving of the quality of the initial guess at the cost of possible performing many more steps. In many cases it satisfies the criteria for a bracketing solution, as it will use bracketing if within the algorithm a bracket is identified.

","metadata":{}}, {"cell_type":"markdown","source":"

For example, the answer to our initial problem is near 1. Given this, we can find the zero with:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(0.7390851332151607,0.0)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["f(x) = cos(x) - x\nx = fzero(f , 1)\nx, f(x)"],"metadata":{},"execution_count":null}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(0.7390851332151607, 0.0)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["f(x) = cos(x) - x\nx = fzero(f , 1)\nx, f(x)"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

For the polynomial $f(x) = x^3 - 2x - 5$, an initial guess of 2 seems reasonable:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(2.0945514815423265,-8.881784197001252e-16,-1.0)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["f(x) = x^3 - 2x - 5\nx = fzero(f, 2)\nx, f(x), sign(f(prevfloat(x)) * f(nextfloat(x)))"],"metadata":{},"execution_count":null}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(2.0945514815423265, -8.881784197001252e-16, -1.0)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["f(x) = x^3 - 2x - 5\nx = fzero(f, 2)\nx, f(x), sign(f(prevfloat(x)) * f(nextfloat(x)))"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

For even more precision, BigFloat numbers can be used

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(3.141592653589793238462643383279502884197169399375105820974944592307816406286198,1.972309137312023369855102830054238943383094976713489605219464891919076210489297e+01,0.000000000000000000000000000000000000000000000000000000000000000000000000000000)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["x = fzero(sin, big(3))\nx, f(x), x - pi"],"metadata":{},"execution_count":null}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(3.141592653589793238462643383279502884197169399375105820974944592307816406286198, 1.096917440979352076742130626395698021050758236508687951179005716992142688513354e-77, 0.000000000000000000000000000000000000000000000000000000000000000000000000000000)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["x = fzero(sin, big(3))\nx, sin(x), x - pi"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

Higher order methods

","metadata":{"internals":{"slide_type":"subslide"},"slideshow":{"slide_type":"subslide"},"slide_helper":"slide_end"}}, -{"cell_type":"markdown","source":"

The default call to fzero uses a first order method and then possibly bracketing, which involves potentially many more function calls. Though specifying a initial value is more convenient than a bracket, there may be times where a more efficient algorithm is sough. For such, a higher-order method might be better suited. There are algorithms of order 1 (secant method), 2 (Steffensen), 5, 8, and 16. The order 2 method is generally more efficient, but is more sensitive to the initial guess than, say, the order 8 method. These algorithms are accessed by specifying a value for the order argument:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(0.3517337112491958,-1.1102230246251565e-16)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["f(x) = 2x - exp(-x)\nx = fzero(f, 1, order=2)\nx, f(x)"],"metadata":{},"execution_count":null}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(-3.0,0.0)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["f(x) = (x + 3) * (x - 1)^2\nx = fzero(f, -2, order=5)\nx, f(x)"],"metadata":{},"execution_count":null}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(1.0000000027152591,2.949052856287529e-17)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["x = fzero(f, 2, order=8)\nx, f(x)"],"metadata":{},"execution_count":null}, +{"cell_type":"markdown","source":"

The default call to fzero uses a first order method and then possibly bracketing, which involves potentially many more function calls. Though specifying a initial value is more convenient than a bracket, there may be times where a more efficient algorithm is sought. For such, a higher-order method might be better suited. There are algorithms of order 1 (secant method), 2 (Steffensen), 5, 8, and 16. The order 2 method is generally more efficient, but is more sensitive to the initial guess than, say, the order 8 method. These algorithms are accessed by specifying a value for the order argument:

","metadata":{}}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(0.3517337112491958, -1.1102230246251565e-16)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["f(x) = 2x - exp(-x)\nx = fzero(f, 1, order=2)\nx, f(x)"],"metadata":{},"execution_count":null}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(-3.0, 0.0)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["f(x) = (x + 3) * (x - 1)^2\nx = fzero(f, -2, order=5)\nx, f(x)"],"metadata":{},"execution_count":null}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(1.0000000027152591, 2.949052856287529e-17)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["x = fzero(f, 2, order=8)\nx, f(x)"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

The latter shows that zeros need not be simple zeros (i.e. $f'(x) = 0$, if defined) to be found.

","metadata":{}}, {"cell_type":"markdown","source":"

To investigate the algorithm and its convergence, the argument verbose=true may be specified.

","metadata":{}}, {"cell_type":"markdown","source":"

For some functions, adjusting the default tolerances may be necessary to achieve convergence. These include abstol and reltol, which are used to check if norm(f(x)) <= max(abstol, norm(x)*reltol); xabstol, xreltol, to check if norm(x1-x0) <= max(xabstol, norm(x1)*xreltol); and maxevals and maxfnevals to limit the number of steps in the algorithm or function calls.

","metadata":{}}, @@ -43,13 +45,13 @@ {"cell_type":"markdown","source":"

For a classic example where a large second derivative is the issue, we have $f(x) = x^{1/3}$:

","metadata":{}}, {"outputs":[{"output_type":"execute_result","data":{"text/plain":["Roots.ConvergenceFailed(\"Stopped at: xn = -2.1990233589964556e12\")\n"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["f(x) = cbrt(x)\nx = fzero(f, 1, order=2)\t# all of 2, 5, 8, and 16 fail or diverge towards infinity"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

However, the default finds the root here, as a bracket is identified:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(0.0,0.0)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["x = fzero(f, 1)\nx, f(x)"],"metadata":{},"execution_count":null}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(0.0, 0.0)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["x = fzero(f, 1)\nx, f(x)"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

Order 8 illustrates that sometimes the stopping rules can be misleading and checking the returned value is always a good idea:

","metadata":{}}, {"outputs":[{"output_type":"execute_result","data":{"text/plain":["2.0998366730115564e23"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["fzero(f, 1, order=8)"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

The algorithm rapidly marches off towards infinity so the relative tolerance $|x| \\cdot \\epsilon$ is large compared to the far-from zero $f(x)$.

","metadata":{}}, {"cell_type":"markdown","source":"
","metadata":{}}, {"cell_type":"markdown","source":"

This example illustrates that the default fzero call is more forgiving to an initial guess. The devilish function defined below comes from a test suite of difficult functions. The default method finds the zero starting at 0:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":"Plot(...)","image/png":"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"},"metadata":{"image/png":{"height":480,"width":600}},"execution_count":null}],"cell_type":"code","source":["f(x) = cos(100*x)-4*erf(30*x-10)\nplot(f, -2, 2)"],"metadata":{},"execution_count":null}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":"Plot(...)","image/png":"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"},"metadata":{"image/png":{"height":480,"width":600}},"execution_count":null}],"cell_type":"code","source":["f(x) = cos(100*x)-4*erf(30*x-10)\nplot(f, -2, 2)"],"metadata":{},"execution_count":null}, {"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.3318660335745625"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["fzero(f, 0)"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

Whereas, with order=n methods fail. For example,

","metadata":{}}, {"outputs":[{"output_type":"execute_result","data":{"text/plain":["Roots.ConvergenceFailed(\"Stopped at: xn = 34772.380550438844\")\n"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["fzero(f, 0, order=8)"],"metadata":{},"execution_count":null}, @@ -60,19 +62,19 @@ {"cell_type":"markdown","source":"

Whereas,

","metadata":{}}, {"outputs":[{"output_type":"execute_result","data":{"text/plain":["Roots.ConvergenceFailed(\"Stopped at: xn = -0.7503218333241642\")\n"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["fzero(f, x0, order=2)"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

A graph shows the issue. We have overlayed a 15 steps of Newton's method, the other algorithms being somewhat similar:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":"Plot(...)","image/png":"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"},"metadata":{"image/png":{"height":480,"width":600}},"execution_count":null}],"cell_type":"code","source":[""],"metadata":{},"execution_count":null}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":"Plot(...)","image/png":"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sBD8foHEyzGNkgymUZLBKegeP0qjDidu2wgncFcxCry5RmYA0yjJYBolGUyj7vGjNPrcXty0AeOise9yRIkcqTKNkgymUZLBNOoef3lntvTi59sB4On5QlMQTKMkhWmUZHAKusdf0uhdm9HSi2VZ+OYEuRdlGiUZTKMkg2nUPX6RRrc14cx/QafB7ktRGC+3JUyjJINplGQwjbrH9+9MhxM3boDDiZ9OF52CYBolKUyjJINT0D2+T6PP78eWRmRH494Z0i/NNEoymEZJBtOoe3ycRlv7UPgGmnvxzjJckiO8IUyjJIRplGQwjbrHx+/MuzejuRfnZvpgCoJplKQwW3TrbgAAA/FJREFUjZIMTkH3+DKNbm/GSwcRqsUzIteRORnTKMlgGiUZTKPu8dkgdDhx43o4nPjJNJwhu0ZmQHV1/Wuvfeib1yaVfPDB2t27y329FRT8HnvsFV9vQkByM41WVdU+/fT/NTS0lJRMvuWWq0JD9YO/+8wzr69bt8P1+MEHry8qyjv5Gf5yAJsbkRWF+8TXyAyw2ezt7V0+e3lShslk7uuz+HorKPg1Nrb6ehMCkpuD8OabH3766bsnTMh8++1PHn305QceuG7wd9eu3f7WW48P8+uOiJj7tgLA7+YhWj/MDxIREXmXm2n04ouXTJyYHRKiXbZsblVV7QnftVptq1dvfffdz6qr64f89Y65l7nWyFya697rExEReYabg/Daa7/tevDzn//x2msvOeG7FRXVZWWHzObe++9/9tVX3zv51836aI3d1vKHexcsuGbwf26++eFVq74AcPhwjcCD7dv3ib0WH6j8oKure9++wz7fDD7gA0UejNZw5xHu2VPxq189f8IXB3/m9+KL79bXN91//3Un/epxy5ff8t57vx/8lfb2ruIf/KW6tgmbP3Bjiz3NCWh8vQ1EROR1R46sHD8+/eSvu39C/TvvrPr0083PPfczjWa4QXLZZXcO+Xmh/In8RESkslNNKzcXy/zzn5+uXLnh+ecfGHje7m7ztm17zzpr1saNu9at23H33d8H0NLSbrPZR7VBREREktw5IiwtPTh//tUXXrhQq9UCiI6OfOmlX65a9cWKFffV1n6i1WoffPC5srIKvV5ns9keeeS2goLxXthyIiIiD/DBtUaJiIj8h+/vPkFERORDHIRf8eqr7/HSDORZNTXGW2555Mor73riib+e6iNzIk/hX2Ju4CDsZzb3PfDAc/fd90xzc7uvt4WCh9PpvOGG39x663dee+2R9PSkRx550ddbREGLf4m5jTdIO+6iixaHhHDPgDxpz56KWbMmT5yYDeCqq772rW/d7ustomDGv8Tcw//J+kVEhJ155lRfbwUFm6qq2vz846umeW9e8h7+JeY2td6Wp71WDpFn2Wx2nY43fybya2oNwqKivDfffMzXW0EKSU5O2LFj/8AfHQ6HDzeGiIbENErkRSUlkz/7bIvrbN3q6vq4uGhfbxERnUitI8LTCgsLDQ3l/ybkMZGR4StWXPSNb9wcERFutdqeeeYeX28RBTn+JeYGXlmGiIiUxjRKRERK4yAkIiKlcRASEZHSOAiJiEhpHIRERKQ0DkIiIlIaByERESmNg5CIiJTGQUhERErjICQiIqVxEBIRkdI4CImISGkchEREpDQOQiIiUhoHIRERKY2DkIiIlMZBSERESvv/bnYTu3e6pH0AAAAASUVORK5CYII="},"metadata":{"image/png":{"height":480,"width":600}},"execution_count":null}],"cell_type":"code","source":[""],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

Though 15 steps are shown, only a few are discernible, as the function's relative maximum causes a trap for this algorithm. Starting to the right of the relative minimum – nearer the zero – would avoid this trap. The default method employs a trick to bounce out of such traps, though it doesn't always work.

","metadata":{}}, {"cell_type":"markdown","source":"

Finding more than one zero

","metadata":{"internals":{"slide_type":"subslide","slide_helper":"subslide_end"},"slideshow":{"slide_type":"slide"},"slide_helper":"slide_end"}}, {"cell_type":"markdown","source":"

The bracketing methods suggest a simple algorithm to recover multiple zeros: partition an interval into many small sub-intervals. For those that bracket a root find the root. This is essentially implemented with fzeros(f, a, b). The algorithm has problems with non-simple zeros (in particular ones that don't change sign at the zero) and zeros which bunch together. Simple usage is often succesful enough, but a graph should be used to assess if all the zeros are found:

","metadata":{}}, {"outputs":[{"output_type":"execute_result","data":{"text/plain":["3-element Array{Float64,1}:\n -0.815553\n 1.42961 \n 8.61317 "]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["fzeros(x -> exp(x) - x^4, -10, 10)"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

Classical methods

","metadata":{"internals":{"slide_type":"subslide","slide_helper":"subslide_end"},"slideshow":{"slide_type":"slide"},"slide_helper":"slide_end"}}, {"cell_type":"markdown","source":"

The package provides some classical methods for root finding: newton, halley, and secant_method. We can see how each works on a problem studied by Newton himself. Newton's method uses the function and its derivative:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(2.0945514815423265,-8.881784197001252e-16,-1.0)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["f(x) = x^3 - 2x - 5\nfp(x) = 3x^2 - 2\nx = newton(f, fp, 2)\nx, f(x), sign(f(prevfloat(x)) * f(nextfloat(x)))"],"metadata":{},"execution_count":null}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(2.0945514815423265, -8.881784197001252e-16, -1.0)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["f(x) = x^3 - 2x - 5\nfp(x) = 3x^2 - 2\nx = newton(f, fp, 2)\nx, f(x), sign(f(prevfloat(x)) * f(nextfloat(x)))"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

To see the algorithm in progress, the argument verbose=true may be specified.

","metadata":{}}, {"cell_type":"markdown","source":"

The secant method needs two starting points, here we start with 2 and 3:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(2.0945514815423265,-8.881784197001252e-16,-2.524354896707238e-29)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["x = secant_method(f, 2,3)\nx, f(x), f(prevfloat(x)) * f(nextfloat(x))"],"metadata":{},"execution_count":null}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(2.0945514815423265, -8.881784197001252e-16, -2.524354896707238e-29)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["x = secant_method(f, 2,3)\nx, f(x), f(prevfloat(x)) * f(nextfloat(x))"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

Halley's method has cubic convergence, as compared to Newton's quadratic convergence. It uses the second derivative as well:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(2.0945514815423265,-8.881784197001252e-16,-2.524354896707238e-29)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["fpp(x) = 6x\nx = halley(f, fp, fpp, 2)\nx, f(x), f(prevfloat(x)) * f(nextfloat(x))"],"metadata":{},"execution_count":null}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":["(2.0945514815423265, -8.881784197001252e-16, -2.524354896707238e-29)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["fpp(x) = 6x\nx = halley(f, fp, fpp, 2)\nx, f(x), f(prevfloat(x)) * f(nextfloat(x))"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

For many function, the derivatives can be computed automatically. The ForwardDiff package provides a means. This package wraps the process into an operator, D which returns the derivative of a function f (for simple-enough functions):

","metadata":{}}, {"outputs":[{"output_type":"execute_result","data":{"text/plain":["2.0945514815423265"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["newton(f, D(f), 2) # just newton(f, 2) works here"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

Or for Halley's method

","metadata":{}}, @@ -86,32 +88,11 @@ {"cell_type":"markdown","source":"

The total distance flown is when flight(x) == 0.0 for some x > 0: This can be solved for different theta with fzero. In the following, we note that log(a/(a-x)) will have an asymptote at a, so we start our search at a-5:

","metadata":{}}, {"outputs":[{"output_type":"execute_result","data":{"text/plain":["howfar (generic function with 1 method)"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["function howfar(theta)\n\t a = 200*cosd(theta)\n\t fzero(x -> flight(x, theta), a-5)\nend"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

To see the trajectory if shot at 45 degrees, we have:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":"Plot(...)","image/png":"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"},"metadata":{"image/png":{"height":480,"width":600}},"execution_count":null}],"cell_type":"code","source":["theta = 45\nplot(x -> flight(x, theta), 0, howfar(theta))"],"metadata":{},"execution_count":null}, +{"outputs":[{"output_type":"execute_result","data":{"text/plain":"Plot(...)","image/png":"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"},"metadata":{"image/png":{"height":480,"width":600}},"execution_count":null}],"cell_type":"code","source":["theta = 45\nplot(x -> flight(x, theta), 0, howfar(theta))"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

To maximize the range we solve for the lone critical point of howfar within the range. The derivative can not be taken automatically with D. So, here we use a central-difference approximation and start the search at 45 degrees, the angle which maximizes the trajectory on a non-windy day:

","metadata":{}}, {"outputs":[{"output_type":"execute_result","data":{"text/plain":["26.262308906498127"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["h = 1e-5\nhowfarp(theta) = (howfar(theta+h) - howfar(theta-h)) / (2h)\ntstar = fzero(howfarp, 45)"],"metadata":{},"execution_count":null}, {"cell_type":"markdown","source":"

This shows the differences in the trajectories:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":"Plot(...)","image/png":"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"},"metadata":{"image/png":{"height":480,"width":600}},"execution_count":null}],"cell_type":"code","source":["plot(x -> flight(x, tstar), 0, howfar(tstar))\nplot!(x -> flight(x, 45), 0, howfar(45))"],"metadata":{},"execution_count":null}, -{"cell_type":"markdown","source":"

Polynomials

","metadata":{"internals":{"slide_type":"subslide","slide_helper":"subslide_end"},"slideshow":{"slide_type":"slide"},"slide_helper":"slide_end"}}, -{"cell_type":"markdown","source":"

The Polynomials package provides a type for working with polynomial expressions. In that package, the roots function is used to find the roots of a polynomial expression.

","metadata":{}}, -{"cell_type":"markdown","source":"

For example,

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["3-element Array{Float64,1}:\n 3.0\n 2.0\n 1.0"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["using Polynomials\nx = poly([0.0])\t\t\t# (x - 0.0)\nroots((x-1)*(x-2)*(x-3))"],"metadata":{},"execution_count":null}, -{"cell_type":"markdown","source":"

The Roots package provides a few interfaces for finding roots of polynomial functions.

","metadata":{}}, -{"cell_type":"markdown","source":"

As a convenience, this package adds a function interface to roots:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["3-element Array{Float64,1}:\n 3.0\n 2.0\n 1.0"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["f(x) = (x-1)*(x-2)*(x-3)\nroots(f)"],"metadata":{},"execution_count":null}, -{"cell_type":"markdown","source":"

The fzeros function will find the real roots of a univariate polynomial:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["2-element Array{Real,1}:\n 1\n 2"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["fzeros(x -> (x-1)*(x-2)*(x^2 + x + 1))"],"metadata":{},"execution_count":null}, -{"cell_type":"markdown","source":"

(For polynomial functions, no search interval is needed, as it is for other functions.)

","metadata":{}}, -{"cell_type":"markdown","source":"

The algorithm can have numeric issues when the polynomial degree gets too large, or the roots are too close together.

","metadata":{}}, -{"cell_type":"markdown","source":"

The polyfactor function provides a related task for polynomials with integer or rational coefficients:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["Dict{Polynomials.Poly{Int64},Int64} with 4 entries:\n Poly(1) => 1\n Poly(-3 + x) => 4\n Poly(-1 + x) => 2\n Poly(-2 + x) => 3"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["polyfactor(x -> (x-1)^2*(x-2)^3*(x-3)^4)"],"metadata":{},"execution_count":null}, -{"cell_type":"markdown","source":"

The linear factors correspond to the rational roots. (For such polynomial functions, fzeros will first look for rational roots and return them as rational numbers before searching for approximate values for the non-rational roots.)

","metadata":{}}, -{"cell_type":"markdown","source":"

The multroot function will also find the roots. The algorithm can do a better job when there are multiple roots, as it first identifies the multiplicity structure of the roots, and then tries to improve these values.

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["([3.0000000000000018,1.999999999999998,1.0000000000000002],[1,1,1])"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["multroot((x-1)*(x-2)*(x-3))\t# roots, multiplicity"],"metadata":{},"execution_count":null}, -{"cell_type":"markdown","source":"

The roots function degrades as there are multiplicities:

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["9-element Array{Complex{Float64},1}:\n 3.00325+0.0im \n 3.00001+0.00325783im \n 3.00001-0.00325783im \n 2.99674+0.0im \n 2.00042+0.0im \n 1.99979+0.000365419im\n 1.99979-0.000365419im\n 1.0+6.07912e-7im \n 1.0-6.07912e-7im "]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["p = (x-1)^2*(x-2)^3*(x-3)^4\nroots(p)"],"metadata":{},"execution_count":null}, -{"cell_type":"markdown","source":"

Whereas, multroot gets it right.

","metadata":{}}, -{"outputs":[{"output_type":"execute_result","data":{"text/plain":["([3.0,1.9999999999999996,1.0000000000000002],[4,3,2])"]},"metadata":{},"execution_count":null}],"cell_type":"code","source":["multroot(p)"],"metadata":{},"execution_count":null}, -{"cell_type":"markdown","source":"

The difference grows as the multiplicities get large.

","metadata":{}} +{"outputs":[{"output_type":"execute_result","data":{"text/plain":"Plot(...)","image/png":"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"},"metadata":{"image/png":{"height":480,"width":600}},"execution_count":null}],"cell_type":"code","source":["plot(x -> flight(x, tstar), 0, howfar(tstar))\nplot!(x -> flight(x, 45), 0, howfar(45))"],"metadata":{},"execution_count":null} ], "metadata": { "language_info": { diff --git a/doc/roots.md b/doc/roots.md index fbd5f316..1d918ef1 100644 --- a/doc/roots.md +++ b/doc/roots.md @@ -32,7 +32,7 @@ To illustrate, consider the function $f(x) = \cos(x) - x$. From the graph we see readily that $[0,1]$ is a bracket (which we emphasize with an overlay): -``` +```figure f(x) = cos(x) - x plot(f, -2, 2) plot!([0,1], [0,0], linewidth=2) @@ -78,6 +78,12 @@ The basic algorithm used for bracketing when the values are simple floating point values is the bisection method. For big float values, an algorithm due to Alefeld, Potra, and Shi is used. +The endpoints can even be infinite: + +``` +fzero(x -> Inf*sign(x), -Inf, Inf) # Float64 only +``` + ## Using an initial guess Bracketing methods have guaranteed convergence, but in general require @@ -87,9 +93,10 @@ interface to some different iterative algorithms that are more efficient. Unlike bracketing methods, these algorithms may not converge to the desired root if the initial guess is not well chosen. -The basic algorithm is modeled after an algorithm used for +The default algorithm is modeled after an algorithm used for [HP-34 calculators](http://www.hpl.hp.com/hpjournal/pdfs/IssuePDFs/1979-12.pdf). This -algorithm is more forgiving of the quality of the initial guess. In +algorithm is designed to be more forgiving of the quality of the +initial guess at the cost of possible performing many more steps. In many cases it satisfies the criteria for a bracketing solution, as it will use bracketing if within the algorithm a bracket is identified. @@ -114,7 +121,7 @@ For even more precision, `BigFloat` numbers can be used ``` x = fzero(sin, big(3)) -x, f(x), x - pi +x, sin(x), x - pi ``` ### Higher order methods @@ -122,7 +129,7 @@ x, f(x), x - pi The default call to `fzero` uses a first order method and then possibly bracketing, which involves potentially many more function calls. Though specifying a initial value is more convenient than a -bracket, there may be times where a more efficient algorithm is sough. +bracket, there may be times where a more efficient algorithm is sought. For such, a higher-order method might be better suited. There are algorithms of order 1 (secant method), 2 ([Steffensen](http://en.wikipedia.org/wiki/Steffensen's_method)), 5, @@ -211,7 +218,7 @@ defined below comes from a [test suite](http://people.sc.fsu.edu/~jburkardt/cpp_src/test_zero/test_zero.html) of difficult functions. The default method finds the zero starting at 0: -``` +```figure f(x) = cos(100*x)-4*erf(30*x-10) plot(f, -2, 2) ``` @@ -252,7 +259,7 @@ fzero(f, x0, order=2) A graph shows the issue. We have overlayed a 15 steps of Newton's method, the other algorithms being somewhat similar: -```nocode +```figure,nocode xs = [x0] n = 15 for i in 1:(n-1) push!(xs, xs[end] - f(xs[end])/D(f)(xs[end])) end @@ -376,7 +383,7 @@ end To see the trajectory if shot at 45 degrees, we have: -``` +```figure theta = 45 plot(x -> flight(x, theta), 0, howfar(theta)) ``` @@ -396,81 +403,8 @@ tstar = fzero(howfarp, 45) This shows the differences in the trajectories: -``` +```figure plot(x -> flight(x, tstar), 0, howfar(tstar)) plot!(x -> flight(x, 45), 0, howfar(45)) ``` -## Polynomials - -The `Polynomials` package provides a type for working with polynomial -expressions. In that package, the `roots` function is used to find the -roots of a polynomial expression. - - -For example, - -``` -using Polynomials -x = poly([0.0]) # (x - 0.0) -roots((x-1)*(x-2)*(x-3)) -``` - -The `Roots` package provides a few interfaces for finding roots of -polynomial functions. - -As a convenience, this package adds a function interface to `roots`: - -``` -f(x) = (x-1)*(x-2)*(x-3) -roots(f) -``` - - -The `fzeros` function will find the real roots of a univariate polynomial: - -``` -fzeros(x -> (x-1)*(x-2)*(x^2 + x + 1)) -``` - -(For polynomial functions, no search interval is needed, as it is -for other functions.) - -The algorithm can have numeric issues when the polynomial degree gets -too large, or the roots are too close together. - - -The `polyfactor` function provides a related task for -polynomials with integer or rational coefficients: - -``` -polyfactor(x -> (x-1)^2*(x-2)^3*(x-3)^4) -``` - -The linear factors correspond to the *rational* roots. (For such -polynomial functions, `fzeros` will first look for rational roots and -return them as rational numbers before searching for approximate -values for the non-rational roots.) - -The `multroot` function will also find the roots. The algorithm can do a -better job when there are multiple roots, as it first identifies the multiplicity structure of the -roots, and then tries to improve these values. - - -``` -multroot((x-1)*(x-2)*(x-3)) # roots, multiplicity -``` -The `roots` function degrades as there are multiplicities: - -``` -p = (x-1)^2*(x-2)^3*(x-3)^4 -roots(p) -``` - -Whereas, `multroot` gets it right. - -``` -multroot(p) -``` - -The difference grows as the multiplicities get large. diff --git a/src/Polys/agcd.jl b/src/Polys/agcd.jl deleted file mode 100644 index 277670ce..00000000 --- a/src/Polys/agcd.jl +++ /dev/null @@ -1,278 +0,0 @@ -## -## Find an approximate gcd (agcd) for two polynomials -## The `gcd` function can exactly handle Poly{Int} if Rational{BigInt} is used: -## p = poly([1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,3]) -## q = Poly(map(u->big(u)//1, coeffs(p)), p.var) -## gcd(p, polyder(p)) # Poly(5.960464477539063e-8) -## gcd(q, polyder(q)) # degree 17, as expected -## But what to do with Poly{Float}? There floating point issues will be a problem, -## This create `agcd` for approximate gcd: -## u,v,w,err = agcd(p, polyder(p)) -## degree(u) # 17 -## roots(v) # 1,2,3 - - -## reimplement Zeng's gcd code for approximate gcds - -## Special matrices -function cauchy_matrix{T}(p::Poly{T}, k::Integer) - n = degree(p) + 1 - out = zeros(T, n + k - 1, k) - for i in 1:k - out[(1:n) + (i-1), i] = rcoeffs(p) - end - out -end - - -function sylvester_matrix(p::Poly, q::Poly; k::Int=0) - @assert k >= 0 - n,m = degree(p), degree(q) - if n < m - p,q = q,p - n,m = m,n - end - - del = n - m - i,j = k + del, k - if k == 0 - i,j = n,m - end - hcat(cauchy_matrix(q, i), cauchy_matrix(p, j)) -end - - -## preconditioning code -## taken from https://who.rocq.inria.fr/Jan.Elias/pdf/je_masterthesis.pdf -function geometric_mean(a::Vector, epsilon=Base.eps()) - a = filter(x -> abs(x) > epsilon, a) - n = length(a) - @compat prod(abs.(a) .^ (1/n)) -end - -function ratio(p,q, atol=Base.eps(), rtol=Base.eps()) - is_nonzero(x) = !isapprox(x, 0; rtol=rtol, atol=atol) - @compat as = abs.(filter(is_nonzero, p.a)) - length(as) == 0 && return Inf - - @compat bs = abs.(filter(is_nonzero, q.a)) - length(bs) == 0 && return Inf - - max(maximum(as), maximum(bs)) / min(minimum(as), minimum(bs)) -end - -## find alpha, gamma that minimize ratio of max coefficients to min coefficients, for getting zeros -## 1.12 writes this as a linear programming problem, we just ... -function precondition(p::Poly,q::Poly) - alphas = [2.0^i for i in -5:5] - phis = [2.0^i for i in -5:5] - out = (1,1) - m = ratio(p,q) - for α in alphas - for ϕ in phis - r = ratio(polyval(p, ϕ * variable(p)), α * polyval(q, ϕ * variable(q))) - if r < m - out = (α, ϕ) - end - end - end - - α, ϕ = out - - p = polyval(p, ϕ * variable(p)) - q = α * polyval(q, ϕ * variable(q)) - - p = p * (1/geometric_mean(coeffs(p))) - q = q * (1/geometric_mean(coeffs(q))) - - p,q, ϕ, α - -end - - -## converge on right singular vector of A associated with singular value sigma (not a double value) -## we return if sigma < tol; delta \appro 0; -## how to @assert that sigma_2 > sigma_1? -function lemma24(A::Matrix; θ::Real=1e-8) - const MAXSTEPS = 100 - - Q,R = Base.qr(A) - if rank(R) < size(R)[2] - λs, vs = eig(R) - @compat _, ind = findmin(abs.(λs)) - return(λs[ind], vs[:,ind]) - end - - x = rand(size(A)[2]); x/norm(x,2) # use random initial guess - σ, σ1 = 1e8, Inf - - function update(x) - y = conj(R)' \ x - z = R \ y - x = z/norm(z,2) - sigma = norm(R * x, 2) # y/norm(z,2) - (x, minimum(abs(sigma))) - end - - ## how long do we update? Size is only issue, not accuracy so we iterate until we stop changing much - for _ in 1:MAXSTEPS - x, σ1 = update(x) - ((σ1 < θ) | (abs((σ - σ1) / σ1) < 1.1)) && break - σ = σ1 - end - - return(σ1, x) -end - - -""" -Return k, u,v,w where k reveals rank; u*v \approx p; u*w \approx q; v & w coprime - -Following Zeng, section 4, this could be made more efficient. -In Zeng, theta=1e-8. Here agcd uses 1e-12, which is an improvement on some... -""" -function reveal_rank(p::Poly, q::Poly, theta=1e-8) - n,m = map(degree, (p, q)) - if n < m - p,q = q,p - n,m=m,n - end - - for k in 1:m - A = sylvester_matrix(p,q,k=k) - psi, x = lemma24(A) - if abs(psi) < norm(p,2) * theta # norm(A,2)? - ## degree u = n - k; degree(v) = k - v = monic(Poly(reverse(x[1:(length(x)-k)]), p.var)) - w = monic(Poly(reverse(x[(length(x)-k+1):end]), p.var)) - u = monic(Poly(reverse(cauchy_matrix(v, degree(p) - degree(v) + 1) \ rcoeffs(p)), p.var)) - return (k, u, v,w) - end - end - return (n+m, Poly(ones(eltype(coeffs(p)),1)), p, q) -end - - -## Lemma 4.1, (25) -## solve weighted least squares problem W*(Ax - b) = 0 -function weighted_least_square(A, b, w) - W = diagm(w) - (W * A) \ (W * b) -end - -## Jacobian F(u,v,w) = [p,p'] is J(u,v,w) -function JF{T}(u::Poly{T}, v::Poly, w::Poly) - j, k, l= degree(u), degree(v), degree(w) - n, m = j + k, j + l - - a = cauchy_matrix(v, n+1-k) - b = cauchy_matrix(u, n+1-j) - c = zeros(T, n+1, m+1-j) - - d = cauchy_matrix(w, m+1-l) - e = zeros(T, m+1, n+1-j) - f = cauchy_matrix(u, m+1-j) - - - A = hcat(a,b,c) - B = hcat(d,e,f) - vcat(A,B) -end -## compute F(u,v,w) - [p, p'] = [u*v, u*w] - [p, p'] -Fmp(p,q,u,v,w) = [rcoeffs(u*v); rcoeffs(u*w)] - [rcoeffs(p); rcoeffs(q)] -## error in estimate for p=u*v,q=u*w for some weights -residual_error(p,q,u,v,w, wts=ones(degree(p) + degree(q) + 2)) = norm(Fmp(p,q,u,v,w) .* wts, 2) -function agcd_update(p, q, u, v, w, wts) - m,n = map(degree, (u,v)) - A = JF(u, v, w) - b = Fmp(p,q,u,v,w) - inc = weighted_least_square(A, b, wts) - - x = vcat(rcoeffs(u), rcoeffs(v), rcoeffs(w)) - x = x - inc - - u = Poly(reverse(x[1:(1+m)]), p.var) - v = Poly(reverse(x[(m+2):(m+n+2)]), p.var) - w = Poly(reverse(x[(m+2+n+1):end]), p.var) - - err = residual_error(p,q,u,v,w, wts) - (u, v, w, err) -end - -""" - - -Find an approximate GCD for polynomials `p` and `q` using an algorithm of [Zeng](http://www.ams.org/journals/mcom/2005-74-250/S0025-5718-04-01692-8/home.html). - - -Returns u,v,w, err where: - -* `u*v \approx monic(p)` -* `u*w \approx monic(q)` -* The total residual error in these approximations is bounded by `err`. - -Further, -* `v` and `w` should share no common roots (`u` is a gcd of `u*v` and `u*w`) -* `roots(v)` should exhaust unique values of `roots(p)`. - -The tolerances are: - -* theta: passed to the reveal_rank function. In Zeng 1e-8 is used. Here 1e-12 seems to work better? -* \rho: if the residual error does not come below this mark, then we use the initial guess - - -""" -function agcd{T,S}(p::Poly{T}, q::Poly{S}=polyder(p); - theta = 1e-12, # reveal_rank tolerance. (1e-8 in paper, this seems better?) - ρ::Real = 1e-10 # residual tolerance - ) - - n, m = map(degree, (p,q)) - if m > n - p,q=q,p - end - - if m == 0 - return (Poly(ones(1)), p, q, 0) - end - - p0,q0 = map(copy, (p,q)) - p,q, phi, alpha = precondition(p,q) - - k, u, v, w = reveal_rank(p, q, theta) - u0,v0,w0 = map(copy, (u,v,w)) - - m,n,k = map(degree, (u, v, w)) - wts = map(pj -> 1/max(1, abs(pj)), vcat(rcoeffs(p), rcoeffs(q))) - - ## iterate to solve - ## uvw_j+1 = uvw_j - Jw[F - p] - - err0, err1 = Inf, residual_error(p,q,u,v,w, wts) - for ctr in 1:20 - try - u1, v1, w1, err1 = agcd_update(p, q, u, v, w, wts) - if err1 < err0 - err0, u, v, w = err1, u1, v1, w1 - else - break - end - catch err - break # possibly singular - end - end - - if err0 > norm(sylvester_matrix(p,q), 2) * ρ - u,v,w = map(monic, (u0, v0, w0)) ## failed to converge, so we return the initial guess - end - - x = (1/phi) * variable(p) # reverse preconditioning - u,v,w = map(monic, (polyval(u, x), polyval(v, x), polyval(w, x))) - - (u,v,w, residual_error(p0,q0,u,v,w)) -end - - - - - diff --git a/src/Polys/multroot.jl b/src/Polys/multroot.jl deleted file mode 100644 index 6b19ef68..00000000 --- a/src/Polys/multroot.jl +++ /dev/null @@ -1,234 +0,0 @@ -## Polynomial root finder for polynomials with multiple roots -## -## Based on "Computing multiple roots of inexact polynomials" -## http://www.neiu.edu/~zzeng/mathcomp/zroot.pdf -## Author: Zhonggang Zeng -## Journal: Math. Comp. 74 (2005), 869-903 -## -## Zeng has a MATLAB package `multroot`, from which this name is derived. -## Basic idea is -## 1) for polynomial p we do gcd decomposition p = u * v; p' = u * w. Then roots(v) are the roots without multiplicities. -## 2) can repeat with u to get multiplicities. -## -## This is from Gauss, as explained in paper. Zeng shows how to get u,v,w when the polynomials -## are inexact due to floating point approximations or even model error. This is done in his -## algorithm II. -## 3) Zeng's algorithm I (pejroot) uses the pejorative manifold of Kahan and Gauss-Newton to -## improve the root estimates from algorithm II (roots(v)). The pejorative manifold is defined by -## the multiplicities l and is operationalized in evalG and evalJ from Zeng's paper. - -using Polynomials -import Polynomials: degree - - -## map monic(p) to a point in C^n -## p = 1x^n + a1x^n-1 + ... + an_1 x + an -> (a1,a2,...,an) -function p2a(p::Poly) - p = monic(p) - rcoeffs(p)[2:end] -end - -## get value of gl(z). From p16 -function evalG(zs::Vector, ls::Vector) - length(zs) == length(ls) || throw("Length mismatch") - - s = prod([poly([z])^l for (z,l) in zip(zs, ls)]) # \prod (x-z_i)^l_i - p2a(s) -# rcoeffs(s)[2:end] -end - -## get jacobian J_l(z), p16 -function evalJ(zs::Vector, ls::Vector) - length(zs) == length(ls) || throw("Length mismatch") - m = length(zs) - - u = prod([poly([z])^(l-1) for (z,l) in zip(zs, ls)]) ## Pi (1-z)^(l-1) - - J = zeros(eltype(zs), sum(ls), m) - for j in 1:m - s = -ls[j] * u - for i in 1:m - if i != j - s = s * poly([zs[i]]) - end - end - J[:,j] = rcoeffs(s) - end - J -end - -## Gauss-Newton iteration to solve weighted least squares problem -## G_l(z) = a, where a is related to monic version of polynomial p -## l is known multiplicity structure of polynomial p = (x-z1)^l1 * (x-z2)^l2 * ... * (x-zn)^ln -## Algorithm I, p17 -function pejroot(p::Poly, z0::Vector, l::Vector{Int}; - wts::(@compat Union{Vector, Void})=nothing, # weight vector - tol = 1e-8, - maxsteps = 100 - ) - - a = p2a(p) #rcoeffs(monic(p))[2:end] # an_1, an_2, ..., a2, a1, a0 - - if wts == nothing - @compat wts = map(u -> min(1, 1/abs.(u)), a) - end - W = diagm(wts) - - ## Solve WJ Δz = W(Gl(z) - a) in algorithm I - G(z) = (evalG(z, l) - a) - update(z, l) = z - weighted_least_square(evalJ(z,l), G(z), wts) - - zk = copy(z0); zk1 = update(zk, l) - deltaold = norm(zk1 - zk,2); zk = zk1 - - cvg = false - for ctr in 1:maxsteps - zk1 = update(zk, l) - delta = norm(zk1 - zk, 2) - - if delta > deltaold - println("Growing delta. Best guess is being returned.") - break - end - - ## add extra abs(delta) < 100*eps() condition - if delta^2 / (deltaold - delta) < tol || abs(delta) < 100*eps() - cvg = true - break - end - - deltaold = delta - zk=zk1 - end - - if !cvg println(""" -Returning the initial estimates, as the -algorithm failed to improve estimates for the roots on the given -pejorative manifold. -""") - return(z0) - end - return(zk1) -end - - -## Main interface to finding roots of polynomials with multiplicities -## -## The `multroot` function returns the roots and their multiplicities -## for `Poly` objects. It performs better than `roots` if the -## polynomial has multiplicities. -## -## julia> x = poly([0.0]); -## julia> p = (x-1)^4 * (x-2)^3 * (x-3)^3 * (x-4)l -## julia> multroot(p) -## ([1.0,2.0,3.0,4.0],[4,3,3,1]) -## ## For "prettier" printing, results can be coerced to a dict -## julia> [k => v for (k,v) in zip(multroot(p)...)] -## Dict{Any,Int64} with 4 entries: -## 1.0000000000000007 => 4 -## 3.000000000000018 => 3 -## 1.9999999999999913 => 3 -## 3.999999999999969 => 1 -## ## Large order polynomials prove difficult. We can't match the claims in Zeng's paper -## ## as we don't get the pejorative manifold structure right. -## julia> p = poly([1.0:10.0]); -## julia> multroot(p) ## should be 1,2,3,4,...,10 all with multplicity 1, but -## ([1.0068,2.14161,3.63283,5.42561,7.25056,8.81228,9.98925],[1,2,1,2,2,1,1]) -## -## nearby roots can be an issue -## julia> delta = 0.0001 ## delta = 0.001 works as desired. -## julia> p = (x-1 - delta)*(x-1)*(x-1 + delta) -## julia> multroot(p) -## ([0.999885,1.00006],[1,2]) -function multroot(p::Poly; - θ::Real=1.0, # singular threshold, 1.0 is replaced by normf(A)*eps() - ρ::Real=1e-10, # initial residual tolerance - ϕ::Real=1e2, # residual tolerance growth factor - δ::Real=1e-8 # passed to solve y sigma - - ) - - degree(p) == 0 && error("Degree of `p` must be atleast 1") - - if degree(p) == 1 - return(roots(p), [1]) - end - - ## if degree(p) == 2 - ## a,b,c = coeffs(p) - ## discr = b^2 - 4a*c - ## if discr < 0 - ## discr = Complex(discr, 0) - ## end - ## return ( -2c / (-b - sqrt(discr)), -2c/(-b + sqrt(discr))) - ## end - - p = Poly(float(coeffs(p))) # floats, not Int - - u_j, v_j, w_j, residual= agcd(p, polyder(p), ρ = ρ) - ρ = max(ρ, ϕ * residual) - - ## bookkeeping - zs = roots(v_j) - ls = ones(Int, length(zs)) - - p0 = u_j - - while degree(p0) > 0 - if degree(p0) == 1 - z = roots(p0)[1] - @compat _, ind = findmin(abs.(zs .- z)) - ls[ind] = ls[ind] + 1 - break - end - - u_j, v_j, w_j, residual= agcd(p0, polyder(p0), ρ=ρ) - - ## need to worry about residual between - ## u0 * v0 - monic(p0) and u0 * w0 - monic(Polynomials.polyder(p0)) - ## resiudal tolerance grows with m, here it depends on - ## initial value and previous residual times a growth tolerance, ϕ - ρ = max(ρ, ϕ * residual) - - ## update multiplicities - for z in roots(v_j) - @compat _, ind = findmin(abs.(zs .- z)) - ls[ind] = ls[ind] + 1 - end - - ## rename - p0 = u_j - end - - - if maximum(ls) == 1 - return(zs, ls) - else - zs = pejroot(p, zs, ls) - return(zs, ls) - end -end - -## Different interfaces - -## can pass in vector too -multroot{T <: Real}(p::Vector{T}; kwargs...) = multroot(Poly(p); kwargs...) - -## Can pass in function -function multroot(f::Function; kwargs...) - p = Poly([0.0]) - try - p = convert(Poly{Float64}, f) - catch err - error("The function does not compute a univariate polynomial") - end - multroot(p; kwargs...) - - - - -end - -## add funciton interface to Polynomials.roots -Polynomials.roots(f::Function) = roots(convert(Poly{Float64}, f)) - diff --git a/src/Polys/polynomials.jl b/src/Polys/polynomials.jl deleted file mode 100644 index 048f6121..00000000 --- a/src/Polys/polynomials.jl +++ /dev/null @@ -1,67 +0,0 @@ -## Extensions to Polynomials.jl - -"Create a monic polynomial from `p`" -monic(p::Poly) = Poly(p.a/p[degree(p)], p.var) - -## Reverse coefficients -rcoeffs(p::Poly) = reverse(coeffs(p)) - - -function Base.convert{T<:Integer}(::Type{Poly{T}}, p::Poly{Rational{T}}) - l = reduce(lcm, [x.den for x in p.a]) - q = l * p - Poly(T[x for x in q.a], p.var) -end - -## convert Poly <--> function -Base.convert(::Type{Function}, p::Poly) = x -> Polynomials.polyval(p,x) -## convert a function to a polynomial with error if conversion is not possible -## This needs a hack, as Polynomials.jl defines `/` to return a `div` and not an error for p(x)/q(x) -immutable PolyTest - x -end -import Base: +,-,*,/,^ -+(a::PolyTest, b::PolyTest) = PolyTest(a.x + b.x) -+{T<:Number}(a::T, b::PolyTest) = PolyTest(a + b.x) -+{T<:Number}(a::PolyTest,b::T) = PolyTest(a.x + b) --(a::PolyTest,b::PolyTest) = PolyTest(a.x - b.x) --{T<:Number}(a::T, b::PolyTest) = PolyTest(a - b.x) --{T<:Number}(a::PolyTest,b::T) = PolyTest(a.x - b) --(a::PolyTest) = PolyTest(-a.x) -*(a::PolyTest, b::PolyTest) = PolyTest(a.x * b.x) -*(a::Bool, b::PolyTest) = PolyTest(a * b.x) -*{T<:Number}(a::T, b::PolyTest) = PolyTest(a * b.x) -*{T<:Number}(b::PolyTest, a::T) = PolyTest(a * b.x) -/{T<:Number}(b::PolyTest, a::T) = PolyTest(b.x / a) -^{T<:Integer}(b::PolyTest, a::T) = PolyTest(b.x ^ a) - -const QQR = Union{Int, BigInt, Rational{Int}, Rational{BigInt}, Float64} -function Base.convert{T<:QQR}(::Type{Poly{T}}, f::Function) - try - f(PolyTest(0)) # error if not a poly - x = poly(zeros(T,1)) - out = f(x) - if !isa(out, Poly) - out = Poly([out]) # maybe a constant - end - out - catch e - rethrow(e) - end -end -function Base.convert(::Type{Poly}, f::Function) - ## try integers first, then float - for T in [BigInt, Int, Float64] - try - fn = convert(Poly{T}, f) - return(fn) - catch e - end - end - DomainError() -end - - -*{T, S}(A::Array{T,2}, p::Poly{S}) = Poly(A * rcoeffs(p)) - - diff --git a/src/Polys/real_roots.jl b/src/Polys/real_roots.jl deleted file mode 100644 index 679fb8cd..00000000 --- a/src/Polys/real_roots.jl +++ /dev/null @@ -1,341 +0,0 @@ -## Find real zeros of a polynomial -## -## We do this two ways, depending if an exact gcd can be found (Z[x] or Q[x]) -## -## For polynomials over Z[x], Q[x], we can use a modification of -## [Vincent's theorem](http://en.wikipedia.org/wiki/Vincent's_theorem) -## taken from Efficient isolation of polynomial’s real roots by -## Fabrice Rouillier; Paul Zimmermann -## - -### Things for Polynomials ##### -## return "x" -## variable(p::Poly) = poly(zeros(eltype(p),1), p.var) - -## make bounds work for floating point or rational. -_iszero{T <: Union{Integer, Rational}}(b::T; kwargs...) = b == 0 -_iszero{T<:AbstractFloat}(b::T; xtol=1) = abs(b) <= 2*xtol*eps(T) - - -## ## return (q,r) with p(x) = (x-c)*q(x) + r using synthetic division -## function Base.divrem(p::Poly, c::Number) -## ps = copy(p.a) # [p0, p1, ..., pn] -## qs = eltype(p)[pop!(ps)] # take from right -## while length(ps) > 0 -## unshift!(qs, c*qs[1] + pop!(ps)) -## end -## r = shift!(qs) -## Poly(qs, p.var), r -## end - -## p(x) = q(x)*(x-c)^k for some q,k (possibly 0). Return maximal k and corresponding q -function multiplicity(p::Poly, c::Number) - k = 0 - q, r = PolynomialFactors.synthetic_division(p,c) - while _iszero(r) - p = q - q,r = PolynomialFactors.synthetic_division(p, c) - k = k + 1 - end - p, k -end - - -## Our Poly types for which we can find gcd -const QQ = Union{Int, BigInt, Rational{Int}, Rational{BigInt}} -const BB = Union{BigInt, Rational{BigInt}} - -## Here computations are exact, as long as we return poly in Q[x] -function Base.divrem{T<:QQ, S<:QQ}(a::Poly{T}, b::Poly{S}) - degree(b) == 0 && (b[0] == 0 ? error("b is 0") : return (a/b[0], 0*b)) - - lc(p::Poly) = p[degree(p)] - - a.var == b.var || DomainError() # "symbols must match" - R = promote_type(T, S) - x = poly(zeros(R,1), a.var) - q, r= 0*a, a - d,c = degree(b), lc(b) - - while degree(r) >= d - s = lc(r)//c * x^(degree(r)- d) - q, r = q + s, r - s*b - end - q,r -end - -## gcd over Rational{BigInt} -function bgcd{T <: BB, S<: BB}(a::Poly{T}, b::Poly{S}) - (degree(b) == 0 && b[0] == 0) ? a : bgcd(b, divrem(a,b)[2]) -end -################################################## -## Real zeros of p in Z[x] or Q[x], using VCA method -## cf. E$cient isolation of polynomial’s real roots by Fabrice Rouillier, Paul Zimmermann - - -## Polynomial transformations -" `R(p)` finds `x^n p(1/x)` which is a reversal of coefficients " -R(p) = Poly(reverse(p.a), p.var) - -" `p(λ x)`: scale x axis by λ " -Hλ(p, λ=1//2) = polyval(p, λ * variable(p)) - -" `p(x + λ)`: Translate polynomial left by λ " -Tλ(p, λ=1) = polyval(p, variable(p) + λ) - -" shift and scale p so that [c,c+1]/2^k -> [0,1] " -function Pkc(p::Poly, k, c) - n = degree(p) - 2^(k*n) * Hλ(Tλ(p, c/2^k), 1/2^k) -end - - -## Upper bound on size of real roots that is tighter than cauchy -## titan.princeton.edu/papers/claire/hertz-etal-99.ps -function upperbound(p::Poly) - q, d = monic(p), degree(p) - - d == 0 && error("degree 0 is a constant") - d == 1 && abs(q[0]) - - - a1 = abs(q[d-1]) - B = maximum([abs(q[i]) for i in 0:(d-2)]) - - a,b,c = 1, -(1+a1), a1-B - (-b + sqrt(b^2 - 4a*c))/2 -end - - - -""" - -Use Descarte's rule of signs to compute number of *postive* roots of p - -""" -¬(f::Function) = x -> !f(x) -function descartes_bound(p::Poly) - bs = filter(¬_iszero, p.a) - - ## count terms - ctr = 0 - @compat bs = sign.(bs) - last = bs[1] - for i in 2:length(bs) - bs[i] == 0 && continue - if last != bs[i] - last = bs[i] - ctr += 1 - end - end - ctr -end - -## Descarte's upperbound on possible zeros in (0,1) -function DesBound(p::Poly) - q = Tλ(R(p),1) - descartes_bound(q) -end - - -## Interval with [c/2^k, (c+1)/2^k) -immutable Intervalkc - k::Int - c::Int -end - -## convenience for two useful functions -DesBound(p,node::Intervalkc) = DesBound(Pkc(p,node)) -function Pkc(p::Poly, node::Intervalkc) - k,c = node.k, node.c - Pkc(p, k, c) -end - -## how we store the state of our algorithm to find zero in [0,1] -type State - Internal # DesBound > 1 - Exact # c/2^k is a root - Isol # DesBound == 1 - p::Poly -end -State(p) = State(Intervalkc[], Set{Rational}(), Intervalkc[], p) - - -## from naming convention of paper -function initTree(st::State) - node = Intervalkc(0,0) - ## check 0 and 1 - for x in [0//1, 1//1] - if _iszero(polyval(st.p,x)) - push!(st.Exact, x) - st.p,k = multiplicity(st.p, x) - end - end - - n = DesBound(Pkc(st.p, node)) - if n == 0 - ## nothing all done - elseif n == 1 - push!(st.Isol, node) - else - push!(st.Internal, node) - end -end - -## get next node. Need to check that length(st.Internal) > 0, as it would throw error if no more Internal nodes -getNode(st::State) = shift!(st.Internal) - -## add successors to [c,c+1]/2^k -> [2c, 2c+1]/2^(k+1) & [2(c+1), 2(c+1)+1]/2^(k+1) and check if c+1 -function addSucc(st::State, node) - k,c = node.k, node.c - l = Intervalkc(k+1, 2c ) - r = Intervalkc(k+1, 2c+1) - p,m = multiplicity(st.p, (2c+1)//2^(k+1)); m > 0 && push!(st.Exact, (2c+1)//2^(k+1)) - p,m = multiplicity(st.p, (2c+2)//2^(k+1)); m > 0 && push!(st.Exact, (2c+2)//2^(k+1)) - for i in [l,r] - n = DesBound(Pkc(p,i)) - n == 1 && push!(st.Isol, i) - n > 1 && push!(st.Internal, i) - end -end - -## update state to resolve for roots in [0,1] -## st should have st.Interval = [], st.Exact and st.Isol -## This is basic search, not the more complicated one of the paper. To modify search -## strategy, the push!(st.Internal, i) would be changed in `addSucc`. -function find_in_01(p::Poly) - st = State(p) - - initTree(st) - for x in [0,1] - p,k = multiplicity(p,x) - k > 0 && push!(st.Exact, x) - end - while length(st.Internal) > 0 - node = getNode(st) - node.k > 30 && error("too small?") # XXX arbitrary. Theory says a delta exists, this is δ > 1/2^30 - addSucc(st, node) - end - st -end - -## get root from an Isol interval -function getIsolatedRoot(p::Poly, a::Real, b::Real) - pa, pb = [polyval(p,x) for x in (a,b)] - pab = sign(pa) * sign(pb) - if pa == 0 p,k = multiplicity(p,a) end - if pb == 0 p,k = multiplicity(p,b) end - pa, pb = [polyval(p,x) for x in (a,b)] - pab = sign(pa) * sign(pb) - - if pab < 0 - Roots.fzero(p, [a,b]) - else - ## these aren't quite right, as we might get a double root this way - abs(pa) <= 4eps() && return(a) - abs(pb) <= 4eps() && return(b) - error("Can't find root of $p in [$a, $b]") - end -end - -function getIsolatedRoot(p::Poly, i::Intervalkc) - a,b = [i.c, i.c+1]//2^(i.k) - c = (a+b)//2 - polyval(p,c) == 0 && return(c) # keeps rational if c/2^k type - getIsolatedRoot(p, a, b) -end - -## return positive roots of a square-free polynomial -function pos_roots(p::Poly) - - rts = Any[] - - degree(p) == 0 && return(rts) - if degree(p) == 1 - c = -p[0]/p[1] - if c > 0 return([c]) else return(rts) end - end - - ## in case 0 is a root, we remove from p. Should be unnecessary, but ... - p,k = multiplicity(p, 0) - - M = Roots.upperbound(p) - - for k in 0:floor(Integer,M) ## we consider [k, k+1) for roots until [k, ∞) has just 0, 1 more roots. - q = Tλ(p, k) ## shift p left by k so this is p on [k, ∞) - - no_left = descartes_bound(q) - if no_left == 0 - break - elseif no_left == 1 - _iszero(polyval(p, k)) ? push!(rts, k) : push!(rts, getIsolatedRoot(p, k, M+1)) - break - end - - ## more to do, [k, ∞) might have 2 or more roots... - st = find_in_01(q) - for i in st.Exact - push!(rts, k + i) - p, mult = multiplicity(p, k+i) - end - for i in st.Isol - push!(rts, k + getIsolatedRoot(q,i)) - end - end - rts -end -neg_roots(p::Poly) = pos_roots(polyval(p, -variable(p))) - -## use Rational{BigInt} to find real roots -## returns Any[] array as we might mix Rational{BigInt} and BigFloat values -function real_roots_sqfree(p::Poly) - ## Handle simple cases - degree(p) == 0 && error("Roots for degree 0 polynomials are either empty or all of R.") - degree(p) == 1 && return([ -p[0]/p[1] ]) - - rts = Any[] - - p,k = multiplicity(p, 0); k > 0 && push!(rts, 0) # 0 - append!(rts, pos_roots(p)) # positive roots - append!(rts, map(-,neg_roots(p))) # negative roots - rts -end - - -function real_roots{T <: Union{Rational{Int}, Rational{BigInt}}}(p::Poly{T}) - c, q = PolynomialFactors.Qx_to_Zx(p) - real_roots(q) -end - - -function real_roots{T <: Union{Int, BigInt}}(p::Poly{T}) - f = PolynomialFactors.square_free(p) - rts = Real[] - rat_rts = rational_roots(p) - append!(rts, rat_rts) - - for rt in rat_rts - f, k = PolynomialFactors.synthetic_division(f, rt) - end - - if degree(f) > 0 - real_rts = real_roots_sqfree(f) - append!(rts, real_rts) - sort!(rts) - end - - return rts -end - -function real_roots(p::Poly) - ## Handle simple cases - p = convert(Poly{Float64}, p) - if degree(p) > 1 - u, p, w, residual= agcd(p) - end - - real_roots_sqfree(p) -end - - - diff --git a/src/Roots.jl b/src/Roots.jl index 6f5ba12e..71d645f1 100644 --- a/src/Roots.jl +++ b/src/Roots.jl @@ -1,25 +1,19 @@ __precompile__(true) module Roots + import Base: * -using Polynomials -import Polynomials: roots -using PolynomialFactors using ForwardDiff using Compat - - -export roots - export fzero, fzeros, newton, halley, secant_method, steffensen, - multroot, polyfactor, - D, D2 + D +export multroot, D2 # deprecated export find_zero, Order0, Order1, Order2, Order5, Order8, Order16 @@ -32,12 +26,6 @@ include("find_zero.jl") include("bracketing.jl") include("derivative_free.jl") include("newton.jl") -include("Polys/polynomials.jl") -include("Polys/agcd.jl") -include("Polys/multroot.jl") -include("Polys/real_roots.jl") - - ## Main functions are @@ -144,86 +132,17 @@ fzero(f::Function, fp::Function, x0::Real; kwargs...) = newton(f, fp, float(x0); -""" - -Find zero of a polynomial with derivative free algorithm. - -Arguments: - -* `p` a `Poly` object -* `x0` an initial guess - -Returns: - -An approximate root or an error. - -See `fzeros(p)` to return all real roots. - -""" -function fzero(p::Poly, x0::Real, args...; kwargs...) - fzero(convert(Function, p), float(x0), args...; kwargs...) -end - -function fzero{T <: Real}(p::Poly, bracket::Vector{T}; kwargs...) - a, b = float(bracket[1]), float(bracket[2]) - fzero(convert(Function, p), a, b; kwargs...) -end -function fzero{T <: Real}(p::Poly, x0::Real, bracket::Vector{T}; kwargs...) - fzero(convert(Function,p), float(x0), map(float,bracket); kwargs...) -end - - ## fzeros - -""" - -Find real zeros of a polynomial - -args: - -`f`: a Polynomial function of R -> R. May also be of `Poly` type. - -For polynomials in Z[x] or Q[x], the `real_roots` method will use -`Poly{Rational{BigInt}}` arithmetic, which allows it to handle much -larger degree polynomials accurately. This can be called directly -using `Polynomial` objects. - -""" -fzeros(p::Poly) = real_roots(p) - - - -function fzeros(f) - p = poly([0.0]) - try - p = convert(Poly, f) - catch e - error("If f(x) is not a polynomial in x, then an interval to search over is needed") - end - zs = fzeros(p) - ## Output is mixed, integer, rational, big. We tidy up - etype = eltype(f(0.0)) - ietype = eltype(f(0)) - out = Real[] - for z in zs - if isa(z, Rational) - val = z.den == 1 ? convert(ietype, z.num) : convert(Rational{ietype}, z) - push!(out, val) - else - push!(out, convert(etype, z)) - end - end - sort(out) -end - """ +`fzeros(f, a, b)` + Attempt to find all zeros of `f` within an interval `[a,b]`. Simple algorithm that splits `[a,b]` into subintervals and checks each for a root. For bracketing subintervals, bisection is used. Otherwise, a derivative-free method is used. If there are a -large number of roots found relative to the number of subintervals, the +large number of zeros found relative to the number of subintervals, the number of subintervals is increased and the process is re-run. There are possible issues with close-by zeros and zeros which do not @@ -231,39 +150,47 @@ cross the origin (non-simple zeros). Answers should be confirmed graphically, if possible. """ -function fzeros{T <: Real}(f, bracket::Vector{T}; kwargs...) - ## check if a poly - try - rts = fzeros(f) - filter(x -> bracket[1] <= x <= bracket[2], rts) - catch e - find_zeros(f, float(bracket[1]), float(bracket[2]); kwargs...) - end +function fzeros(f, a::Real, b::Real; kwargs...) + find_zeros(f, float(a), float(b); kwargs...) end -fzeros(f::Function, a::Real, b::Real; kwargs...) = fzeros(f, [a,b]; kwargs...) +fzeros{T <: Real}(f, bracket::Vector{T}; kwargs...) = fzeros(f, a, b; kwargs...) -""" -Factor a polynomial function with rational or integer coefficients over the integers. -Returns a dictionary with irreducible factors and their multiplicities. -See `multroot` to do similar act over polynomials with real coefficients. -Example: +## deprecate Polynomial calls + +## Don't want to load `Polynomials` to do this... +# @deprecate roots(p) fzeros(p, a, b) + +@deprecate D2(f) D(f,2) +fzeros(p) = Base.depwarn(""" +Calling fzeros with just a polynomial is deprecated. +Either: + * Specify an interval to search over: fzeros(p, a, b). + * Use the `realroots` function from `PolynomialZeros` + * Use `Polynomials` or `PolynomialRoots` and filter. For example, + ``` -polyfactor(x -> (x-1)^3*(x-2)) +using Polynomials +x=variable() +filter(isreal, roots(f(x))) ``` -""" -function polyfactor(f::Function) - T = typeof(f(0)) - p = Polynomials.variable(T) - try - p = convert(Poly{T}, f) - catch e - throw(DomainError()) # `factor` only works with polynomial functions" - end - PolynomialFactors.factor(p) -end + +""",:fzeros) +multroot(p) = Base.depwarn("The multroot function has moved to the PolynomialZeros package.",:multroot) +polyfactor(p) = Base.depwarn(""" +The polyfactor function is in the PolynomialFactors package: -end +* if `p` is of type `Poly`: `PolynomialFactors.factor(p)`. + +* if `p` is a function, try: +``` +using PolynomialFactors, Polynomials +x = variable(Int) +PolynomialFactors.factor(p(x)) +``` + +""",:polyfactor) +end diff --git a/test/runtests.jl b/test/runtests.jl index 65e62ed6..cfc1a186 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -6,7 +6,6 @@ include("./test_find_zero.jl") #run_benchmark_tests() include("./test_fzero.jl") -include("./tests_multroot.jl") #include("./test_fzero3.jl") #run_robustness_test() diff --git a/test/test_find_zero.jl b/test/test_find_zero.jl index e7d29ec4..b4cdb9e4 100644 --- a/test/test_find_zero.jl +++ b/test/test_find_zero.jl @@ -126,10 +126,10 @@ fn, xstar, x0 = (x -> x * exp( - x ), 0, 1.0) ## Callable objects -using Polynomials -x = variable(Float64) +type _SampleCallableObject end +_SampleCallableObject(x) = x^5 - x - 1 for m in meths - @test find_zero(x^5 - x - 1, 1.0, m) ≈ 1.1673039782614187 + @test find_zero(_SampleCallableObject, 1.0, m) ≈ 1.1673039782614187 end ### a wrapper to count function calls, say diff --git a/test/tests_multroot.jl b/test/tests_multroot.jl deleted file mode 100644 index ba97084e..00000000 --- a/test/tests_multroot.jl +++ /dev/null @@ -1,76 +0,0 @@ -using Roots -using Polynomials -using Base.Test - -## can use functions -f = x -> (x-1)*(x-2)^2*(x-3)^3 -zs, mults = multroot(f) -@test sort(mults) == [1,2,3] - -x = poly([0.0]) - -p = (x-1)*(x-2)^2*(x-3)^3 -zs, mults = multroot(p) -@test sort(mults) == [1,2,3] - -p = (x-1)^2*(x-2)^2*(x-3)^4 -zs, mults = multroot(p) -@test sort(mults) == [2,2,4] - -p = (x-1)^2 -zs, mults = multroot(p^14) -@test mults == [28] - -## test for roots of polynomial functions -roots(x -> x^5 - x + 1) - -## test for real roots of polynomial functions -fzeros(x -> x^5 - 1.5x + 1) - - -## for polynomials in Z[x], Q[x] can use algorithm to be accurate for higher degree - -@test fzeros(x -> x - 1)[1] == 1.0 # linear -f = x -> (x-1)*(x-2)*(x-3)^3*(x^2+1) -rts = fzeros(f) -rts = Float64[r for r in rts] -@test maximum(map(abs, sort(rts) - [1.0, 2.0, 3.0])) <= 1e-12 -x = poly([big(0)]) -p = prod([x - i for i in 1:20]) -Roots.real_roots(p) ## can find this -f = x -> (x-20)^5 - (x-20) + 1 -a = fzeros(f)[1] -@assert abs(f(a)) <= 1e-14 - -x = poly([0.0]) -@test map(abs, fzeros((x-20)^5 - (x-20) + 1)[1] - (20 + fzeros(x^5 - x + 1)[1])) <= 1/2 - -fzeros(x -> x^5 - 2x^4 + x^3) - -## factor -polyfactor(x -> (x-2)^4*(x-3)^9) -polyfactor(x -> (x-1)^3 * (x-2)^3 * (x^5 - x + 1)) -polyfactor(x -> x*(x-1)*(x-2)*(x^2 + x + 1)) -polyfactor(x -> x^2 - big(2)^256) # issue #40 - -polyfactor(x -> (x-1//1)^2 * (x-99//100)^2 * (x-101//100)^2) ## conversion is to Float, not Rational{Int} - -## factor only works over Integers and rationals, for floats multroot can be used. -multroot(x -> (x-1)^2 * (x-.99)^2 * (x-1.01)^2) ## can have issue with nearby roots (or high powers) - -## Test conversion of polynomials to Int -f = x -> 3x^3 - 2x -convert(Polynomials.Poly{Int}, f) -f = x -> (3x^3 - 2x)/3 -convert(Polynomials.Poly{Int}, f) -f = x -> x^2 / x # rational functions fails -@test_throws MethodError convert(Polynomials.Poly{Int64}, f) -f = x -> (x^2 + x)^2 -convert(Polynomials.Poly{Int}, f) -f = x -> (x^2 + x)^(1/2) -@test_throws MethodError convert(Polynomials.Poly{Int64}, f) - - -## polynomial conversions from functions in practice -fzeros(x -> 265 - 0.65x) -fzeros(x -> -16x^2 + 200x)