Anuncio

Colapsar
No hay ningún anuncio todavía.

definir funcion coseno en python

Colapsar
X
 
  • Filtro
  • Hora
  • Mostrar
Borrar todo
nuevos mensajes

  • Python definir funcion coseno en python

    Buenas, tengo un trabajo el cual consiste en evaluar el coseno de un numero a traves de una funcion con dos argumentos, el primero para el numero float y el segundo para un argumento string con valor por defecto radianes y que ademas pueda aceptar el valor de grados. (Tambien me dice que use las propiedades de paridad del coseno para evaluarla en [0,pi] mediante una expansion de taylor con una precision de al menos 10^-6, la funcion que debo construir debe contener documentacion (docstring) y funcionar para cualquier valor del argumento tanto en grados como radianes emitiendo un error para otro valor del segundo argumento.

    Mi script pero que calcula el coseno en radianes es:

    import math

    def factorial(numero):
    factorial = 1
    while (numero > 1):
    factorial = factorial * numero
    numero = numero - 1
    return factorial

    def coseno_taylor(x) :

    sum_coseno = 0.0
    n = 0.0
    termino = 1.0
    while (n < 20) :
    termino = ((x**(2*n))) / (factorial (2*n))
    if (n%2==0):
    sum_coseno = sum_coseno + termino
    else:
    sum_coseno = sum_coseno - termino
    n = n + 1
    return (sum_coseno)

    la cual me da lso valores del coseno en radianes, como puedo agregarle el segundo argumento? y todo lo demas que se me pide si no es molesta, aunque me importa mas como agregarle el 2 argumento (me complica que sea string)
    Desde ya gracias.
    Última edición por lindtaylor; 03/02/2012, 21:37:35.
    asdadsdsassdadsasdadsadsads

  • #2
    Re: definir funcion coseno en python

    No entiendo muy bien lo que pides, la verdad. Supongo que la función debe recibir como argumento de entrada una cadena que sea un número en radianes y deba calcular su coseno, ¿es eso?

    En ese caso, en python puedes hacer casting de tipos con las funciones int() y float() para pasar la cadena a un número, y restarle 2*pi al número hasta que quede menor que 2*pi, Luego lo reduces a 1º o 2º cuadrante y calculas su valor con tu desarrollo de taylor. Debes tener en cuenta que al ir restando 2*pi te llevarás un error de redondeo para el número pi, que de todos modos es fácilmente "acotable". Para número negativos, puedes usar la paridad del coseno, y simplemente pasar el argumento a valor absoluto.

    En realidad las funciones int y float no realizan casting propiamente dicho, pero facilitan mucho el trabajo. Si no las quieres usar, para números enteros sería simplemente mirar los valores ASCII que hay de separación entre el valor de un número como número y el valor del caracter del número, y restárselo a cada valor, de forma que tenga el propio valor ascii como un número entero y no lo que representa, pero ya sea dicho, la función float() para números reales en general te facilitará el trabajo.
    Última edición por xXminombreXx; 03/02/2012, 23:18:12.
    [TEX=null]\begin{pmatrix}0 & 0 \\1 & 0\end{pmatrix}[/TEX]
    [TEX=null] \frac{1}{\pi} = \frac{2\sqrt{2}}{9801} \sum^\infty_{k=0} \frac{(4k)!(1103+26390k)}{(k!)^4 396^{4k}}[/TEX]

    Comentario


    • #3
      Re: definir funcion coseno en python

      Escrito por lindtaylor Ver mensaje
      ...
      la cual me da lso valores del coseno en radianes, como puedo agregarle el segundo argumento? y todo lo demas que se me pide si no es molesta, aunque me importa mas como agregarle el 2 argumento (me complica que sea string)
      ...
      A ver si entendí lo que no explicaste muy bien... ¿Quieres una función que puedas llamar indiferentemente como cos(0.524,"RADIANES") o cos(30,"GRADOS")?

      Si es así lo único que tienes que hacer es una prueba y multiplicar el argumento por el apropiado factor de conversión. Yo no se nada de Python o como se llame, así que la inicación es general. Si por defecto el argumento está en radianes, entonces la prueba

      Código:
      IF modo = "GRADOS" THEN x = x * PI/180
      hará la conversión del argumento. Luego de hacer la conversión, toma el valor absoluto del argumento (recuerda que el coseno es una función par) y redúcelo al rango 0 - 2. Toma nota del signo del resultado probando si el argumento está en el rango - :

      Código:
      signo = +1
      IF x > PI THEN
        x = x - PI
        signo = -1
      END
      Ahora calcula el valor del coseno y multiplica el resultado por "signo" antes de devolverlo.

      Si me permites una crítica al algoritmo que escribiste, probablemente lo estás haciendo de la manera mas espantosamente ineficiente que se pueda. A título de sugerencia te indico una mejor aproximación:

      - Descarta por completo el cálculo del factorial.

      - Precalcula el valor de : x2 = x * x

      - Inicializa "termino" al valor 1 y "n" a 1.

      - Itera calculando cada nuevo término de la serie multiplicando el anterior por - x2/(n*(n+1)) e incrementando "n" en 2.

      - El bucle termina cuando el nuevo término sea menor o igual a la tolerancia especificada.

      Saludos,

      Al
      Don't wrestle with a pig in the mud. You'll both get dirty, but the pig will enjoy it. - Parafraseando a George Bernard Shaw

      Comentario


      • #4
        Re: definir funcion coseno en python

        Bueno, pongo mi codigo un poco mas chico y de mejor forma, lo malo que para muchos valores me funciona el coseno para valores de x positivos, pero para valores de x negativos me da el valor del cosx con signo distinto y para valores grandes da un valor malo

        Código:
        import math
        
         def cos(x) :
            
                
            sum_coseno = 0.0
            n = 0.0
            badu = 1.0
            x=x%math.pi #implicitamente esta la periocididad
            
            while (badu>1.0e-8):
            
                termino =(-1)**n*(x**(2*n))/(math.factorial (2*n))
                badu=math.fabs(termino)        
                sum_coseno=sum_coseno+termino
                n = n + 1
            return sum_coseno
        x=float(input("ingrese un numero: "))
        print cos(x), math.cos(x)
        asdadsdsassdadsasdadsadsads

        Comentario


        • #5
          Re: definir funcion coseno en python

          El error para valores grandes te lo da porque lo haces módulo pi, y debería ser módulo 2pi, al final, si es mayor que pi, puedes tener en cuenta su simetría también con respecto al eje vertical pi (x = 2pi-x).

          Para valores negativos no lo estás haciendo valor absoluto, y deberías, puesto que la función es par, aunque tampoco se cómo funciona tu algoritmo.
          Última edición por xXminombreXx; 04/02/2012, 20:42:41.
          [TEX=null]\begin{pmatrix}0 & 0 \\1 & 0\end{pmatrix}[/TEX]
          [TEX=null] \frac{1}{\pi} = \frac{2\sqrt{2}}{9801} \sum^\infty_{k=0} \frac{(4k)!(1103+26390k)}{(k!)^4 396^{4k}}[/TEX]

          Comentario


          • #6
            Re: definir funcion coseno en python

            Hasta ahora tengo el sigueinte nuevo codigo:

            Código:
            import math
            
            def cos(x) :
                
                x=math.fabs(x)
                if int(x/math.pi)%2.0==0:
                    factor=1.0
                else:
                    factor=-1.0
                        
                sum_cos = 0.0
                n = 0.0
                resto = 1.0
                x=x%math.pi #implicitamente esta la periodicidad
            
                while (resto>1.0e-6):
                
                    termino =(-1)**n *(x**(2.0*n))/(math.factorial(2.0*n))
                    resto=math.fabs(termino)        
                    sum_cos=sum_cos+termino
                    n = n + 1
                return factor*sum_cos
            El cual calcula el coseno con una precision de 10^-6

            Ahora se me pide darle a la funcion coseno un 2 argumento, para que se pueda elegir entre evaluar el coseno en radianes o grados con radianes pro defecto, es decir quiero algo de la forma (es solo una idea):

            Código:
            def cos(x,unidad="radianes")
                if unidad=="grados":
                    x=(x*180)*math.pi
            luego sigue el resto del codigo tal cual...
            Como lo puedo hacer? no entiendo como definir un 2 argumento tipo string etc...
            desde ya gracias
            Última edición por lindtaylor; 04/02/2012, 20:38:16.
            asdadsdsassdadsasdadsadsads

            Comentario

            Contenido relacionado

            Colapsar

            Trabajando...
            X