May 10, 2011

Graficando funciones mediante serie de potencias en PyQt



Este es un pequeño ejemplo de como crear un graficador de funciones mediante series de potencias usando PyQt, el usuario ingresa los puntos por los que debe pasar la función y el programa construye una función polinómica que pasa por dichos puntos y luego la traza, muestra su formula, y a su vez permite calcular diferentes valores dentro del intervalo de los puntos ingresados. Elementos más destacables de este ejemplo:
  • Se muestra un pequeño ejemplo de como resolver un sistema de ecuaciones lineales con N incógnitas (N puntos) usando numpy.
  • Interfaz completamente diseñada en QtDesigner y se muestra como cargar la interfaz y asociarla a una clase de Python y conectar automáticamente todas sus señales y slots.
  • Se muestra como obtener datos de una QTableWidget.
  • Se muestra como agregar gráficos simples usando QGraphicsScene y QGraphicsView.

Tareas y cosas que hacer

Si, como en la escuela XD :
  1. Si ustedes ingresan los puntos para formar, por ejemplo, una parábola se darán cuenta que realmente no dibuja una parábola sino que dibuja 2 rectas conectadas, eso es porque yo para trazar la función simplemente uno los puntos de la función usando rectas :P , así que como tarea queda que modifiquen el ejemplo para trazar correctamente la función.
  2. En los campos de texto es posible ingresar cualquier valor, modifiquen el ejemplo para que sólo se puedan ingresar números reales.

Trasfondo matemático


Para que nuestra gráfica pase por un numero determinado de puntos, comenzamos creando una función polinómica de grado n, debemos hallar los valores de las constantes C en función de dichos puntos:
$$Y=C_0X^0+C_1X^1+C_2X^2+\cdots+C_nX^n$$
Armamos las ecuaciones lineales asignando valores a X e Y:
$$Y_0=C_0X_0^0+C_1X_0^1+C_2X_0^2+\cdots+C_nX_0^n$$ $$Y_1=C_0X_1^0+C_1X_1^1+C_2X_1^2+\cdots+C_nX_1^n$$ $$Y_2=C_0X_2^0+C_1X_2^1+C_2X_2^2+\cdots+C_nX_2^n$$ $$\cdots$$ $$Y_n=C_0X_n^0+C_1X_n^1+C_2X_n^2+\cdots+C_nX_n^n$$
Armamos la matriz de ecuaciones lineales XC=Y:
$$ \begin{vmatrix} X_0^0 & X_0^1 & X_0^2 & \cdots & X_0^n \\ X_1^0 & X_1^1 & X_1^2 & \cdots & X_1^n \\ X_2^0 & X_2^1 & X_2^2 & \cdots & X_2^n \\ \cdots & \cdots & \cdots & \cdots & \cdots \\ X_n^0 & X_n^1 & X_n^2 & \cdots & X_n^n \end{vmatrix}\cdot \begin{vmatrix} C_0 \\ C_1 \\ C_2 \\ \cdots \\ C_n \end{vmatrix}= \begin{vmatrix} Y_0 \\ Y_1 \\ Y_2 \\ \cdots \\ Y_n \end{vmatrix} $$
Y despejamos las constantes C, X-1Y=C:
$$ \begin{vmatrix} X_0^0 & X_0^1 & X_0^2 & \cdots & X_0^n \\ X_1^0 & X_1^1 & X_1^2 & \cdots & X_1^n \\ X_2^0 & X_2^1 & X_2^2 & \cdots & X_2^n \\ \cdots & \cdots & \cdots & \cdots & \cdots \\ X_n^0 & X_n^1 & X_n^2 & \cdots & X_n^n \end{vmatrix}^{-1}\cdot \begin{vmatrix} Y_0 \\ Y_1 \\ Y_2 \\ \cdots \\ Y_n \end{vmatrix}= \begin{vmatrix} C_0 \\ C_1 \\ C_2 \\ \cdots \\ C_n \end{vmatrix} $$
Luego, teniendo los valores de C, podemos asignarle valores a X y obtener diferentes valores de Y, pero siempre que los valores de X estén dentro del intervalo de puntos ingresados.
Obviamente todas estas complicadísimas ecuaciones están resumidas en una sensillísima función de numpy, C = numpy.linalg.linalg.solve(X, Y) ;)
Y para finalizar, como en cada tutorial aquí está el CF.

2 comments:

  1. oye compañero estoy en los primeros pasos con QT y me dejaron de proyecto q grafique Fx(x^2) una parabola estoy trabajando para mobiles en especial nokia e71 sera q esta libreria me puede ayudar ;(

    ReplyDelete
    Replies
    1. Claro que sí, aunque si querés graficar funciones más complejas te recomiendo usar una librería especializada en ploteo de funciones. Te dejo algunos enlaces en donde podes empezar a buscar:

      Graphical Representations of Data
      Matplotlib

      Delete