def mostrar_graficas(h, num_periodos, f, g, x_0, y_0, t_0, titulo, freq=1.0, fichero=None): # periodo de la señal periódica periodo = 2.0 * math.pi / freq # numero total de pasos de integración n = int(num_periodos * periodo / h) # calculo de la tabla de integracion del sistema sol_numerica = eq_diferenciales.runge_kutta_sistema(h, n, f, g, x_0, y_0, t_0) # se obtienen de la tabla de valores los vectores de tiempo, tiempo = [] numerica = [] for t, x, _ in sol_numerica: tiempo.append(t) numerica.append(x) # se utiliza matplotlib para generar la gráfica de la señal plt.subplot(211) plt.plot(tiempo, numerica) plt.title("Movimiento del %s" % titulo) plt.xlabel("Tiempo [s]") plt.ylabel("x(t)") # se calcula la señal para 50 periodos fourier_periodos = 50 pasos_periodo = periodo / h # numero de pasos de integración para muestrear fourier_periodos n = int(fourier_periodos * pasos_periodo) sol_numerica = eq_diferenciales.runge_kutta_sistema(h, n, f, g, x_0, y_0, t_0) # se define el número de muestras por periodo muestras_periodo = 4 # se muestrea la señal muestra = transformada_fourier.muestrear(sol_numerica, muestras_periodo, pasos_periodo) # se obtiene su transformada de Fourier fourier = transformada_fourier.tfd_promedio(fourier_periodos, muestras_periodo, muestra) # se calcula su espectro de potencia espectro_potencia = transformada_fourier.espectro_pot(fourier) # generación de la gráfica de espectro de potencias n = range(len(espectro_potencia)) plt.subplot(212) plt.plot(n, espectro_potencia, "r^") plt.vlines(n, [0], espectro_potencia, "r") plt.title("Espectro de potencia") plt.xlabel("Frecuencias constitutivas [n]") plt.xticks(n) plt.ylabel("Potencia [J/s]") plt.tight_layout() # escritura de gráfica en fichero if fichero is not None: plt.savefig(fichero) # visualización de la gráfica plt.show()
def f(x, y, t): return y def g(x, y, t): return 0.516 * math.cos(1.2 * t) - x - 0.52 * y - x * x num_periodos = 5 x_0 = 0.0 y_0 = 0.0 t_0 = 0.0 periodo = 2.0 * math.pi h1 = 0.08 n = int(periodo / h1) sol_numerica_h1 = eq_diferenciales.runge_kutta_sistema(h1, n, f, g, x_0, y_0, t_0) h2 = 0.04 n = int(periodo / h2) sol_numerica_h2 = eq_diferenciales.runge_kutta_sistema(h2, n, f, g, x_0, y_0, t_0) h3 = 0.02 n = int(periodo / h3) sol_numerica_h3 = eq_diferenciales.runge_kutta_sistema(h3, n, f, g, x_0, y_0, t_0) h4 = 0.01 n = int(periodo / h4) sol_numerica_h4 = eq_diferenciales.runge_kutta_sistema(h4, n, f, g, x_0, y_0, t_0) h5 = 0.005 n = int(periodo / h5)
# -*- coding: utf8 -*- from metodos import eq_diferenciales import math import matplotlib.pyplot as plt def f(x, y, t): return y def g(x, y, t): return -x h = 0.05 periodo = 2.0 * math.pi n = int(1 * periodo / h) sol_numerica = eq_diferenciales.runge_kutta_sistema(h, n, f, g, 1.0, 0.0, 0.0) tiempo = [] numerica = [] analitica = [] for t, x, _ in sol_numerica: tiempo.append(t) numerica.append(x) plt.plot(tiempo, numerica, label='Solución numérica') plt.show()