193 |
193 |
return (minCoeffsExpList, maxCoeffsExpList)
|
194 |
194 |
# End cvp_coefficients_bounds_projection_exps
|
195 |
195 |
|
|
196 |
def cvp_chebyshev_maxis_1k(numPoints, realField, contFracMaxErr = None):
|
|
197 |
"""
|
|
198 |
Compute the Chebyshev maxis for some polynomial degree (numPoints, for the
|
|
199 |
zeros) scaled to the [lowerBound, upperBound] interval.
|
|
200 |
The list is returned as row floating-point numbers is contFracMaxErr is None.
|
|
201 |
Otherwise elements are transformed into rational numbers.
|
|
202 |
"""
|
|
203 |
if numPoints < 1:
|
|
204 |
return None
|
|
205 |
if numPoints == 0:
|
|
206 |
return [0]
|
|
207 |
## Check that realField has a "prec()" member.
|
|
208 |
try:
|
|
209 |
realField.prec()
|
|
210 |
except:
|
|
211 |
return None
|
|
212 |
#
|
|
213 |
maxisList = []
|
|
214 |
## n extrema are given by a degree (n-1) Chebyshev polynomial.
|
|
215 |
# formulas: cos ((i * pi) / (numPoints - 1)) for i = 0,...,numPoints-1.
|
|
216 |
# Source: https://en.wikipedia.org/wiki/Chebyshev_polynomials
|
|
217 |
for index in xrange(0, numPoints):
|
|
218 |
## When number of points is odd (then, the Chebyshev degree is odd two),
|
|
219 |
# the central point is 0. */
|
|
220 |
if (numPoints % 2 == 1) and ((2 * index + 1) == numPoints):
|
|
221 |
if contFracMaxErr is None:
|
|
222 |
maxisList.append(realField(0))
|
|
223 |
else:
|
|
224 |
maxisList.append(0)
|
|
225 |
else:
|
|
226 |
currentCheby = \
|
|
227 |
((realField(index) * realField(pi)) /
|
|
228 |
realField(numPoints-1)).cos()
|
|
229 |
#print "Current Cheby:", currentCheby
|
|
230 |
## Result is negated to have an increasing order list.
|
|
231 |
if contFracMaxErr is None:
|
|
232 |
maxisList.append(-currentCheby)
|
|
233 |
else:
|
|
234 |
maxisList.append(-currentCheby.nearby_rational(contFracMaxErr))
|
|
235 |
#print "Relative error:", (currentCheby/maxisList[index])
|
|
236 |
return maxisList
|
|
237 |
# End cvp_chebyshev_maxis_1k.
|
|
238 |
#
|
|
239 |
def cvp_chebyshev_maxis_for_interval(lowerBound,
|
|
240 |
upperBound,
|
|
241 |
numPoints,
|
|
242 |
realField = None,
|
|
243 |
contFracMaxErr = None):
|
|
244 |
"""
|
|
245 |
Compute the Chebyshev maxis for some polynomial degree (numPoints, for the
|
|
246 |
maxis) scaled to the [lowerBound, upperBound] interval.
|
|
247 |
If no contFracMaxErr argument is given, we return the list as "raw"
|
|
248 |
floating-points. Otherwise, rational numbers are returned.
|
|
249 |
"""
|
|
250 |
## Arguments check.
|
|
251 |
if lowerBound >= upperBound:
|
|
252 |
return None
|
|
253 |
if numPoints < 1:
|
|
254 |
return None
|
|
255 |
## If no realField argument is given try to retrieve it from the
|
|
256 |
# bounds. If impossible (e.g. rational bound), fall back on RR.
|
|
257 |
if realField is None:
|
|
258 |
try:
|
|
259 |
### Force failure if parent does not have prec() member.
|
|
260 |
lowerBound.parent().prec()
|
|
261 |
### If no exception is thrown, set realField.
|
|
262 |
realField = lowerBound.parent()
|
|
263 |
except:
|
|
264 |
realField = RR
|
|
265 |
#print "Real field:", realField
|
|
266 |
## We want "raw"floating-point nodes to only have one final rounding.
|
|
267 |
chebyshevMaxisList = \
|
|
268 |
cvp_chebyshev_maxis_1k(numPoints, realField)
|
|
269 |
scalingFactor, offset = cvp_affine_from_chebyshev(lowerBound, upperBound)
|
|
270 |
for index in xrange(0, len(chebyshevMaxisList)):
|
|
271 |
chebyshevMaxisList[index] = \
|
|
272 |
chebyshevMaxisList[index] * scalingFactor + offset
|
|
273 |
if not contFracMaxErr is None:
|
|
274 |
chebyshevMaxisList[index] = \
|
|
275 |
chebyshevMaxisList[index].nearby_rational(contFracMaxErr)
|
|
276 |
return chebyshevMaxisList
|
|
277 |
# End cvp_chebyshev_maxis_for_interval.
|
|
278 |
#
|
196 |
279 |
def cvp_chebyshev_zeros_1k(numPoints, realField, contFracMaxErr = None):
|
197 |
280 |
"""
|
198 |
281 |
Compute the Chebyshev zeros for some polynomial degree (numPoints, for the
|