Foros del Web » Programando para Internet » Python »

encontrar cero de una funcion

Estas en el tema de encontrar cero de una funcion en el foro de Python en Foros del Web. Hola a todos tengo una funcion a la cual le quiero hallar su raiz, estoy usando fsolve de scipy , pero cuando la ejecuto me ...
  #1 (permalink)  
Antiguo 18/07/2013, 11:11
 
Fecha de Ingreso: marzo-2009
Mensajes: 39
Antigüedad: 15 años, 8 meses
Puntos: 0
encontrar cero de una funcion

Hola a todos tengo una funcion a la cual le quiero hallar su raiz, estoy usando fsolve de scipy, pero cuando la ejecuto me da el siguiente error:

TypeError: fsolve: there is a mismatch between the input and output shape of the 'func' argument 'my_function'

pueden ayudarme aqui le spongo todo el codigo que tengo
saludos y gracias de antemano

Código Python:
Ver original
  1. def my_function(fi):
  2.     from math import pi,sqrt,tan,sin,cos
  3.     from numpy import array, radians
  4.  
  5.     m = 2.5
  6.     z = 22
  7.     beta = radians(16.)
  8.     alfa = radians(20.)
  9.     x = 0.
  10.     c = 0.25
  11.     f = 1.
  12.     fr = 0.4
  13.  
  14.     rp = (m*z/cosd(beta))/2.
  15.     ro = rp - m * (f + c - x)
  16.     so = 2. * ro * (((pi/2. + 2.*x*tan(alfa))/z)+(tan(alfa)-alfa))
  17.  
  18.     l = pi/4. * m
  19.     he = (f + c) * m
  20.     rc = fr * m
  21.     s = x * m
  22.     d = he - rc - s
  23.     PA = l + (rc/cos(alfa)) + (he -rc)*tan(alfa)
  24.  
  25.     Gama = radians(PA/rp)
  26.     Beta = radians(so / (2.*ro))
  27.  
  28.     fi_e = radians(fi[0])
  29.     fi_t = radians(fi[1])
  30.  
  31.     E1 = ro * (cos(Gama - Beta) + sin(Gama - Beta) * fi_e )
  32.     E2 = -ro * (sin(Gama - Beta) - cos(Gama - Beta) * fi_e )
  33.  
  34.     T1 = rp - d *( l + rc/sqrt(d**2 + (rp * fi_t)**2))
  35.     T2 = rp * fi_t *( l + rc/sqrt(d**2 + (rp * fi_t)**2))
  36.    
  37.     return E1 * cos(fi_e) + E2 *sin(fi_e) - T1 *cos(fi_t) + T2 * sin(fi_t)
  38.      
  39. from scipy.optimize import fsolve
  40. from math import pi
  41.  
  42. print  fsolve(my_function, [-pi/2, 0])
  #2 (permalink)  
Antiguo 18/07/2013, 14:48
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: encontrar cero de una funcion

Lo que hace fsolve es sencillo, resuelve un sistema de ecuaciones no lineales.

Ahora, si tu le pasas un arreglo de 2 elementos fsolve espera que la función que le pases (my_fun) devuelva un arreglo de 2 elementos. Esto es porque el segundo parámetro que le pasas son los puntos en el eje X de donde quieres que empiece cada ecuación en el sistema de ecuaciones. [-pi/2, 0]

Mira este link en la sección 1.2 ejemplo 4 y 5 https://sites.google.com/a/aims-sene...tial-equations

No puedo arreglar tu script porque no se lo que tratas de hacer.

Si tienes un sistema de ecuaciones de 2 ecuaciones o si tienes una sola ecuación y quieres que empiece en -pi/2.

Si es el caso del sistema de ecuaciones de 2 ecuaciones entonces obviamente te falta devolver una lista de tamaño 2, donde el primer item es la evaluación de tu primera ecuación y el segundo es la evaluacion de tu segunda ecuación.

Si solo tienes una sola ecuación entonces no veo porque envías una lista con 2 elementos. Y porque ademas haces uso de los 2 argumentos.

Si nos pusieras el sistema de ecuaciones que estas tratando de resolver te podríamos ayudar a implementarlo.
  #3 (permalink)  
Antiguo 19/07/2013, 07:33
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: encontrar cero de una funcion

En el código que muestras veo un cosd, es recomendable importar numpy asi:
Código Python:
Ver original
  1. import numpy as np
  2.  
  3. ejemplo1 = np.pi
  4. ejemplo2 = np.sqrt(2.0)
  5. ejemplo3 = np.cos(0.25)
Tambien puedes usar los solucionadores numéricos y simbólicos de sympy.
Revisando la documentación de scipy veo que si quieres hallar las raices debes usar:
Código Python:
Ver original
  1. from scipy.optimize import root

Última edición por Bael_Balzac; 19/07/2013 a las 07:59

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:42.