@@ -6,14 +6,14 @@ module Polynomials
6
6
using Compat
7
7
8
8
export Poly, poly
9
- export degree, coeffs
9
+ export degree, coeffs, variable
10
10
export polyval, polyint, polyder, roots, polyfit
11
11
export Pade, padeval
12
12
export truncate!
13
13
14
14
import Base: length, endof, getindex, setindex!, copy, zero, one, convert, norm, gcd
15
15
import Base: show, print, * , / , // , - , + , == , divrem, div, rem, eltype
16
- import Base: promote_rule, truncate
16
+ import Base: promote_rule, truncate, chop
17
17
if VERSION >= v " 0.4"
18
18
import Base. call
19
19
end
@@ -119,14 +119,14 @@ eltype{T}(::Poly{T}) = T
119
119
120
120
"""
121
121
length (p:: Poly ) = length (p. a)
122
+ endof (p:: Poly ) = length (p) - 1
122
123
123
124
"""
124
125
125
126
`degree(p::Poly)`: return degree of polynomial `p`
126
127
127
128
"""
128
129
degree (p:: Poly ) = length (p) - 1
129
- endof (p:: Poly ) = length (p) - 1
130
130
131
131
"""
132
132
@@ -137,14 +137,46 @@ coeffs(p::Poly) = p.a
137
137
138
138
"""
139
139
140
+ Return the indeterminate of a polynomial, `x`.
141
+
142
+ * `variable(p::Poly)`: return variable of `p` as a `Poly` object.
143
+ * `variable(T<:Number, [:x])`: return poly one(T)*x
144
+ * `variable([var::Symbol])`: return polynomial 1x over `Float64`.
145
+
146
+ """
147
+ variable {T} (p:: Poly{T} ) = poly (zeros (T,1 ), p. var)
148
+ variable {T<:Number} (:: Type{T} , var= :x ) = poly (zeros (T,1 ), var)
149
+ variable (var:: Symbol = :x ) = poly ([0.0 ], var)
150
+
151
+ """
152
+
140
153
`truncate{T}(p::Poly{T}; reltol = eps(T), abstol = eps(T))`: returns a polynomial with coefficients a_i truncated to zero if |a_i| <= reltol*maxabs(a)+abstol
141
154
142
155
"""
143
156
function truncate {T} (p:: Poly{T} ; reltol = eps (T), abstol = eps (T))
144
157
a = coeffs (p)
145
158
amax = maxabs (a)
146
159
anew = map (ai -> abs (ai) <= amax* reltol+ abstol ? zero (T) : ai, a)
147
- return Poly (anew)
160
+ return Poly (anew, p. var)
161
+ end
162
+
163
+ """
164
+
165
+ `chop(p::Poly{T}; kwargs...)` chop off leading values which are
166
+ approximately zero. The tolerances are passed to `isapprox`.
167
+
168
+ """
169
+ function chop {T} (p:: Poly{T} ; reltol= zero (T), abstol= 2 * eps (T))
170
+ c = copy (p. a)
171
+ for k= length (c): - 1 : 1
172
+ if ! isapprox (c[k], zero (T); rtol= reltol, atol= abstol)
173
+ resize! (c, k)
174
+ return Poly (c, p. var)
175
+ end
176
+ end
177
+
178
+ resize! (c,0 )
179
+ Poly (c, p. var)
148
180
end
149
181
150
182
"""
0 commit comments