import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint def plot_differential_equations(): equations = [eq_a, eq_b, eq_c, eq_d] titles = ['y dy/dx = -x; y(1) = 4', 'dy/dx = 1/y; y(0) = 1', 'dy/dx = 0.2x^2 + y; y(0) = 1/2', 'y\' = y - cos(π/2 * x); y(2) = 2'] initial_conditions = [[1, 4], [0, 1], [0, 1/2], [2, 2]] fig, axs = plt.subplots(2, 2, figsize=(15, 15)) axs = axs.flatten() for i, (eq_func, title_str, initial_condition) in enumerate(zip(equations, titles, initial_conditions)): plot_equation(eq_func, title_str, initial_condition, axs[i]) plt.tight_layout() plt.show() def plot_equation(eq_func, title_str, initial_condition, ax): x, y = np.meshgrid(np.linspace(-5, 5, 20), np.linspace(-5, 5, 20)) dx, dy = eq_func(x, y) # Normalizar las pendientes para una mejor visualización L = np.sqrt(dx**2 + dy**2) dx = dx / L dy = dy / L # Graficar el campo de direcciones ax.quiver(x, y, dx, dy, color='r', alpha=0.5) ax.set_xlabel('x') ax.set_ylabel('y') ax.set_title(title_str) ax.grid(True) # Definir los valores iniciales y resolver la ecuación diferencial en ambas direcciones x0, y0 = initial_condition x_span1 = np.linspace(x0, 5, 100) # Rango positivo de x x_span2 = np.linspace(x0, -5, 100) # Rango negativo de x # Usar odeint para resolver la ecuación diferencial en el rango positivo y_sol1 = odeint(lambda y, x: eq_func(x, y)[1], y0, x_span1) # Usar odeint para resolver la ecuación diferencial en el rango negativo y_sol2 = odeint(lambda y, x: eq_func(x, y)[1], y0, x_span2) # Graficar la solución particular en el campo de direcciones ax.plot(x_span1, y_sol1, 'b', linewidth=2) ax.plot(x_span2, y_sol2, 'b', linewidth=2) # Mostrar leyenda ax.legend(['Campo de Direcciones', 'Solución Particular'], loc='best') # Definiciones de las ecuaciones diferenciales def eq_a(x, y): return np.ones_like(x), -x / y def eq_b(x, y): return np.ones_like(x), 1 / y def eq_c(x, y): return np.ones_like(x), 0.2 * x**2 + y def eq_d(x, y): return np.ones_like(x), y - np.cos(np.pi/2 * x) # Llamar a la función principal plot_differential_equations()
script.py:44: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information. y_sol1 = odeint(lambda y, x: eq_func(x, y)[1], y0, x_span1) script.py:47: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information. y_sol2 = odeint(lambda y, x: eq_func(x, y)[1], y0, x_span2)
import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint def f(y, x): return -x / y def plot_direction_field(ax, f, x_range, y_range, nx=20, ny=20): x = np.linspace(x_range[0], x_range[1], nx) y = np.linspace(y_range[0], y_range[1], ny) X, Y = np.meshgrid(x, y) dx = np.ones_like(X) dy = f(Y, X) length = np.sqrt(dx**2 + dy**2) dx /= length dy /= length ax.quiver(X, Y, dx, dy, color='b', alpha=0.3) # Configuración de la figura fig, ax = plt.subplots(figsize=(10, 8)) # Campo direccional plot_direction_field(ax, f, [-5, 5], [-5, 5]) # Valor inicial x0, y0 = 1, 4 # Solución particular (hacia adelante) x_forward = np.linspace(x0, 5, 1000) y_forward = odeint(f, y0, x_forward) # Solución particular (hacia atrás) x_backward = np.linspace(x0, -3, 1000) y_backward = odeint(f, y0, x_backward) # Graficar soluciones ax.plot(x_forward, y_forward, 'r-', linewidth=2) ax.plot(x_backward, y_backward, 'r-', linewidth=2) # Marcar el punto inicial ax.plot(x0, y0, 'go', markersize=10) ax.annotate(f'({x0}, {y0})', (x0, y0), xytext=(5, 5), textcoords='offset points') ax.set_title('A) y dy/dx = -x; y(1) = 4') ax.set_xlabel('x') ax.set_ylabel('y') ax.grid(True) ax.axhline(y=0, color='k', linestyle='--') ax.axvline(x=0, color='k', linestyle='--') ax.legend(['Campo direccional', 'Solución particular', 'Punto inicial']) plt.show()
script.py:33: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information. y_forward = odeint(f, y0, x_forward)
function ecuacionDiferencialA() % A) y dy/dx = -x; y(1) = 4 figure; hold on; % Campo direccional [X, Y] = meshgrid(-5:0.5:5, -5:0.5:5); dX = ones(size(X)); dY = -X ./ Y; quiver(X, Y, dX, dY, 'b'); % Valor inicial x0 = 1; y0 = 4; % Solución particular (hacia adelante) [x_forward, y_forward] = ode45(@odefun, [x0 5], y0); plot(x_forward, y_forward, 'r', 'LineWidth', 2); % Solución particular (hacia atrás) [x_backward, y_backward] = ode45(@odefun, [x0 -3], y0); plot(x_backward, y_backward, 'r', 'LineWidth', 2); % Marcar el punto inicial plot(x0, y0, 'go', 'MarkerSize', 10, 'MarkerFaceColor', 'g'); text(x0, y0, ' (1, 4)', 'VerticalAlignment', 'bottom'); title('A) y dy/dx = -x; y(1) = 4'); xlabel('x'); ylabel('y'); grid on; axis equal; legend('Campo direccional', 'Solución particular', 'Punto inicial', 'Location', 'best'); hold off; end function dydt = odefun(x, y) dydt = -x ./ y; end
import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint def odefun(y, x): return -x / y def ecuacion_diferencial_a(): # Define the grid for the direction field X, Y = np.meshgrid(np.arange(-5, 5.5, 0.5), np.arange(-5, 5.5, 0.5)) dX = np.ones_like(X) dY = -X / Y # Create the direction field plt.figure() plt.quiver(X, Y, dX, dY, color='b') # Initial conditions x0 = 1 y0 = 4 # Solve the ODE forward x_forward = np.linspace(x0, 5, 100) y_forward = odeint(odefun, y0, x_forward) # Solve the ODE backward x_backward = np.linspace(x0, -3, 100) y_backward = odeint(odefun, y0, x_backward) # Plot the solutions plt.plot(x_forward, y_forward, 'r', linewidth=2, label='Solución hacia adelante') plt.plot(x_backward, y_backward, 'r', linewidth=2, label='Solución hacia atrás') # Mark the initial point plt.plot(x0, y0, 'go', markersize=10, markerfacecolor='g') plt.text(x0, y0, ' (1, 4)', verticalalignment='bottom') # Set title and labels plt.title('A) y dy/dx = -x; y(1) = 4') plt.xlabel('x') plt.ylabel('y') plt.grid() plt.axis('equal') plt.legend(loc='best') plt.show() # Run the function ecuacion_diferencial_a() # This code replicates the functionality of the provided MATLAB code by computin # g and visualizing the direction field of the differential equation \(y \frac{d # y}{dx
script.py:29: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information. y_forward = odeint(odefun, y0, x_forward)