es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error, intentando graficar una solución de una Ecuación Diferencial de Segundo Orden usando el Método de Euler.

Estoy realizando un proyecto en el que quiero usar el Método de Euler para mostrar una solución a esta ecuación diferencial de segundo orden:

0=y”+y’+9.81y

Así que comencé cambiando la ecuación de segundo orden en un sistema de ecuaciones de primer orden:

y’=u, u’=f(t,y,u)

Con condición inicial:

y(0)=180, u(0)=0

Por lo tanto, obtengo dos ecuaciones al final:

y[n + 1] = y[n] + u[n] * (t[n + 1] – t[n]), u[n + 1] = u[n] + f(u[0], y[n], t[0]) * (t[n + 1] – t[n])

Este es mi código:

import numpy as np
import matplotlib.pyplot as plt

def odeEuler(f, y0, u0, t):
    y = np.zeros(len(t))
    u = np.zeros(len(t))
    y[0] = y0
    u[0] = u0
    for n in range(0, len(t) - 1):
        y[n + 1] = y[n] + u[n] * (t[n + 1] - t[n])
        u[n + 1] = u[n] + f(u[0], y[n], t[0]) * (t[n + 1] - t[n])
    return y, u

t = np.linspace(0, 100)
y0 = 180
u0 = 0
f = lambda u, y, t: -9.81 * y - u
y = odeEuler(f, y0, u0, t)

plt.plot(t, y, 'b.-')
plt.legend(['Euler'])
plt.axis([0, 100, 0, 200])
plt.grid(True)
plt.show()

Sin embargo, al ejecutar el código, me da el siguiente error:


Traceback (most recent call last):
File “/Users/huangy15/PycharmProjects/Draft/Damped Driven Pendulum/Praying this works.py”, line 22, in
plt.plot(t, y, ‘b.-‘)
File “/Users/huangy15/PycharmProjects/Draft/Damped Driven Pendulum/venv/lib/python3.7/site-packages/matplotlib/pyplot.py”, line 3021, in plot
**({“data”: data} if data is not None else {}), **kwargs)
File “/Users/huangy15/PycharmProjects/Draft/Damped Driven Pendulum/venv/lib/python3.7/site-packages/matplotlib/axes/_axes.py”, line 1605, in plot
lines = [*self._get_lines(*args, data=data, **kwargs)]
File “/Users/huangy15/PycharmProjects/Draft/Damped Driven Pendulum/venv/lib/python3.7/site-packages/matplotlib/axes/_base.py”, line 315, in __call__
yield from self._plot_args(this, kwargs)
File “/Users/huangy15/PycharmProjects/Draft/Damped Driven Pendulum/venv/lib/python3.7/site-packages/matplotlib/axes/_base.py”, line 501, in _plot_args
raise ValueError(f”x and y must have same first dimension, but ”
ValueError: x and y must have same first dimension, but have shapes (50,) and (2, 50)

¿Alguien puede ayudarme a verificar si mi idea funciona y, si no lo hace, qué otros enfoques puedo tomar? ¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que la función odeEuler está devolviendo dos arreglos y y u, que tienen forma (len(t),). Sin embargo, al llamar plt.plot(t, y, 'b.-'), t y y deben tener la misma forma, lo cual no es el caso aquí.

    Para solucionar esto, puedes modificar la función odeEuler para que devuelva un arreglo bidimensional de forma (len(t), 2), donde la primera columna corresponda a y y la segunda columna corresponda a u. Luego, puedes modificar el código de trazado de la siguiente manera:

    y, u = odeEuler(f, y0, u0, t)
    plt.plot(t, y[:, 0], 'b.-')
    plt.legend(['Euler'])
    plt.axis([0, 100, 0, 200])
    plt.grid(True)
    plt.show()
    

    Aquí, y[:, 0] selecciona la primera columna del arreglo y, que contiene los valores de y en cada paso de tiempo.

    Con estas modificaciones, el código debería ejecutarse sin errores y producir un gráfico de la solución a la ecuación diferencial de segundo orden utilizando el método de Euler.

Comments are closed.