El ciclo for es una estructura c铆clica cuya finalidad es ejecutar un c贸digo una cierta cantidad de veces. De manera general, en Python, la sintaxis de for es:
forkiniterable:# hacer algo
Donde iterable es justamente eso, un iterable de Python que puede ser desde una lista hasta un string. Para la i-茅sima iteraci贸n la variable de ciclo k adoptar谩 el valor en la i-茅sima posici贸n de iterable.
En ocasiones tenemos iterables dentro de otro iterable. Es posible acceder a cada elemento del sub-iterable utilizando m煤ltiple variables de ciclo. Por ejemplo:
Una utilidad muy com煤n es la de la funci贸n enumerate:
In聽[24]:
notas=[10,8,10,9,10,7]fork,notainenumerate(notas):print("La nota en posici贸n {0} es: {1}".format(k,nota))
La nota en posici贸n 0 es: 10
La nota en posici贸n 1 es: 8
La nota en posici贸n 2 es: 10
La nota en posici贸n 3 es: 9
La nota en posici贸n 4 es: 10
La nota en posici贸n 5 es: 7
De manera muy breve, la variable de ciclo k devuelve la posici贸n del elemento para cada iteraci贸n.
Las gr谩ficas de barras nos sirven para representar porcentajes y proporciones. En Python podemos utilizar la librer铆a Matplotlib para desarrollar este tipo de gr谩ficas.
Matplotlib dispone de la funci贸n pie, cuya sintaxis depende del grado de personalizaci贸n y control que se requiera sobre la gr谩fica de pastel a dibujar.
Para ejemplificar el uso de esta funci贸n vamos a suponer que se tienen los siguientes datos sobre algunas personas que tienen cierta cantidad de manzanas en su poder:
Nombre
Manzanas
Ana
20
Juan
10
Diana
25
Catalina
30
Para representar el porcentaje del total del cual dispone cada uno, podemos trazar una gr谩fica de pastel. Para ello realizamos lo siguiente:
Observe que lo primero que hacemos es importar la librer铆a matplotlib, enseguida, en utilizando listas definimos los nombres y el n煤mero de manzanas correspondientes. Luego, la funci贸n pie acepta un primer argumento que contiene los valores absolutos de cada 铆tem, adem谩s, de un keyword argumentlabels que contiene las etiquetas correspondientes.
El aspecto achatado de la gr谩fica se puede solucionar utilizando la funci贸n axis.
Los colores tambi茅n se pueden determinar y autocalcular utilizando un mapa de color espec铆fico. Enseguida se muestra un ejemplo donde la variaci贸n es sobre colores en tonos azules.
Es posible tambi茅n segmentar o separar del bloque una o m谩s de las rebanadas de la gr谩fica de pastel. Para ello se debe pasar una lista o tupla con valores entre 0 y n que indican el desfase respecto al centro, 0 indica ning煤n desfase y n un desfase equivalente a n*r, donde r es el radio de la gr谩fica de pastel.
En lo siguiente se extraen algunos datos correspondientes a los investigadores que pertenecen al SNI.
In聽[16]:
importwarningswarnings.filterwarnings("ignore",'This pattern has match groups')importpandasaspdimportmatplotlib.pyplotaspltimportmatplotlibasmplplt.style.use("ggplot")mpl.rcParams['xtick.labelsize']=6mpl.rcParams['ytick.labelsize']=6%matplotlib inline
# Datos tomados de: http://datosabiertos.conacyt.gob.mx/publico/default.aspxfilename="data/inv_sni.csv"data=pd.read_csv(filename,encoding="latin1")# leyendo datosdata.drop(data.columns[range(8,17)],axis=1,inplace=True)# Limpiando datos
ninv=sum(estados.values)# No. total de investigadoresprc_df=estados.to_frame("INVESTIGADORES")prc_df["Porcentaje"]=100*prc_df['INVESTIGADORES']/ninvprc_df
Sobre las instituciones del Tecnol贸gico Nacional de M茅xico (TECNM)露
Lo subsiguiente presenta el porcentaje de representaci贸n de las instituciones correspondientes al Tecnol贸gico Nacional de M茅xico: es decir, todos los institutos tecnol贸gicos centralizados y descentralizados, m谩s el CENIDET y CIIDET.
In聽[24]:
TECNOLOGICOS=sum(inst[inst.index.str.contains("INSTITUTO TECNOLOGICO (SUP|DE)")])CENIDET=sum(inst[inst.index.str.contains("CENTRO NACIONAL DE INV*")])CIIDET=sum(inst[inst.index.str.contains("INTERDISCIPLINARIO [\w*\s*\.]* EDUCACION")])porcentaje_tecnm=100*(TECNOLOGICOS+CENIDET+CIIDET)/NUM_INVporcentaje_tecnm
Out[24]:
2.5347400926402472
Los 20 tecnol贸gicos con mayor cantidad de investigadores son:
In聽[29]:
(inst[inst.index.str.contains("INSTITUTO TECNOLOGICO (SUP|DE)")][:20]).to_frame("No. de Investigadores")
En este peque帽o post vamos a analizar (en realidad no, s贸lo a trazar grafiquitas con algunos datos de inter茅s) datos del Consejo Nacional de Ciencia y Tecnolog铆a (CONACYT), que hasta hace unos d铆as me listaba entre sus becarios nacionales. Pero bueno, 驴qu茅 es el CONACYT?, seg煤n wikipedia:
El Consejo Nacional de Ciencia y Tecnolog铆a (Conacyt) es un organismo p煤blico descentralizado del gobierno federal mexicano dedicado a promover y estimular el desarrollo de la ciencia y la tecnolog铆a en ese pa铆s. Tiene la responsabilidad oficial para elaborar las pol铆ticas de ciencia y tecnolog铆a nacionales.
Por medio del Conacyt es posible para los estudiantes conseguir apoyo econ贸mico a fin de realizar estudios de posgrado (maestr铆a o doctorado) en universidades con reconocida excelencia acad茅mica dentro y fuera del pa铆s.
En resumen el CONACYT posibilita que muchos de nosotros (j贸venes mexicanos) ingresemos a un programa de posgrado, mismo que debe pertenecer a un padr贸n de posgrados de calidad.
En lo subsiguiente vamos a tomar algunos datos p煤blicos del CONACYT referentes a los becarios nacionales y trataremos de segmentar y/o clasificar la informaci贸n obtenida, b谩sicamente en lo que concierne
In聽[1]:
importpandasaspdimportmatplotlib.pyplotaspltimportmatplotlibasmplplt.style.use("ggplot")mpl.rcParams['xtick.labelsize']=6mpl.rcParams['ytick.labelsize']=6%matplotlib inline
# Datos tomados de: http://datosabiertos.conacyt.gob.mx/publico/default.aspxfilename="data/becas_nacionales.csv"data=pd.read_csv(filename)
acon=data['Area de Conocimiento'].value_counts()x=range(len(acon))plt.bar(x,acon.get_values(),0.3,align="center")plt.xticks(x,acon.keys(),rotation=90)plt.xlim(min(x)-0.5,max(x)+0.5);
Supongamos que en $x=x_1$ la derivada de la funci贸n $y=f(x)$ se reduce a cero, es decir, $f'(x)=0$. Admitamos, adem谩s que existe la segunda derivada, $f''(x)$, y es continua sobre cierta vecindad del punto $x_1$. Para este caso es v谩lido el siguiente teorema:
Teorema 1. Si $f'(x_1)=0$, entonces en $x=x_1$ la funci贸n tiene m谩ximo cuando $f''(x_1)<0$, y, un m铆nimo cuando $f''(x_1)>0$.
De acuerdo al teorema anterior, para caracterizar los puntos cr铆ticos de una funci贸n $f(x)$ es necesario utilizar el criterio de la segunda derivada. Entendiendo que los puntos cr铆ticos se obtiene de resolver la ecuaci贸n $f'(x)=0$.
En Python es posible realizar c谩lculo simb贸lico mediante la librer铆a SymPy.
Ejemplo 1.Calcular y caracterizar los puntos cr铆ticos de la funci贸n $f(x) = x^3 - x$
Primero, y como siempre, importamos los m贸dulos necesarios.
Para determinar si se trata de un m铆nimo o m谩ximo, utilizamos el criterio de la segunda derivada, sustituyendo los puntos cr铆ticos en $f''(x)$, es decir:
In聽[51]:
d2f.subs(x,pc[0])# Primer punto cr铆tico
Out[51]:
$$- 2 \sqrt{3}$$
In聽[52]:
d2f.subs(x,pc[1])# Segundo punto cr铆tico
Out[52]:
$$2 \sqrt{3}$$
Con esto determinamos, acorde al teorema 1, que el primer punto cr铆tico $\left(\frac{-\sqrt{3}}{3}\right)$ es un m铆nimo y el segundo $\left(\frac{\sqrt{3}}{3}\right)$ un m谩ximo. Podemos comprobarlo trazando la gr谩fica correspondiente:
In聽[54]:
plot(f,(x,-1,1))
Out[54]:
<sympy.plotting.plot.Plot at 0x94ca890>
Podemos automatizar un poco este proceso definiendo una funci贸n que realice el procedimiento descrito.
In聽[84]:
defmaxminf(f):""" Calcula los m谩ximos y m铆nimos de una funci贸n f(x) """df=diff(f,x)# 1era. derivadad2f=diff(f,x,2)# 2da. derivadapcs=solve(Eq(df,0))# puntos cr铆ticosforpinpcs:ifd2f.subs(x,p)>0:tipo="Min"elifd2f.subs(x,p)<0:tipo="Max"else:tipo="Indefinido"print("x = %f (%s)"%(p,tipo))
In聽[85]:
maxminf(x**3-x)
x = -0.577350 (Max)
x = 0.577350 (Min)
La funci贸n anterior puede arrojar errores cuando se tienen ra铆ces complejas, lo cual podr铆a considerarse mediante una estructura try-except o bien verificando si el punto cr铆tico es un valor real.
En este blog ya hemos tratado algunas veces c贸mo desarrollar interfaces gr谩ficas utilizando wxPython
(v茅ase aqu铆). En este post vamos a presentar el
desarrollo de una mini-aplicaci贸n que calcula l铆mites, derivadas e integrales utilizando SymPy como
motor de c谩lculo simb贸lico.
En la siguiente imagen se muestra la interfaz gr谩fica resultante:
Ahora vamos a describir un poco el dise帽o y funcionamiento de la aplicaci贸n. Como puede notarse
la aplicaci贸n est谩 basada en la clase wxNotebook,
teni茅ndose cuatro p谩ginas: L铆mites, Derivadas, Integrales indefinidas y Ayuda. Cada p谩gina del
Notebook contiene un instancia heredada de wxPanel, misma que contiene todos los controles
necesarios en cada uno de los casos.
El proceso de c谩lculo es b谩sicamente como sigue: se lee una funci贸n $f(x)$ introducida en los
wxTextCtrl correspondientes y se hace un preprocesamiento m铆nimo, enseguida se transforma
el string le铆do en una expresi贸n de SymPy, para luego llevar a cabo la operaci贸n
requerida. El resultado de la operaci贸n dado por SymPy se muestra en un canvas de Matplotlib,
en el cual se renderiza la expresi贸n LaTeX del resultado obtenido.
El c贸digo de la aplicaci贸n completa se adjunta a continuaci贸n.
Ejemplo. Se requiere dise帽ar un contenedor de desechos, cuya forma ser谩 la de un prisma rectangular de dimensiones x, y, z como se muestra en la figura. El volumen del contenedor deber谩 ser de 0.08 $m^3$. Por requerimientos, la altura debe estar en el rango 0.6-0.8 m, y los lados de la base deben medir al menos 0.1 m. Luego, la idea es dise帽ar el contenedor de tal forma que se utilice la menor cantidad de material posible. Nota: El contenedor est谩 abierto en la parte superior.
La cantidad de material utilizada para fabricar el contenedor est谩 directamente relacionada con el 谩rea del prisma rectangular, donde esta corresponde a la suma de las 谩reas para cada una de las caras, luego, bas谩ndonos en el esquema de la figura anterior, se puede expresar el 谩rea en funci贸n de sus dimensiones como sigue:
Un valor 贸ptimo no restringido puede calcularse mediante herramientas elementales de c谩lculo variacional. Para obtener un punto cr铆tico se resuelve el sistema de ecuaciones resultante de igualar a cero el gradiente de la funci贸n, es decir:
$$ \left[ \vec{\nabla} f \right] = [0] $$
Esto lo podemos calcular utilizando SymPy. Importamos la librer铆a y las funciones hessian y zeros del m贸dulo matrices:
In聽[1]:
from__future__importdivisionimportsympyassymfromsympy.matricesimporthessian,zerossym.init_printing(use_latex="mathjax")defgradient(f,varls):""" Calcula el gradiente de una funci贸n f(x1,x2,...)"""n=len(varls)G=zeros(n,1)foriinrange(n):G[i]=f.diff(varls[i])returnG
Definimos las variables simb贸licas a utilizar y la funci贸n $A(x_1,x_2)$
Se obtienen dos soluciones complejas y una real, adem谩s, la soluci贸n real presenta dos valores iguales.
Hasta ahora sabemos que la soluci贸n obtenida es un punto cr铆tico, pero no podemos asegurar si es un m谩ximo, un m铆nimo o un punto de silla. Luego, para comprobar si el punto calculado es un m铆nimo se puede utilizar el siguiente teorema:
Teorema 1. Condici贸n necesaria: si $f(x)$ tiene un m铆nimo local en $x^*$ entonces:
es positiva definida o semidefinida en el punto $x^*$.
Condici贸n suficiente de segundo orden: si la matriz $H(x^*)$ es positiva definida en el punto estacionario $x^*$,
entonces $x^*$ es un m铆nimo local para la funci贸n $f(x)$.
Una matriz es positiva definida si sus eigenvalores son estrictamente positivos, es decir: $\lambda_i > 0$
De acuerdo al teorema 1, para que el punto calculado sea un m铆nimo, los eigenvalores de la matriz Hessiana de $A(x_1, x_2)$ evaluada en el punto cr铆tico deben ser positivos.
Calculando la matriz Hessiana:
In聽[5]:
H=hessian(A,(x1,x2))# evaluando en el punto calculado_x1,_x2=sol[0][0],sol[0][1]H=H.subs({x1:_x1,x2:_x2,V:0.08})H
Dado que tanto $\lambda_1 = 1$ como $\lambda_2 = 3$ son positivos, entonces el punto calculado es un m铆nimo global no restringido.
Ahora, si calculamos el valor de la altura $x_3$:
In聽[59]:
_x3=0.08/(_x1*_x2)_x3
Out[59]:
$$0.271441761659491$$
Vemos que no cumple con la restricci贸n de altura dada. En lo subsiguiente se abordar谩 el c贸mo utilizar otros m茅todos para resolver problemas de optimizaci贸n con restricciones.
La optimizaci贸n con restricciones implica tomar en cuenta ecuaciones que definen regiones factibles. Uno de los m茅todos m谩s simples para resolver problemas con restricciones es el m茅todo gr谩fico.
Resolver un problema de optimizaci贸n por el m茅todo gr谩fico implica trazar las gr谩ficas de contorno de la funci贸n objetivo, as铆 como las regiones definidas por las restricciones, y luego mediante inspecci贸n ubicar el punto que optimice la funci贸n objetivo. Claro est谩 que es un m茅todo que puede resultar poco preciso, pero normalmente sirve para dar una aproximaci贸n aceptable y que pueda utilizarse como punto de entrada para algoritmos num茅ricos como los que se ver谩n en la siguiente secci贸n.
Lo primero que haremos es importar las librer铆as a utilizar: NumPy y Matplotlib.
Para trazar la gr谩fica de contorno de $A(x_1,x_2)$ utilizamos la funci贸n contour:
In聽[57]:
plt.contour(x1,x2,f,cmap="viridis")
Out[57]:
<matplotlib.contour.QuadContourSet at 0xbb675f0>
Vemos que la gr谩fica obtenida no parece muy adecuada, esto debido a que los niveles utilizados por defecto no se ajustan a la funci贸n en cuesti贸n. Si evaluamos $A(x_1,x_2)$ en el punto 贸ptimo no restringido de la secci贸n anterior se tiene:
In聽[63]:
A.subs({"x_1":_x1,"x_2":_x2,"V":0.08})
Out[63]:
$$0.884167559673693$$
Luego, se pueden utilizar niveles personalizados para la funci贸n contour, partiendo desde el valor m铆nimo anterior:
De la gr谩fica anterior, la regi贸n factible corresponde a la regi贸n ubicada entre las l铆neas rojas y azules correspondientes a las ecuaciones de restricci贸n para la altura $g_1$ y $g_2$. Esto se puede hacer m谩s evidente se utilizamos la funci贸n contourf.
El an谩lisis estructural es uno de los aspectos elementales para aquellos
que nos dedicamos al dise帽o mec谩nico o cuestiones similares. En los cursos
universitarios de resistencia de materiales se ense帽an algunos m茅todos
anal铆ticos que permiten obtener soluciones r谩pidas para componentes mec谩nicos
simples. No obstante, cuando las geometr铆as se complican se hace necesario
utilizar el enfoque num茅rico e implementar una metodolog铆a de soluci贸n utilizando
el m茅todo de los elementos finitos, el cual proporciona una soluci贸n aproximada
que ser谩 adecuada en medida de ciertos criterios, tales como el tama帽o y tipo de
elementos, la f铆sica del problema, entre otros.
El prop贸sito del presente minicurso es introducir al lector en el uso de las
herramientas num茅ricas que proporciona Python para la soluci贸n de problemas de
an谩lisis estructural utilizando el m茅todo de los elementos finitos.
El m茅todo de los elementos finitos consiste
en la discretizaci贸n de un continuo en peque帽os elementos, con la finalidad de
establecer un sistema de ecuaciones que describa de manera aproximada el comportamiento
individual y global del sistema, pasando por la inclusi贸n de las condiciones de frontera y todas
las consideraciones f铆sicas que deriven en la simplificaci贸n del problema.
En an谩lisis num茅rico estructural el m茅todo de los desplazamientos o de la rigidez, asume
que los desplazamientos nodales son las variables desconocidas y com煤nmente se debe resolver
una ecuaci贸n algebraica del tipo:
$$ K U = F $$
Donde $F$ es el vector de fuerzas nodales, $K$ la matriz global de rigidez y $U$ el vector
de desplazamientos nodales.
Dado que normalmente los desplazamientos son las inc贸gnitas, se tiene que:
$$ U = K^{-1} F $$
En el caso de un an谩lisis est谩tico lineal esta ecuaci贸n se resuelve como se muestra: calculando la inversa de la matriz rigidez y multiplicando por el vector de fuerzas nodales, para el caso de un an谩lisis no lineal se utilizan m茅todos iterativos.
La matriz global $K$ se obtiene de ensamblar todas las matrices de rigidez por elemento acorde a la numeraci贸n o posici贸n de
sus nodos.
La obtenci贸n de la matriz de rigidez puede consultarla en la mayor铆a de los libros introductorios de elementos finitos, por ejemplo en [1]. En lo anterior $k_e$ es la rigidez caracter铆stica del resorte.
Para ejemplificar c贸mo funciona el m茅todo de los elementos finitos en elementos de este tipo vamos a resolver el siguiente ejemplo.
Primero, las matrices de rigidez por elemento vienen dadas por:
La matriz global se obtiene ensamblando las matrices elementales utilizando el principio de superposici贸n, es decir, asumiendo que los efectos individuales de cada elemento a la matriz global pueden adicionarse de manera independiente. Para esto se debe expandir la matriz de rigidez elemental y rellenar s贸lo las posiciones correspondientes a los nodos que componen el elemento.
Por ejemplo, el elemento 1 est谩 conformado por los nodos 1 y 3, entonces:
importnumpyasnpimportnumpy.linalgasla# Datos inicialesk1=1000.0k2=2000.0k3=3000.0P=5000.0# Matrices por elementoK1=np.array([[k1,-k1],[-k1,k1]])K2=np.array([[k2,-k2],[-k2,k2]])K3=np.array([[k3,-k3],[-k3,k3]])# Matriz global K=np.array([[K1[0,0],0,K1[0,1],0],[0,K3[0,0],0,K3[0,1]],[K1[1,0],0,K1[1,1]+K2[0,0],K2[0,1]],[0,K3[1,0],K2[1,0],K2[1,1]+K3[1,1]]])F=np.array([0,0,0,P])# Condiciones de frontera# Nodos 1 y 2 conocidos -> UX = 0KS=K[2:,2:]FS=F[2:]# ResolviendoUSOL=la.solve(KS,FS)# Vector de desplazamientosUSOL=np.concatenate(([0,0],USOL))# Obteniendo las fuerzas nodalesNF=np.dot(K,USOL)# Presentando los resultadosfornodoinrange(4):print("%g UX = %-8.4f FX = %-8.4f"%(nodo+1,USOL[nodo],NF[nodo]))
1 UX = 0.0000 FX = -909.0909
2 UX = 0.0000 FX = -4090.9091
3 UX = 0.9091 FX = 0.0000
4 UX = 1.3636 FX = 5000.0000
Utilizando NuSA: una librer铆a para an谩lisis estructural露
NuSA es una librer铆a Python para el an谩lisis estructural, que facilita el planteamiento y la soluci贸n de este tipo de an谩lisis mediante una colecci贸n de clases que reciben como dato de entrada las caracter铆sticas elementales de un modelo: coordenadas modales, propiedades del material, condiciones de frontera, etc., y retorna valores de salida b谩sicos como desplazamientos y fuerzas.
Para testear las capacidades de NuSA vamos a resolver el ejemplo del elemento resorte. Lo primero es importar las clases que usaremos: Node, Spring y SpringModel.
En este caso no es necesario especificar las coordenadas nodales dado que un elemento resorte s贸lo necesita la rigidez para la formulaci贸n, as铆 que se pueden dejar ambos nodos con coordenadas (0,0).
Enseguida se define un elemento de tipo SpringElement, cuyos datos de entrada son una tupla con los nodos que le conforman y la rigidez del elemento.
Luego, establecemos las condiciones de frontera y la carga externa aplicada. Finalmente utilizamos el m茅todo solve e imprimimos los resultados obtenidos.
In聽[41]:
m1.add_constraint(n1,ux=0)m1.add_constraint(n2,ux=0)m1.add_force(n4,(5000,))m1.solve()fornodoinm1.get_nodes():print("%s UX = %-8.4f FX = %-8.4f"%(nodo.label,nodo.ux,nodo.fx))
0 UX = 0.0000 FX = -909.0909
1 UX = 0.0000 FX = -4090.9091
2 UX = 0.9091 FX = 0.0000
3 UX = 1.3636 FX = 5000.0000
[1] Logan, D. L. (1986). A first course in the finite element method. Boston: PWS Engineering.
[2] Zienkiewicz, O. C., Taylor, R. L., Zhu, J. Z., Zienkiewicz, O. C., & Zienkiewicz, O. C. (2005). The finite element method: Its basis and fundamentals. Oxford: Elsevier Butterworth-Heinemann.
Las integrales son unos de los conceptos b谩sicos en la formaci贸n matem谩tica de un ingeniero, es en t茅rminos b谩sicos la
operaci贸n inversa de la derivaci贸n. Pero, adem谩s del concepto puramente matem谩tico, las integrales tienen m煤ltiples
interpretaciones geom茅tricas y f铆sicas.
En un curso ordinario de c谩lculo se nos ense帽an m茅todos para resolver de forma anal铆tica funciones que sean integrables.
Por ejemplo todos sabemos que la integral de una funci贸n constante ser谩:
$$ \int a\,dx = ax + C $$
Y lo sabemos porque nos hemos aprendido reglas b谩sicas de integraci贸n y por supuesto a indentificar el tipo
de funci贸n. Actualmente existen paquetes de 谩lgebra simb贸lica que son capaces de realizar esta tarea: identificar
el caso que se tiene y aplicar m茅todos computacionales, hasta cierto grado complejos, para determinar la soluci贸n.
Y claro, SymPy es uno de esos sistemas de 谩lgebra computacional (CAS), en el que solo necesitamos escribir
nuestra funci贸n a integrar, utilizar por ah铆 alguna rutina y obtener un resultado r谩pidamente. Pero claro,
para ello debemos aprender m铆nimamente la sintaxis y eso es justo lo que veremos enseguida.
Vamos a ver c贸mo resolver integrales simples indefinidas, si, de esas que vemos en un primer curso. Para resolverlas
tendremos que utilizar la funci贸n integrate. Por ejemplo se tiene la siguiente funci贸n $f(x)=x^2-3x+2 $.
Como primer paso debemos importar lo que necesitaremos del paquete SymPy:
Del m贸dulo abc importamos la variable simb贸lica x e integrate para resolver nuestra integral. Ahora, podemos
guardar la funci贸n a integrar en una variable o bien pasarla directamente como argumento:
In聽[2]:
f=x**2-3*x+2integrate(f)
Out[2]:
$$\frac{x^{3}}{3} - \frac{3 x^{2}}{2} + 2 x$$
En este caso no hemos tenido incovenientes, porque en la expresi贸n a integrar s贸lo existe una variable simb贸lica, pero
si la expresi贸n tuviese m谩s de una, habr铆a que especificar de manera expl铆cita la variable respecto a la cual se integra, de lo contrario Python nos mostrar谩 un error:
---------------------------------------------------------------------------ValueError Traceback (most recent call last)
<ipython-input-3-476839d3c49d> in <module>() 1from sympy.abc import a,b,c
2 f = a*x**2+b*x+c
----> 3integrate(f)~\Anaconda3\lib\site-packages\sympy\integrals\integrals.py in integrate(*args, **kwargs) 1289 risch = kwargs.pop('risch',None) 1290 manual = kwargs.pop('manual',None)-> 1291integral = Integral(*args,**kwargs) 1292 1293if isinstance(integral, Integral):~\Anaconda3\lib\site-packages\sympy\integrals\integrals.py in __new__(cls, function, *symbols, **assumptions) 73return function._eval_Integral(*symbols,**assumptions) 74---> 75obj = AddWithLimits.__new__(cls, function,*symbols,**assumptions) 76return obj
77~\Anaconda3\lib\site-packages\sympy\concrete\expr_with_limits.py in __new__(cls, function, *symbols, **assumptions) 375" more than one free symbol, an integration variable should" 376" be supplied explicitly e.g., integrate(f(x, y), x)"--> 377 % function)
378 limits, orientation =[Tuple(s)for s in free],1 379ValueError: specify dummy variables for a*x**2 + b*x + c. If the integrand contains more than one free symbol, an integration variable should be supplied explicitly e.g., integrate(f(x, y), x)
Pues eso, si intentamos integrar la funci贸n $f(x)=ax^2+bx+c$ sin especificar la variable de integraci贸n, Python nos mandar谩 un error que es bastante sugerente al respecto. As铆, lo correcto ser铆a:
Una integral definida usualmente se utiliza para calcular el 谩rea bajo la curva de una funci贸n en un intervalo finito. En SymPy, para calcular una integral definida se utiliza la funci贸n integrate, considerando el hecho que deben adicionarse los l铆mites de evaluaci贸n mediante la sintaxis:
integrate(fun, (var, a, b))
Donde fun es la funci贸n, var la variable respecto a la cual se integra, a el l铆mite inferior y b el l铆mite superior.
Para ejemplificar vamos a resolver la siguiente integral definida:
Ahora vamos a resolver integrales dobles (la sintaxis/metodolog铆a de resoluci贸n que se revisar谩 aplica para cualquier integral m煤ltiple). Por ejemplo vamos a resolver la integral dada por:
$$ \int_a^b \int_c^d \, dy \, dx $$
Recuerde que este tipo de integrales m煤ltiples se resuelven de forma iterada, yendo de dentro hacia afuera, es decir, para la integral anterior se proceder铆a:
$$ I_1 = \int_c^d \, dy \qquad \rightarrow \qquad I = \int_a^b \, I_1 \, dx $$
En esta breve entrada vamos a hablar de c贸mo utilizar la funci贸n聽矛mg2py聽de wxPython, para generar c贸digos a partir de im谩genes, y posteriormente poder utilizarlas en conjunto conPyEmbeddedImage.
Lo primero que debemos hacer es importar la funci贸n del m贸dulo聽wx.tools.img2py:
from wx.tools.img2py import img2py
Y posteriormente s贸lo llamaremos a la funci贸n pasando como argumentos el archivo de la imagen y el archivo Python de salida, por ejemplo:
img2py("icono.png", "icono.py")
Con lo anterior se obtendr谩 un archivo Python聽icono.py聽que contiene algo parecido a lo siguiente:
#---------------------------------------------------------------------- # This file was generated by C:\Users\User\Desktop\LABPro\_blogs_\Posts\test_app.py # from wx.lib.embeddedimage import PyEmbeddedImage
驴Y si necesito聽embeber聽varias im谩genes en un mismo archivo Python?
Si, es bastante probable que necesite esto, hacer una colecci贸n de imagenes embebidas en un mismo archivo Python, la cuesti贸n es muy parecida, s贸lo tenemos que agregar el聽keyword argumentappend聽a la funci贸n聽img2py聽para evitar que borre lo que se ha colocado anteriormente, un peque帽o ejemplo:
import glob from wx.tools.img2py import img2py
if__name__=='__main__': for img in glob.glob("img/*.png"): img2py(img,"iconos.py", append=True)
Lo anterior聽incrusta聽el c贸digo correspondiente a todas las im谩genes PNG contenidas en la carpeta聽img/.