Révision 162 pobysoPythonSage/src/pobyso.py

pobyso.py (revision 162)
99 99
    """
100 100
    Return a Sollya range from to 2 RealField Sage elements.
101 101
    The Sollya range element has a sufficient precision to hold all
102
    the digits of the Sage bounds.
102
    the digits of the widest of the Sage bounds.
103 103
    """
104 104
    # Sanity check.
105 105
    if rnLowerBoundSa > rnUpperBoundSa:
......
113 113
    else:
114 114
        maxPrecSa = precisionSa
115 115
    # From Sage to Sollya bounds.
116
    lowerBoundSo = sollya_lib_constant(get_rn_value(rnLowerBoundSa),
116
#    lowerBoundSo = sollya_lib_constant(get_rn_value(rnLowerBoundSa),
117
#                                       maxPrecSa)
118
    lowerBoundSo = pobyso_constant_sa_so(rnLowerBoundSa,
119
                                         maxPrecSa)
120
    upperBoundSo = pobyso_constant_sa_so(rnUpperBoundSa,
117 121
                                       maxPrecSa)
118
    upperBoundSo = sollya_lib_constant(get_rn_value(rnUpperBoundSa),
119
                                       maxPrecSa)
122
    
120 123
    # From Sollya bounds to range.
121 124
    rangeSo = sollya_lib_range(lowerBoundSo, upperBoundSo)
122 125
    # Back to original precision.
......
798 801
    else:
799 802
        degreeBoundSo = None
800 803
    guessedDegreeSa = pobyso_guess_degree_so_sa(functionSo,
801
                                              rangeSo,
802
                                              approxErrorSo,
803
                                              weightSo,
804
                                              degreeBoundSo)
804
                                                rangeSo,
805
                                                approxErrorSo,
806
                                                weightSo,
807
                                                degreeBoundSo)
805 808
    sollya_lib_clear_obj(functionSo)
806 809
    sollya_lib_clear_obj(rangeSo)
807 810
    sollya_lib_clear_obj(approxErrorSo)
......
831 834
    if neededPrecisionSa > currentPrecSa:
832 835
        currentPrecSo = pobyso_get_prec_so()
833 836
        pobyso_set_prec_sa_so(neededPrecisionSa)
837
    print "Guessing degree..."
834 838
    # weightSo and degreeBoundsSo are optional arguments.
839
    # As declared, sollya_lib_guessdegree must take 5 arguments.
835 840
    if weightSo is None:
836
        degreeRangeSo = sollya_lib_guessdegree(functionSo, rangeSo, errorSo, None)
841
        degreeRangeSo = sollya_lib_guessdegree(functionSo, rangeSo, errorSo, 
842
                                               0, 0, None)
837 843
    elif degreeBoundSo is None:
838 844
        degreeRangeSo =  sollya_lib_guessdegree(functionSo, rangeSo, \
839
                                                errorSo, weightSo, None)
845
                                                errorSo, weightSo, 0, None)
840 846
    else:
841 847
        degreeRangeSo =  sollya_lib_guessdegree(functionSo, rangeSo, errorSo, \
842 848
                                                weightSo, degreeBoundSo, None)
849
    print "Degree guess done."
843 850
    # Restore internal precision, if applicable.
844 851
    if neededPrecisionSa > currentPrecSa:
845 852
        pobyso_set_prec_so_so(currentPrecSo)
......
1117 1124
    return resultSo
1118 1125
# End pobyso_supnorm_so_so
1119 1126

  
1120
def pobyso_taylor_expansion_with_change_var_so_so(functionSo, degreeSo, \
1121
                                                  rangeSo, \
1122
                                                  errorTypeSo=None, \
1123
                                                  sollyaPrecSo=None):
1127
def pobyso_taylor_expansion_no_change_var_so_so(functionSo, 
1128
                                                degreeSo, 
1129
                                                rangeSo,
1130
                                                errorTypeSo=None, 
1131
                                                sollyaPrecSo=None):
1124 1132
    """
1125
    Compute the Taylor expansion with the variable change
1126
    x -> (x-intervalCenter) included.
1133
    Compute the Taylor expansion without the variable change
1134
    x -> x-intervalCenter.
1127 1135
    """
1128 1136
    # No global change of the working precision.
1129 1137
    if not sollyaPrecSo is None:
1130 1138
        initialPrecSo = sollya_lib_get_prec(None)
1131 1139
        sollya_lib_set_prec(sollyaPrecSo)
1132
    #
1133 1140
    # Error type stuff: default to absolute.
1134 1141
    if errorTypeSo is None:
1135 1142
        errorTypeIsNone = True
1136 1143
        errorTypeSo = sollya_lib_absolute(None)
1137 1144
    else:
1138 1145
        errorTypeIsNone = False
1139
    intervalCenterSo = sollya_lib_mid(rangeSo)
1140
    taylorFormSo = sollya_lib_taylorform(functionSo, degreeSo, \
1141
                                         intervalCenterSo, \
1146
    intervalCenterSo = sollya_lib_mid(rangeSo, None)
1147
    taylorFormSo = sollya_lib_taylorform(functionSo, degreeSo,
1148
                                         intervalCenterSo,
1142 1149
                                         rangeSo, errorTypeSo, None)
1143 1150
    # taylorFormListSaSo is a Python list of Sollya objects references that 
1144 1151
    # are copies of the elements of taylorFormSo.
1145 1152
    # pobyso_get_list_elements_so_so clears taylorFormSo.
1146
    (taylorFormListSo, numElements, isEndElliptic) = \
1153
    (taylorFormListSaSo, numElementsSa, isEndEllipticSa) = \
1147 1154
        pobyso_get_list_elements_so_so(taylorFormSo)
1148
    polySo = taylorFormListSo[0]
1149
    errorRangeSo = taylorFormListSo[2]
1155
    polySo = sollya_lib_copy_obj(taylorFormListSaSo[0])
1156
    #print "Num elements:", numElementsSa
1157
    sollya_lib_clear_obj(taylorFormSo)
1158
    #polySo = taylorFormListSaSo[0]
1159
    #errorRangeSo = sollya_lib_copy_obj(taylorFormListSaSo[2])
1160
    errorRangeSo = taylorFormListSaSo[2]
1161
    # No copy_obj needed here: a new object is created.
1150 1162
    maxErrorSo = sollya_lib_sup(errorRangeSo)
1151
    changeVarExpSo = sollya_lib_build_function_sub(\
1152
                       sollya_lib_build_function_free_variable(),\
1153
                       sollya_lib_copy_obj(intervalCenterSo))
1154
    polyVarChangedSo = sollya_lib_evaluate(polySo, changeVarExpSo) 
1155
    sollya_lib_clear_obj(changeVarExpSo)
1156 1163
    # If changed, reset the Sollya working precision.
1157 1164
    if not sollyaPrecSo is None:
1158 1165
        sollya_lib_set_prec(initialPrecSo)
1159 1166
        sollya_lib_clear_obj(initialPrecSo)
1160 1167
    if errorTypeIsNone:
1161 1168
        sollya_lib_clear_obj(errorTypeSo)
1162
    sollya_lib_clear_obj(taylorFormSo)
1163
    # Do not clear maxErrorSo.
1164
    return((polyVarChangedSo, intervalCenterSo, maxErrorSo))
1165
# end pobyso_taylor_expansion_with_change_var_so_so
1169
    pobyso_clear_taylorform_sa_so(taylorFormListSaSo)
1170
    return((polySo, intervalCenterSo, maxErrorSo))
1171
# end pobyso_taylor_expansion_no_change_var_so_so
1166 1172

  
1167
def pobyso_taylor_expansion_no_change_var_so_so(functionSo, degreeSo, rangeSo,
1168
                                                errorTypeSo=None, 
1169
                                                sollyaPrecSo=None):
1173
def pobyso_taylor_expansion_with_change_var_so_so(functionSo, degreeSo, \
1174
                                                  rangeSo, \
1175
                                                  errorTypeSo=None, \
1176
                                                  sollyaPrecSo=None):
1170 1177
    """
1171
    Compute the Taylor expansion without the variable change
1172
    x -> x-intervalCenter.
1178
    Compute the Taylor expansion with the variable change
1179
    x -> (x-intervalCenter) included.
1173 1180
    """
1174 1181
    # No global change of the working precision.
1175 1182
    if not sollyaPrecSo is None:
1176 1183
        initialPrecSo = sollya_lib_get_prec(None)
1177 1184
        sollya_lib_set_prec(sollyaPrecSo)
1185
    #
1178 1186
    # Error type stuff: default to absolute.
1179 1187
    if errorTypeSo is None:
1180 1188
        errorTypeIsNone = True
1181 1189
        errorTypeSo = sollya_lib_absolute(None)
1182 1190
    else:
1183 1191
        errorTypeIsNone = False
1184
    intervalCenterSo = sollya_lib_mid(rangeSo, None)
1185
    taylorFormSo = sollya_lib_taylorform(functionSo, degreeSo,
1186
                                         intervalCenterSo,
1192
    intervalCenterSo = sollya_lib_mid(rangeSo)
1193
    taylorFormSo = sollya_lib_taylorform(functionSo, degreeSo, \
1194
                                         intervalCenterSo, \
1187 1195
                                         rangeSo, errorTypeSo, None)
1188 1196
    # taylorFormListSaSo is a Python list of Sollya objects references that 
1189 1197
    # are copies of the elements of taylorFormSo.
1190 1198
    # pobyso_get_list_elements_so_so clears taylorFormSo.
1191
    (taylorFormListSaSo, numElementsSa, isEndEllipticSa) = \
1199
    (taylorFormListSo, numElements, isEndElliptic) = \
1192 1200
        pobyso_get_list_elements_so_so(taylorFormSo)
1193
    polySo = sollya_lib_copy_obj(taylorFormListSaSo[0])
1194
    #print "Num elements:", numElementsSa
1195
    sollya_lib_clear_obj(taylorFormSo)
1196
    #polySo = taylorFormListSaSo[0]
1197
    #errorRangeSo = sollya_lib_copy_obj(taylorFormListSaSo[2])
1198
    errorRangeSo = taylorFormListSaSo[2]
1199
    # No copy_obj needed here: a new object is created.
1201
    polySo = taylorFormListSo[0]
1202
    errorRangeSo = taylorFormListSo[2]
1200 1203
    maxErrorSo = sollya_lib_sup(errorRangeSo)
1204
    changeVarExpSo = sollya_lib_build_function_sub(\
1205
                       sollya_lib_build_function_free_variable(),\
1206
                       sollya_lib_copy_obj(intervalCenterSo))
1207
    polyVarChangedSo = sollya_lib_evaluate(polySo, changeVarExpSo) 
1208
    sollya_lib_clear_obj(changeVarExpSo)
1201 1209
    # If changed, reset the Sollya working precision.
1202 1210
    if not sollyaPrecSo is None:
1203 1211
        sollya_lib_set_prec(initialPrecSo)
1204 1212
        sollya_lib_clear_obj(initialPrecSo)
1205 1213
    if errorTypeIsNone:
1206 1214
        sollya_lib_clear_obj(errorTypeSo)
1207
    pobyso_clear_taylorform_sa_so(taylorFormListSaSo)
1208
    return((polySo, intervalCenterSo, maxErrorSo))
1209
# end pobyso_taylor_expansion_no_change_var_so_so
1215
    sollya_lib_clear_obj(taylorFormSo)
1216
    # Do not clear maxErrorSo.
1217
    return((polyVarChangedSo, intervalCenterSo, maxErrorSo))
1218
# end pobyso_taylor_expansion_with_change_var_so_so
1210 1219

  
1211 1220
def pobyso_taylor(function, degree, point):
1212 1221
    """ Legacy function. See pobysoTaylor_so_so. """

Formats disponibles : Unified diff