Révision 181
pobysoPythonSage/src/pobyso.py (revision 181) | ||
---|---|---|
1158 | 1158 |
#polySo = taylorFormListSaSo[0] |
1159 | 1159 |
#errorRangeSo = sollya_lib_copy_obj(taylorFormListSaSo[2]) |
1160 | 1160 |
errorRangeSo = taylorFormListSaSo[2] |
1161 |
# No copy_obj needed here: a new object is created. |
|
1162 |
maxErrorSo = sollya_lib_sup(errorRangeSo) |
|
1161 |
# No copy_obj needed here: a new objects are created. |
|
1162 |
maxErrorSo = sollya_lib_sup(errorRangeSo) |
|
1163 |
minErrorSo = sollya_lib_inf(errorRangeSo) |
|
1164 |
absMaxErrorSo = sollya_lib_abs(maxErrorSo) |
|
1165 |
absMinErrorSo = sollya_lib_abs(minErrorSo) |
|
1166 |
sollya_lib_clear_obj(maxErrorSo) |
|
1167 |
sollya_lib_clear_obj(minErrorSo) |
|
1168 |
absMaxErrorSa = pobyso_get_constant_as_rn_so_sa(absMaxErrorSo) |
|
1169 |
absMinErrorSa = pobyso_get_constant_as_rn_so_sa(absMinErrorSo) |
|
1163 | 1170 |
# If changed, reset the Sollya working precision. |
1164 | 1171 |
if not sollyaPrecSo is None: |
1165 | 1172 |
sollya_lib_set_prec(initialPrecSo) |
... | ... | |
1167 | 1174 |
if errorTypeIsNone: |
1168 | 1175 |
sollya_lib_clear_obj(errorTypeSo) |
1169 | 1176 |
pobyso_clear_taylorform_sa_so(taylorFormListSaSo) |
1170 |
return((polySo, intervalCenterSo, maxErrorSo)) |
|
1177 |
if absMaxErrorSa > absMinErrorSa: |
|
1178 |
sollya_lib_clear_obj(absMinErrorSo) |
|
1179 |
return((polySo, intervalCenterSo, absMaxErrorSo)) |
|
1180 |
else: |
|
1181 |
sollya_lib_clear_obj(absMaxErrorSo) |
|
1182 |
return((polySo, intervalCenterSo, absMinErrorSo)) |
|
1171 | 1183 |
# end pobyso_taylor_expansion_no_change_var_so_so |
1172 | 1184 |
|
1173 | 1185 |
def pobyso_taylor_expansion_with_change_var_so_so(functionSo, degreeSo, \ |
... | ... | |
1200 | 1212 |
pobyso_get_list_elements_so_so(taylorFormSo) |
1201 | 1213 |
polySo = taylorFormListSo[0] |
1202 | 1214 |
errorRangeSo = taylorFormListSo[2] |
1203 |
maxErrorSo = sollya_lib_sup(errorRangeSo) |
|
1215 |
maxErrorSo = sollya_lib_sup(errorRangeSo) |
|
1216 |
minErrorSo = sollya_lib_inf(errorRangeSo) |
|
1217 |
absMaxErrorSo = sollya_lib_abs(maxErrorSo) |
|
1218 |
absMinErrorSo = sollya_lib_abs(minErrorSo) |
|
1219 |
sollya_lib_clear_obj(maxErrorSo) |
|
1220 |
sollya_lib_clear_obj(minErrorSo) |
|
1221 |
absMaxErrorSa = pobyso_get_constant_as_rn_so_sa(absMaxErrorSo) |
|
1222 |
absMinErrorSa = pobyso_get_constant_as_rn_so_sa(absMinErrorSo) |
|
1204 | 1223 |
changeVarExpSo = sollya_lib_build_function_sub(\ |
1205 | 1224 |
sollya_lib_build_function_free_variable(),\ |
1206 | 1225 |
sollya_lib_copy_obj(intervalCenterSo)) |
1207 |
polyVarChangedSo = sollya_lib_evaluate(polySo, changeVarExpSo) |
|
1226 |
polyVarChangedSo = sollya_lib_evaluate(polySo, changeVarExpSo) |
|
1227 |
sollya_lib_clear_obj(polySo) |
|
1208 | 1228 |
sollya_lib_clear_obj(changeVarExpSo) |
1209 | 1229 |
# If changed, reset the Sollya working precision. |
1210 | 1230 |
if not sollyaPrecSo is None: |
... | ... | |
1214 | 1234 |
sollya_lib_clear_obj(errorTypeSo) |
1215 | 1235 |
sollya_lib_clear_obj(taylorFormSo) |
1216 | 1236 |
# Do not clear maxErrorSo. |
1217 |
return((polyVarChangedSo, intervalCenterSo, maxErrorSo)) |
|
1237 |
if absMaxErrorSa > absMinErrorSa: |
|
1238 |
sollya_lib_clear_obj(absMinErrorSo) |
|
1239 |
return((polyVarChangedSo, intervalCenterSo, absMaxErrorSo)) |
|
1240 |
else: |
|
1241 |
sollya_lib_clear_obj(absMaxErrorSo) |
|
1242 |
return((polyVarChangedSo, intervalCenterSo, absMinErrorSo)) |
|
1218 | 1243 |
# end pobyso_taylor_expansion_with_change_var_so_so |
1219 | 1244 |
|
1220 | 1245 |
def pobyso_taylor(function, degree, point): |
pobysoPythonSage/src/sollya_lib.sage (revision 181) | ||
---|---|---|
11 | 11 |
try: |
12 | 12 |
# Export the functions with their name in the library (so we can |
13 | 13 |
# use them without the "sollya." prefix). |
14 |
sollya_lib_abs = sollya.sollya_lib_abs |
|
14 | 15 |
sollya_lib_absolute = sollya.sollya_lib_absolute |
15 | 16 |
sollya_lib_autoprint = sollya.sollya_lib_autoprint |
16 | 17 |
sollya_lib_build_function_add = sollya.sollya_lib_build_function_add |
pobysoPythonSage/src/sageSLZ/sageSLZ.sage (revision 181) | ||
---|---|---|
426 | 426 |
absoluteErrorTypeSo) |
427 | 427 |
maxErrorSa = pobyso_get_constant_as_rn_with_rf_so_sa(maxErrorSo) |
428 | 428 |
while maxErrorSa > approxPrecSa: |
429 |
print "++Approximation error:", maxErrorSa |
|
429 |
print "++Approximation error:", maxErrorSa.n()
|
|
430 | 430 |
sollya_lib_clear_obj(polySo) |
431 | 431 |
sollya_lib_clear_obj(intervalCenterSo) |
432 | 432 |
sollya_lib_clear_obj(maxErrorSo) |
433 |
# Very empirical schrinking factor.
|
|
433 |
# Very empirical shrinking factor. |
|
434 | 434 |
shrinkFactorSa = 1 / (maxErrorSa/approxPrecSa).log2().abs() |
435 |
print "Shrink factor:", shrinkFactorSa, intervalShrinkConstFactorSa |
|
435 |
print "Shrink factor:", \ |
|
436 |
shrinkFactorSa.n(), \ |
|
437 |
intervalShrinkConstFactorSa |
|
436 | 438 |
#errorRatioSa = approxPrecSa/maxErrorSa |
437 | 439 |
#print "Error ratio: ", errorRatioSa |
440 |
# Make sure interval shrinks. |
|
438 | 441 |
if shrinkFactorSa > intervalShrinkConstFactorSa: |
439 | 442 |
actualShrinkFactorSa = intervalShrinkConstFactorSa |
440 | 443 |
#print "Fixed" |
... | ... | |
444 | 447 |
#print shrinkFactorSa, maxErrorSa |
445 | 448 |
#print "Shrink factor", actualShrinkFactorSa |
446 | 449 |
currentUpperBoundSa = currentLowerBoundSa + \ |
447 |
(currentUpperBoundSa - currentLowerBoundSa) * \
|
|
448 |
actualShrinkFactorSa
|
|
450 |
(currentUpperBoundSa - currentLowerBoundSa) * \ |
|
451 |
actualShrinkFactorSa |
|
449 | 452 |
#print "Current upper bound:", currentUpperBoundSa |
450 | 453 |
sollya_lib_clear_obj(currentRangeSo) |
454 |
# Check what is left with the bounds. |
|
451 | 455 |
if currentUpperBoundSa <= currentLowerBoundSa or \ |
452 | 456 |
currentUpperBoundSa == currentLowerBoundSa.nextabove(): |
453 | 457 |
sollya_lib_clear_obj(absoluteErrorTypeSo) |
... | ... | |
1349 | 1353 |
is not 0. |
1350 | 1354 |
Return () otherwise. |
1351 | 1355 |
""" |
1352 |
polynomialRing0 = poly1.parent() |
|
1356 |
polynomialRing0 = poly1.parent()
|
|
1353 | 1357 |
resultantInElimVar = poly1.resultant(poly2,polynomialRing0(elimVar)) |
1354 | 1358 |
if resultantInElimVar.is_zero(): |
1355 | 1359 |
return () |
pobysoPythonSage/src/testPobyso.sage (revision 181) | ||
---|---|---|
277 | 277 |
return timing |
278 | 278 |
# End test_pobyso_taylor_expansion_no_change_var_so_so |
279 | 279 |
|
280 |
def test_pobyso_taylor_expansion_with_change_var_so_so(repeat=1000, number=10): |
|
281 |
functionName = inspect.stack()[0][3] |
|
282 |
print "Running", functionName, "..." |
|
283 |
functionSo = pobyso_parse_string('exp(x)') |
|
284 |
degreeSo = pobyso_constant_from_int_sa_so(20) |
|
285 |
rangeSo = pobyso_bounds_to_range_sa_so(RR(1),RR(2)) |
|
286 |
errorTypeSo = pobyso_absolute_so_so() |
|
287 |
def test(functionSo, degreeSo, rangeSo, errorTypeSo): |
|
288 |
teSo = pobyso_taylor_expansion_with_change_var_so_so(functionSo, |
|
289 |
degreeSo, |
|
290 |
rangeSo, |
|
291 |
errorTypeSo) |
|
292 |
sollya_lib_clear_obj(teSo[0]) |
|
293 |
sollya_lib_clear_obj(teSo[1]) |
|
294 |
sollya_lib_clear_obj(teSo[2]) |
|
295 |
# End test |
|
296 |
wrapped = test_pobyso_wrapper(test, |
|
297 |
functionSo, |
|
298 |
degreeSo, |
|
299 |
rangeSo, |
|
300 |
errorTypeSo) |
|
301 |
timing = min(timeit.repeat(wrapped, repeat=repeat, number=number)) |
|
302 |
sollya_lib_clear_obj(functionSo) |
|
303 |
sollya_lib_clear_obj(degreeSo) |
|
304 |
sollya_lib_clear_obj(rangeSo) |
|
305 |
sollya_lib_clear_obj(errorTypeSo) |
|
306 |
print "\t...", functionName, "done." |
|
307 |
return timing |
|
308 |
# End test_pobyso_taylor_expansion_with_change_var_so_so |
|
309 |
|
|
280 | 310 |
def test_pobyso_taylorform_so_so_2(repeat=1000, number=10): |
281 | 311 |
functionName = inspect.stack()[0][3] |
282 | 312 |
print "Running", functionName, "..." |
Formats disponibles : Unified diff