10/05/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 funcion 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 automaticamente 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 numeros reales.

Trasfondo matematico


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 complicadisimas ecuaciones están resumidas en una sensillisima funcion de numpy, C = numpy.linalg.linalg.solve(X, Y) ;)
Y para finalizar, como en cada tutorial aquí está el CF.

0 comentarios:

Publicar un comentario en la entrada