gpt4 book ai didi

Python - 动画波动方程的数值解

转载 作者:太空狗 更新时间:2023-10-30 02:59:35 26 4
gpt4 key购买 nike

我正在尝试为波动方程的解制作动画 - 我正在绘制应力和位移对 x 的图,但我希望它随时间演变。

认为一个解决方案是将每个位置 x 视为单个“粒子”,然后让该粒子服从定义 y 的函数,并在 t 中对其进行动画处理?但是,我所看到的实现此方法的唯一方法似乎有点过于蛮力,导致代码庞大,而这些代码本应简短易行。

我打算扩展此代码以允许 mu 和 rho 成为依赖于位置的变量而不是常量,但现在我只想让动画正常工作。

代码:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

# Definition of parameters
dt = 0.04
t = np.arange(0.0,40,dt)
x = np.linspace(0, 15, 1000) # x position
Y0 = np.array([0,10]) # initial conditions
mu = 1.5
rho = 1.2
omega = 1
def dY_dx(Y, t=0):
""" Return the gradient of y1 and y2"""
return np.array([Y[1] / mu, - (omega ** 2) * rho * Y[0]])

from scipy import integrate

Y = integrate.odeint(dY_dx, Y0, x)

y1, y2 = Y.T

# set up the figure, the axis, and the plot element we want to animate
fig = plt.figure()
ax = fig.add_subplot(111, autoscale_on=False, xlim=(0,15), ylim=(-10,10))
ax.grid()

line1, = ax.plot([], [], 'o', ms=2)
line2, = ax.plot([], [], '-', lw=2)
time_template = 'time = %.lfs'
time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes)

# initialisation function: plot the background of each frame
def init():
line1.set_data([], [])
line2.set_data([], [])
time_text.set_text('')
return line1, line2, time_text

# animation function: this is called sequentially
def animate(i):

line1.set_data(x, y1)
line2.set_data(x, y2)

time_text.set_text(time_template%(i*dt))
return line1, line2, time_text

# call the animator. blit=True means only re-draw the parts that have changed
ani = animation.FuncAnimation(fig, animate, np.arange(1, len(Y)), interval=25, blit=True, init_func=init)

#ani.save('waveEquation.mp4', fps=15)
plt.show()

我试过:

# animation function: this is called sequentially
def animate(i):

line1.set_data(x[i], y1[i])

# animation function: this is called sequentially
def animate(i):

line1.set_data(x, y1[i])

但都没有给出我想要的结果。

问题可能是我在绘制之前将我的解决方案集成到 t 上,然后不将 t 作为变量包含在我的动画中吗?

我知道我可以使用代码(在此处的类似问题上找到):

def animate(i):
thisx = x
thisy = np.sin(2 * np.pi * (x - 0.01 * i))

line1.set_data(thisx, thisy)

为正弦波设置动画,但我不想使用解析解来计算 y,我想用数字来计算(用于以后的问题)。

最佳答案

康纳B,

你问:

Could the issue be that I am integrating my solutions over t before they are plotted, and then not including t as a variable in my animation?

是的,这正是您的问题。 animate 定义应该包括 t 的更新,然后——大概——应该需要重新集成和重新计算要绘制的线,y1y2。如果不了解一般问题领域,就很难确切地知道您希望情节显示什么,但是您的 animate 函数应该如下所示:

def animate(i):
t = np.arange(0.0,40,dt) + i*dt
Y = integrate.odeint(dY_dx,Y0,t)
y1,y2 = Y.T

line1.set_data(x, y1)
line2.set_data(x, y2)

time_text.set_text(time_template%t)
return line1, line2, time_text

此外,由于调用 array 而不是 np.array 和一些错误的空格,您的代码也不会运行。我清理了它,等待同行评审。

关于Python - 动画波动方程的数值解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31322124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com