【附源码】Python :连续波动的三维模型

系列文章目录

Python 建模学习:绘制一个连续的、波动三维模型



前言

这个动画展示了一个随时间波动的三维曲面。通过调整 update 函数中的参数,我们可以控制波动的频率和振幅。动画的帧率和质量可以通过调整 FuncAnimation 的参数来优化。


一、项目需求

要求通过python代码,创建一个动态的三维波动模型,并使用 matplotlib 的动画功能来展示这个波动效果。


二、代码具体分析

1.导入必要的库:

代码如下:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation

分析如下:

numpy:用于数值计算。
matplotlib.pyplot:用于绘图。
mpl_toolkits.mplot3d:提供了三维绘图的支持。
matplotlib.animation:提供了动画功能。

2.初始化图形和3D子图:

代码如下:

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

分析如下:

创建一个新的图形窗口。
添加一个三维子图。

3.准备数据:

代码如下:

x = np.linspace(-3.0, 3.0, 100)
y = np.linspace(-3.0, 3.0, 100)
X, Y = np.meshgrid(x, y)

分析如下:

使用 np.linspace 创建 x 和 y 轴的值,范围从 -3.03.0,共 100 个点。
使用 np.meshgrid 创建二维网格。

4.定义更新函数:

代码如下:

def update(frame):
    # 计算新的Z值,创建波动效果
    Z = np.sin(X + frame * 5) * np.cos(Y + frame * 5)

    # 清除当前的图形
    ax.clear()

    # 重新绘制曲面
    surf = ax.plot_surface(X, Y, Z, cmap='viridis', rstride=5, cstride=5)

    # 设置坐标轴标签
    ax.set_xlabel('X axis')
    ax.set_ylabel('Y axis')
    ax.set_zlabel('Z axis')

    # 设置坐标轴的范围
    ax.set_xlim(-5, 5)
    ax.set_ylim(-5, 5)
    ax.set_zlim(-5, 5)

    return surf,

分析如下:

update 函数是动画的每一帧调用的函数。
计算新的 Z 值,使用正弦和余弦函数创建波动效果,frame * 5 用于控制波动的速度。
使用 ax.clear() 清除上一帧的图形。
使用 ax.plot_surface 重新绘制曲面,cmap='viridis' 设置颜色映射,rstride=5 和 cstride=5 控制网格的粗糙度。
设置坐标轴的标签和范围。

5.创建动画:

代码如下:

ani = FuncAnimation(fig, update, frames=np.linspace(0, 4 * np.pi, 250),
init_func=lambda: update(0), blit=False)

分析如下:

使用 FuncAnimation 创建动画。
fig 是图形对象。
update 是更新函数。
frames=np.linspace(0, 4 * np.pi, 250) 定义了动画的帧数和帧间隔,这里从 04 * np.pi,共 250 帧。
init_func=lambda: update(0) 定义了动画开始时的初始化函数。
blit=False 表示每次更新都会重绘整个场景。如果设置为 True,可以提高动画的性能,但需要一个合适的环境来支持。

6.显示动画:

代码如下:

plt.show()

分析如下:

使用 plt.show() 显示动画。

三、源代码

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation


# 初始化图形和3D子图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 准备数据
x = np.linspace(-3.0, 3.0, 100)
y = np.linspace(-3.0, 3.0, 100)
X, Y = np.meshgrid(x, y)


# 更新函数
def update(frame):
    # 计算新的Z值,创建波动效果
    Z = np.sin(X + frame * 5) * np.cos(Y + frame * 5)

    # 清除当前的图形
    ax.clear()

    # 重新绘制曲面
    surf = ax.plot_surface(X, Y, Z, cmap='viridis', rstride=5, cstride=5)

    # 设置坐标轴标签
    ax.set_xlabel('X axis')
    ax.set_ylabel('Y axis')
    ax.set_zlabel('Z axis')

    # 可以在这里设置其他轴参数,例如轴的范围
    ax.set_xlim(-5, 5)
    ax.set_ylim(-5, 5)
    ax.set_zlim(-5, 5)

    return surf,


# 创建动画
ani = FuncAnimation(fig, update, frames=np.linspace(0, 4 * np.pi, 250),
                    init_func=lambda: update(0), blit=False)

# 显示动画
plt.show()

总结

这段代码通过动态更新三维曲面的 Z 值来模拟波动效果,使用 matplotlib 的动画功能来实现连续的动态展示。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃饭团的饭桶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值