JuliaMath / Polynomials.jl

Polynomial manipulations in Julia
http://juliamath.github.io/Polynomials.jl/
Other
303 stars 75 forks source link

Polynomials.fit changes behavior somewhere between (inclusive) Julia 1.7.3 and Julia 1.10.4, the latter being self-inconsistent (problematic) #579

Open pchavez201706 opened 2 months ago

pchavez201706 commented 2 months ago

This is my first issue report, so please forgive me if I "didn't get the memo" about this finding at some earlier date, but it's quite simple and shouldn't waste much time in the worst-case:

In Julia 1.7.3, Polynomials.fit with the third input argument ("deg"), i.e., the degree of the polynomial desired, of value x always returns a Polynomial of x+1 number of coefficients.

In Julia 1.10.4, Polynomials.fit with the third input argument ("deg") of value x ALMOST always returns a Polynomial of x+1 number of coefficients.

MWE (note the difference in one of the returns between the two code blocks with the same two Polynomial.fit commands run in the two Julia versions):

               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.7.3 (2022-05-06)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> using Polynomials

julia> x=-2:1
-2:1

julia> y=[0.0360126786947437, 0.020007043719302054, 0.0360126786947437, 0.020007043719302054]
4-element Vector{Float64}:
 0.0360126786947437
 0.020007043719302054
 0.0360126786947437
 0.020007043719302054

julia> Polynomials.fit(x,y,2).coeffs
3-element Vector{Float64}:
  0.026409297709478707
 -0.0032011269950883254
  6.640921040373548e-19

julia> y=[0.00361, 0.00201, 0.00361, 0.00201]
4-element Vector{Float64}:
 0.00361
 0.00201
 0.00361
 0.00201

julia> Polynomials.fit(x,y,2).coeffs
3-element Vector{Float64}:
  0.00265
 -0.00031999999999999976
 -2.926366747177586e-19
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.10.4 (2024-06-04)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> using Polynomials

julia> x=-2:1
-2:1

julia> y=[0.0360126786947437, 0.020007043719302054, 0.0360126786947437, 0.020007043719302054]
4-element Vector{Float64}:
 0.0360126786947437
 0.020007043719302054
 0.0360126786947437
 0.020007043719302054

julia> Polynomials.fit(x,y,2).coeffs
2-element Vector{Float64}:
  0.026409297709478707
 -0.0032011269950883254

julia> y=[0.00361, 0.00201, 0.00361, 0.00201]
4-element Vector{Float64}:
 0.00361
 0.00201
 0.00361
 0.00201

julia> Polynomials.fit(x,y,2).coeffs
3-element Vector{Float64}:
  0.00265
 -0.0003199999999999998
 -2.5554890278056236e-19
jverzani commented 3 weeks ago

Sorry not too have responded. I thought this was due to some internal rounding where the last digit is numerically zero, but on my machine it isn't happening:

julia> using Polynomials

julia> x=-2:1
-2:1

julia> y=[0.0360126786947437, 0.020007043719302054, 0.0360126786947437, 0.020007043719302054]
4-element Vector{Float64}:
 0.0360126786947437
 0.020007043719302054
 0.0360126786947437
 0.020007043719302054

julia> Polynomials.fit(x,y,2).coeffs
3-element Vector{Float64}:
  0.02640929770947871
 -0.0032011269950883276
 -8.177564888977996e-19

In the constructor we have a check for trailing zeros. One way to avoid this if it happens would be to using Polynomials.PnPolynomial which doesn't include that check.