【问题标题】:Error, trying to plot a graph of solution to a Second Order ODE using Euler Method错误,尝试使用欧拉方法绘制二阶 ODE 的解图
【发布时间】:2022-01-17 10:15:44
【问题描述】:

我正在做一个项目,我想使用欧拉方法来展示这个二阶差分方程的解决方案 0=y''+y'+9.81y

所以我首先将二阶方程转换为一阶方程组 y'=u, u'=f(t,y,u)

有初始条件 y(0)=180, u(0)=0

所以我最后得到了两个等式 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])

这是我的代码

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()

但是,当我运行代码时,它给了我错误

Traceback (most recent call last):
  File "/Users/huangy15/PycharmProjects/Draft/Damped Driven Pendulum/Praying this works.py", line 22, in <module>
    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)

谁能帮我检查我的想法是否可行,如果不行,我可以采取哪些其他方法?谢谢!

【问题讨论】:

  • 欧拉步骤中应该没有索引0,只有n

标签: python numpy matplotlib math ode


【解决方案1】:

您的 odeEuler 函数返回两个变量:yu,您只需选择其中一个进行绘图。

将函数的输出存储在两个不同的变量中将解决问题:

y, u = odeEuler(f, y0, u0, t)

【讨论】:

  • 我搞定了,谢谢你的帮助!
猜你喜欢
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多