Révision 272

pobysoPythonSage/src/sageSLZ/sageRunSLZ.sage (revision 272)
3656 3656
                                                        degreeSo,
3657 3657
                                                        lb,
3658 3658
                                                        ub,
3659
                                                        polyApproxAccur)
3659
                                                        polyApproxAccur,
3660
                                                        debug=debug)
3660 3661
        if debug:
3661 3662
            print "Approximation polynomial computed."
3662 3663
        if prceSo is None:
pobysoPythonSage/src/sageSLZ/sageSLZ.sage (revision 272)
863 863
#
864 864
def slz_compute_polynomial_and_interval(functionSo, degreeSo, lowerBoundSa, 
865 865
                                        upperBoundSa, approxAccurSa, 
866
                                        precSa=None):
866
                                        precSa=None, debug=False):
867 867
    """
868 868
    Under the assumptions listed for slz_get_intervals_and_polynomials, compute
869 869
    a polynomial that approximates the function on a an interval starting
......
873 873
    precision is reached.
874 874
    The polynomial, the bounds, the center of the interval and the error
875 875
    are returned.
876
    Argument debug is not used.
876 877
    OUTPUT:
877 878
    A tuple made of 4 Sollya objects:
878 879
    - a polynomial;
......
995 996
    - the center of the interval;
996 997
    - the maximum error in the approximation of the input functionSo by the
997 998
      output polynomial ; this error <= approxAccurSaS.
999
      
1000
    Changes from version 0 (no number):
1001
    - make use of debug argument;
1002
    - polynomial coefficients are "shaved".
998 1003
    
999 1004
    """
1000 1005
    #print"In slz_compute_polynomial_and_interval..."
pobysoPythonSage/src/testPobyso.sage (revision 272)
119 119
    polynomialsList.append(P_RRR(1/7 + 2/7*i + 3/7*i^2)) 
120 120
    RRR         = RealField(1024)
121 121
    P_RRR       = RRR[i]
122
    polynomialsList.append(P_RRR(1/7 + 2/7*i + 3/7*i^2)) 
122
    polynomialsList.append(P_RRR(1/7 + 2/7*i + 3/7*i^2))
123 123
    def test(polynomialsList):
124 124
        for polynomial in polynomialsList:
125 125
            polySo = pobyso_float_poly_sa_so(polynomial)
pobysoPythonSage/src/pobyso.py (revision 272)
521 521
        precSo = pobyso_constant_from_int(precSa)
522 522
        pobyso_set_prec_so_so(precSo)
523 523
        sollya_lib_clear_obj(precSo)
524
        sollyaPrecChanged = True    
524
        sollyaPrecChanged = True
525
    ## Free variable stuff.
526
    freeVariableNameChanged = False 
527
    polyFreeVariableNameSa = \
528
        str(polySa.variables()[0])
529
    currentFreeVariableNameSa = pobyso_get_free_variable_name_so_sa() 
530
    if polyFreeVariableNameSa != currentFreeVariableNameSa:
531
        #print "Free variable names do not match.", polyFreeVariableNameSa
532
        sollya_lib_name_free_variable(polyFreeVariableNameSa)
533
        freeVariableNameChanged = True
525 534
    ## Get exponents and coefficients.
526 535
    exponentsSa     = polySa.exponents()
527 536
    coefficientsSa  = polySa.coefficients()
......
546 555
            polySo = sollya_lib_build_function_add(polySo, polyTermSo)
547 556
    if sollyaPrecChanged:
548 557
        pobyso_set_prec_so_so(initialSollyaPrecSo)
549
        sollya_lib_clear_obj(initialSollyaPrecSo)
558
    sollya_lib_clear_obj(initialSollyaPrecSo)
559
    ## Do not set back the free variable name in Sollya to its initial value: 
560
    #  it will change it back, in the Sollya polynomial, to what it was in the 
561
    #  first place.
550 562
    return polySo
551 563
# End pobyso_float_poly_sa_so    
552 564

  
......
1569 1581
def pobyso_rat_poly_sa_so(polySa, precSa = None):
1570 1582
    """
1571 1583
    Create a Sollya polynomial from a Sage rational polynomial.
1584
    We first convert the rational polynomial into a floating-point 
1585
    polynomial.
1572 1586
    """
1573 1587
    ## TODO: filter arguments.
1574 1588
    ## Precision. If no precision is given, use the current precision
......
1581 1595
    P_RRR = RRR[polySa.variables()[0]]
1582 1596
    polyFloatSa = P_RRR(polySa)
1583 1597
    ## Make sure no precision is provided: pobyso_float_poly_sa_so will
1584
    #  recover it all by itself and not make an extra conversion.
1598
    #  recover it all by itself and will not make any extra conversion.
1585 1599
    return pobyso_float_poly_sa_so(polyFloatSa)
1586 1600
    
1587 1601
# End pobyso_rat_poly_sa_so    
......
1807 1821
                                                currentApproxErrorSo,
1808 1822
                                                approxAccurSo,
1809 1823
                                                debug=False):
1824
    """
1825
    From an input approximation polynomial, compute an output one with 
1826
    smaller coefficients and yet yields a sufficient approximation accuracy.
1827
    """
1810 1828
    if debug:
1811 1829
        print "Input arguments:"
1812 1830
        print "Polynomial: ", ; pobyso_autoprint(polySo)
......
1822 1840
    #  no possible gain.
1823 1841
    if currentApproxErrorSa >= approxAccurSa / 2:
1824 1842
        #### Do not return the initial argument but copies: caller may free 
1825
        #    as inutile after call.
1843
        #    the former as inutile after call.
1826 1844
        return (sollya_lib_copy_obj(polySo),
1827 1845
                sollya_lib_copy_obj(currentApproxErrorSo))
1828 1846
    degreeSa             = pobyso_polynomial_degree_so_sa(polySo)
......
1833 1851
        print "intervalSa            :", intervalSa.str(style='brackets')
1834 1852
        print "currentApproxErrorSa  :", currentApproxErrorSa 
1835 1853
        print "approxAccurSa         :", approxAccurSa 
1836
    ### Start with a 0 value expression.
1837 1854
    radiusSa = intervalSa.absolute_diameter() / 2
1838 1855
    if debug:
1839 1856
        print "log2(radius):", RR(radiusSa).log2()
1840 1857
    iterIndex = 0
1858
    ## Build the "shaved" polynomial.
1841 1859
    while True: 
1860
        ### Start with a 0 value expression.
1842 1861
        resPolySo = pobyso_constant_0_sa_so()
1843 1862
        roundedPolyApproxAccurSa = approxAccurSa / 2
1844 1863
        currentRadiusPowerSa = 1 
......
1851 1870
            else:
1852 1871
                roundingPowerSa = \
1853 1872
                    floor(((currentRadiusPowerSa/roundedPolyApproxAccurSa)*(degreeSa+1)).log2())
1854
            ## Under extreme conditions the above formulas can evaluate under 2, which is the
1855
            #  minimal precision of an MPFR number.
1873
            ## Under extreme conditions the above formulas can evaluate under 2,
1874
            #   which is the minimal precision of an MPFR number.
1856 1875
            if roundingPowerSa < 2:
1857 1876
                roundingPowerSa = 2
1858 1877
            if debug:
......
1901 1920
                #    free the former as inutile after call.
1902 1921
                return (sollya_lib_copy_obj(polySo), 
1903 1922
                        sollya_lib_copy_obj(currentApproxErrorSo))
1904
            else: # Round 0, got round 1
1923
            else: # Round 0 (agressive rounding), got round 1 (proved rounding)
1905 1924
                sollya_lib_clear_obj(resPolySo)
1906 1925
                sollya_lib_clear_obj(infNormSo)
1907 1926
                iterIndex += 1
......
2018 2037
    """
2019 2038
    Compute the Taylor expansion without the variable change
2020 2039
    x -> x-intervalCenter.
2040
    If errorTypeSo is None, absolute is used.
2041
    If sollyaPrecSo is None, Sollya internal precision is not changed. 
2021 2042
    """
2022 2043
    # Change internal Sollya precision, if needed.
2023 2044
    (initialSollyaPrecSo, initialSollyaPrecSa) = pobyso_get_prec_so_so_sa()
......
2037 2058
    taylorFormSo = sollya_lib_taylorform(functionSo, degreeSo,
2038 2059
                                         intervalCenterSo,
2039 2060
                                         rangeSo, errorTypeSo, None)
2040
    # taylorFormListSaSo is a Python list of Sollya objects references that 
2041
    # are copies of the elements of taylorFormSo.
2061
    # Object taylorFormListSaSo is a Python list of Sollya objects references 
2062
    #  that are copies of the elements of taylorFormSo.
2042 2063
    # pobyso_get_list_elements_so_so clears taylorFormSo.
2043 2064
    (taylorFormListSaSo, numElementsSa, isEndEllipticSa) = \
2044 2065
        pobyso_get_list_elements_so_so(taylorFormSo)
2066
    ## Copy needed here since polySo will be returned and taylorFormListSaSo
2067
    #  will be cleared.
2045 2068
    polySo = sollya_lib_copy_obj(taylorFormListSaSo[0])
2046 2069
    #print "Num elements:", numElementsSa
2047 2070
    sollya_lib_clear_obj(taylorFormSo)
2048
    #polySo = taylorFormListSaSo[0]
2049
    #errorRangeSo = sollya_lib_copy_obj(taylorFormListSaSo[2])
2050
    errorRangeSo = taylorFormListSaSo[2]
2051 2071
    # No copy_obj needed here: a new objects are created.
2052
    maxErrorSo    = sollya_lib_sup(errorRangeSo)
2053
    minErrorSo    = sollya_lib_inf(errorRangeSo)
2072
    maxErrorSo    = sollya_lib_sup(taylorFormListSaSo[2])
2073
    minErrorSo    = sollya_lib_inf(taylorFormListSaSo[2])
2074
    # List taylorFormListSaSo is not needed anymore.
2075
    pobyso_clear_taylorform_sa_so(taylorFormListSaSo)
2054 2076
    absMaxErrorSo = sollya_lib_abs(maxErrorSo)
2055 2077
    absMinErrorSo = sollya_lib_abs(minErrorSo)
2056 2078
    sollya_lib_clear_obj(maxErrorSo)
2057 2079
    sollya_lib_clear_obj(minErrorSo)
2058 2080
    absMaxErrorSa = pobyso_get_constant_as_rn_so_sa(absMaxErrorSo)
2059 2081
    absMinErrorSa = pobyso_get_constant_as_rn_so_sa(absMinErrorSo)
2060
    # If changed, reset the Sollya working precision.
2082
    #
2083
    if errorTypeIsNone:
2084
        sollya_lib_clear_obj(errorTypeSo)
2085
    ## If changed, reset the Sollya working precision.
2061 2086
    if sollyaPrecChanged:
2062 2087
        sollya_lib_set_prec(initialSollyaPrecSo)
2063 2088
    sollya_lib_clear_obj(initialSollyaPrecSo)
2064
    if errorTypeIsNone:
2065
        sollya_lib_clear_obj(errorTypeSo)
2066
    pobyso_clear_taylorform_sa_so(taylorFormListSaSo)
2089
    ## According to what error is the largest, return the errors.
2067 2090
    if absMaxErrorSa > absMinErrorSa:
2068 2091
        sollya_lib_clear_obj(absMinErrorSo)
2069 2092
        return (polySo, intervalCenterSo, absMaxErrorSo)
......
2099 2122
    taylorFormSo = sollya_lib_taylorform(functionSo, degreeSo, \
2100 2123
                                         intervalCenterSo, \
2101 2124
                                         rangeSo, errorTypeSo, None)
2102
    # taylorFormListSaSo is a Python list of Sollya objects references that 
2103
    # are copies of the elements of taylorFormSo.
2125
    # Object taylorFormListSaSo is a Python list of Sollya objects references 
2126
    # that are copies of the elements of taylorFormSo.
2104 2127
    # pobyso_get_list_elements_so_so clears taylorFormSo.
2105
    (taylorFormListSo, numElements, isEndElliptic) = \
2128
    (taylorFormListSaSo, numElements, isEndElliptic) = \
2106 2129
        pobyso_get_list_elements_so_so(taylorFormSo)
2107
    polySo = taylorFormListSo[0]
2108
    errorRangeSo = taylorFormListSo[2]
2109
    maxErrorSo    = sollya_lib_sup(errorRangeSo)
2110
    minErrorSo    = sollya_lib_inf(errorRangeSo)
2130
    sollya_lib_clear_obj(taylorFormSo)
2131
    polySo = taylorFormListSaSo[0]
2132
    ## Maximum error computation with taylorFormListSaSo[2], a range
2133
    #  holding the actual error. Bounds can be negative.
2134
    maxErrorSo    = sollya_lib_sup(taylorFormListSaSo[2])
2135
    minErrorSo    = sollya_lib_inf(taylorFormListSaSo[2])
2111 2136
    absMaxErrorSo = sollya_lib_abs(maxErrorSo)
2112 2137
    absMinErrorSo = sollya_lib_abs(minErrorSo)
2113 2138
    sollya_lib_clear_obj(maxErrorSo)
......
2118 2143
                       sollya_lib_build_function_free_variable(),\
2119 2144
                       sollya_lib_copy_obj(intervalCenterSo))
2120 2145
    polyVarChangedSo = sollya_lib_evaluate(polySo, changeVarExpSo)
2121
    sollya_lib_clear_obj(polySo) 
2146
    # List taylorFormListSaSo is not needed anymore.
2147
    pobyso_clear_taylorform_sa_so(taylorFormListSaSo)
2122 2148
    sollya_lib_clear_obj(changeVarExpSo)
2123 2149
    # If changed, reset the Sollya working precision.
2124 2150
    if sollyaPrecChanged:
......
2126 2152
    sollya_lib_clear_obj(initialSollyaPrecSo)
2127 2153
    if errorTypeIsNone:
2128 2154
        sollya_lib_clear_obj(errorTypeSo)
2129
    sollya_lib_clear_obj(taylorFormSo)
2130 2155
    # Do not clear maxErrorSo.
2131 2156
    if absMaxErrorSa > absMinErrorSa:
2132 2157
        sollya_lib_clear_obj(absMinErrorSo)

Formats disponibles : Unified diff