Estoy tratando de escribir datos calculados a partir de esta función en un archivo. Pero la función se llama número de veces. Digamos que hay 9 números en otro archivo y esta función calculará la raíz de cada uno de esos 9 números. Estas 9 raíces de esta función deben escribirse en el mismo archivo. Pero la forma en que lo hice aquí escribirá la raíz calculada en el archivo, pero la siguiente reemplazará esto en el archivo. Hay otras funciones matemáticas que se llevan a cabo para cada uno de esos 9 números antes de llamar a esta función, por lo tanto, las funciones se llaman una y otra vez por separado. ¿Es posible escribirlas todas en el mismo archivo? Gracias.

def Newton(poly, start):
    """ Newton's method for finding the roots of a polynomial."""
    x = start 
    poly_diff = poly_differentiate(poly)
    n = 1
    counter = 0
    r_i = 0

    cFile = open("curve.dat", "w")   
    while True:
        if (n >= 0) and (n < 1):
            break

        x_n = x - (float(poly_substitute(poly, x)) / poly_substitute(poly_diff, x))

        if x_n == x:
            break

        x = x_n # this is the u value corresponding to the given time

        n -= 1
        counter += 1
        x = str(x)
        cFile.write('\n' + x + '\n')

    if r_i:
        print "t(u) = ", (x, counter)

    else:
        print "t(u) = ", x


    cFile.close 

Después de seguir las sugerencias que recibí, cambié el código a lo siguiente:

def Newton(poly, start):
    """ Newton's method for finding the roots of a polynomial."""
    x = start 
    poly_diff = poly_differentiate(poly)
    n = 1
    counter = 0

    while True:
        if (n >= 0) and (n < 1):
            break

        x_n = x - (float(poly_substitute(poly, x)) / poly_substitute(poly_diff, x))

        if x_n == x:
            break

        x = x_n # this is the u value corresponding to the given time

        n -= 1
        counter += 1
        yield x 

    Bezier(x)

def Bezier(u_value) :
    """ Calculating sampling points using rational bezier curve equation"""
    u = u_value

    p_u = math.pow(1 - u, 3) * 0.7 + 3 * u * math.pow(1 - u, 2) * 0.23 \
        + 3 * (1 - u) * math.pow(u, 2) * 0.1 + math.pow(u, 3) * 0.52

    p_u = p_u * w

    d = math.pow(1 - u, 3) * w + 3 * u * w * math.pow(1 - u, 2) + 3 * (1 - u) *\ 
        w * math.pow(u, 2) + math.pow(u, 3) * w

    p_u = p_u / d

    yield p_u

    plist = list (p_u)
    print plist

Seguí lo mismo en la función Bezier () pero plist no se crea ya que no imprime nada. Por favor ayuda. Gracias.

0
zingy 3 ago. 2011 a las 12:44

3 respuestas

La mejor respuesta

Su función hace dos cosas : calcula las raíces de un polinomio y escribe el resultado en un archivo de salida. Lo ideal es que las funciones hagan una cosa .

Entonces, intente dividir esto en una función que reciba un polinomio y devuelva una lista que contenga las raíces, y luego simplemente escriba esa lista en un archivo en un solo paso.

La forma más sencilla de modificar su función sería reemplazar las líneas.

x = str(x)
cFile.write('\n' + x + '\n')

Con

yield x

Entonces puedes llamar a tu función así:

roots = list(Newton(polynomial, start))

Para comprender esto, lea sobre generadores. Para escribir la lista resultante en un archivo, puede usar este código:

with open("curve.dat", "w") as output_file:
    output_file.write("\n".join(str(x) for x in roots)
2
Björn Pollex 3 ago. 2011 a las 08:57

Si bien no entiendo completamente lo que está preguntando, creo que la respuesta se puede resumir en:

Abra el archivo en modo anexar, no en modo de escritura. Entonces en lugar de

cFile = open("curve.dat", "w") 

Hacer

cFile = open("curve.dat", "a") 
1
Martin Thurau 3 ago. 2011 a las 08:51

Por qué usar el rendimiento en Bezier, no devuelve varios valores, por lo que puede cambiar:

yield p_u
plist = list (p_u)
print plist

Para:

print list(p_u)
return p_u
0
HYRY 3 ago. 2011 a las 13:37