Uno de los problemas que no encontraba como resolver de forma fácil es el de representar una función definida a trozos con python. Ese fue el motivo de comenzar a trabajar con Sympy Plotting Backends’s. Con Geogebra es fácil hacerlas, pero mi idea era la de poder seguir usando solo sympy y su enorme potencial para la elaboración de actividades de matemáticas. Lo que se muestra en esta entrada es solo un ejemplo de cómo poder usar la función plot_piecewise de psb.
Para ello se crea una función definida a trozos del tipo:
y se obtiene una tabla de valores para ella, su gráfica, su derivada y su gráfica y su integral y su gráfica.
El código usado es:
\begin{sympycode} #Para que pythontex ponga ln en vez de log pytex.set_sympy_latex('text',ln_notation=True) pytex.set_sympy_latex('display',ln_notation=True) from spb import * #Para hacer la tabla de valores import pandas as pd #Para modificar algunas cuestiones de los gráficos import matplotlib.pyplot as plt plt.rc('font', size=11) plt.rc('text', usetex = True) plt.rc('text.latex', preamble=r'\usepackage{amsmath}') #Grosor líneas de la función plt.rc('lines',linewidth=3) plt.rcParams["yaxis.labellocation"]="top" #Grosor de línea de la asíntota plt.rc('contour',linewidth=1.5) #Tamaño plt.rcParams["figure.figsize"]=(5,5) x,y=symbols('x y',real=True) #Dominio para representar la función xa=-9.5 xb=9.5 #Imagen y0=-6 y1=10 #Funciones de la función a trozos #Valores de ruptura del dominio x1=-4 x2=-1 x3=2 x4=4 #Funciones f1=(32/x**2,x<x1) f2=(1,x<=x2) f3=(-3/(x-x3),x<x3) f4=((x-x4)/(x-x3),x<x4) f5=(2,Eq(x,x4)) f6=(-(x-x4)*(x-(x4+3)-1),x>x4) #Función a trozos f=Piecewise(f1,f2,f3,f4,f5,f6) #Derivada df=Derivative(f,x).doit() #Integral intf=Integral(f,x) intfc=Integral(f,x).doit() #Gráficos #Título del gráfico no lo pongo #titulo=r"$f(x)=%s$" % latex(f) #Representamos la función func=plot_piecewise(f,(x,xa,xb),ylim=(y0,y1),aspect=(1,1), show=False,axis_center=(0,0)) #Representamos la asíntota vertical avert=plot_implicit(x - x3, (x,xa,xb),(y,y0,y1),aspect=(1,1),show=False,axis_center=(0,0)) #"Juntamos" las dos gráficas graf=(func+avert) #Quitamos la leyenda graf.legend=False graf.save('piecewise.svg') #Representamos la derivada de la función dfunc=plot_piecewise(df,(x,xa,xb),ylim=(y0,y1),aspect=(1,1), ylabel="f'(x)" ,show=False,axis_center=(0,0)) dgraf=(dfunc+avert) #Quitamos la leyenda dgraf.legend=False dgraf.save('dpiecewise.svg') #Representamos la integral de la función ifunc=plot_piecewise(intfc,(x,xa,xb),ylim=(0,2*y1),ylabel='${\displaystyle\int{f(x) dx}}$',aspect=(1,1), show=False,axis_center=(0,0)) igraf=(ifunc) #Quitamos la leyenda igraf.legend=False igraf.save('ipiecewise.svg') #Tabla de valores #lista de valores lista=[(i,f.subs(x,i)) for i in range(int(xa),int(xb))] #funcion='$f(x)='+latex(f)+'$' funcion='$f(x)$' tabla=pd.DataFrame(lista,columns=['x',funcion]) tablaL=tabla.to_latex(index=False,escape = False,column_format='rr',caption="Tabla de valores",longtable=True).replace('zoo','') \end{sympycode}
y se obtiene de resultado:
Función
Tabla de valores x -9 32/81 -8 1/2 -7 32/49 -6 8/9 -5 32/25 -4 1 -3 1 -2 1 -1 1 0 3/2 1 3 2 3 -1 4 2 5 3 6 4 7 3 8 0 Derivada
Integral
Fichero fuente y el pdf final de una posible compilación.